Страница 1 из 3

Как в QGIS присвоить к полигону атрибутивные данные из наложенных полигонов?

Добавлено: 13 сен 2017, 06:33
Natalia Novoselova
Можно ли решить такую задачу в QGIS: к полигонам темы “А” присвоить все значения из атрибутивной таблицы полигонов темы ”B”, которые накладываются на полигоны “А” (т.е. если, например) на полигоне А1 размещены два полигона В1 и В2, то атрибутивные данные из полигонов В1 и В2 присваиваются полигону А1.

Хорошо бы найти плагин, который прямо вытаскивает это для полигонов. Есть плагин с похожей задачей «Point sampling tool», но он вытаскивает данные только для точек.
Если нет прямого плагина, то как вообще можно это выполнить ?

На практике задача пока очень проста. Мне нужно к теме фрагментов леса присвоить название административного района и штата, в котором каждый фрагмент находится (2 поля у соотв. полигональной темы).

Re: Как в QGIS присвоить к полигону атрибутивные данные из наложенных полигонов?

Добавлено: 13 сен 2017, 06:46
trir
update A set A.attr = B.attr
from B
where ST_Overlaps(A.geom, B.geom)

Re: Как в QGIS присвоить к полигону атрибутивные данные из наложенных полигонов?

Добавлено: 13 сен 2017, 08:50
Andrey Zhukov
Вообще это называется Spatial join, но задача вида
атрибутивные данные из полигонов В1 и В2 присваиваются полигону А1
в нем (да и в принципе) не решается.
Если в полигон Cn попадают полигоны Ba...Bz, то что должно вообще произойти? Декартово произведение? Это апокалипсис.

Re: Как в QGIS присвоить к полигону атрибутивные данные из наложенных полигонов?

Добавлено: 13 сен 2017, 15:03
Natalia Novoselova
trir писал(а):
13 сен 2017, 06:46
update A set A.attr = B.attr
from B
where ST_Overlaps(A.geom, B.geom)
Что это? Это связано с решением задачи?

Re: Как в QGIS присвоить к полигону атрибутивные данные из наложенных полигонов?

Добавлено: 13 сен 2017, 15:20
Natalia Novoselova
Andrey Zhukov писал(а):
13 сен 2017, 08:50
в нем (да и в принципе) не решается.
Если в полигон Cn попадают полигоны Ba...Bz, то что должно вообще произойти? Декартово произведение? Это апокалипсис.
Мне это видится просто присоединением атрибутивной таблицы. Я присоединяю только 2 полигональных темы - А и В. И вообще нужно присоединить только 1 поле Name (вот, с названиями). Итого, если в полигон А1, A2, A3… попадает от 1 до 3 полигона темы В, то в атрибутивной таблицы темы А должно быть такое (картинка в приложении). То есть, если нет еще присоединенного полигона, Name пишется как Name_1, если уже есть, то в Name_2, Name_3..


Мне кажется, здесь нет нереальной ГИС задачи. Если нельзя прямо решить, то как можно близко подойти? Spatial Join это где в QGIS?

Re: Как в QGIS присвоить к полигону атрибутивные данные из наложенных полигонов?

Добавлено: 13 сен 2017, 15:26
Andrey Zhukov
Волшебной кнопки для этого нет, потому что это не Join, а по сути Pivot отношения M - N. Эта задача к ГИС никакого отношения не имеет, а trir дал правильный вектор: заливайте данные в postgis и пишите sql-скрипты.

Re: Как в QGIS присвоить к полигону атрибутивные данные из наложенных полигонов?

Добавлено: 13 сен 2017, 16:19
Natalia Novoselova
Andrey Zhukov писал(а):
13 сен 2017, 15:26
а trir дал правильный вектор: заливайте данные в postgis и пишите sql-скрипты.
Эх.. так я не умею.. :cry:

Re: Как в QGIS присвоить к полигону атрибутивные данные из наложенных полигонов?

Добавлено: 13 сен 2017, 16:34
Natalia Novoselova
Andrey Zhukov писал(а):
13 сен 2017, 15:26
Волшебной кнопки для этого нет, потому что это не Join, а по сути Pivot отношения M - N. Эта задача к ГИС никакого отношения не имеет, а trir дал правильный вектор: заливайте данные в postgis и пишите sql-скрипты.
Может быть, кто-то смог бы сделать этот скрипт? Не чтобы его просто скопировать. А чтобы при этом мне научиться еще на конкретном примере. Пока для меня это набор страшных слов.. postgis, sql.. :( Как и подойти к задаче - не знаю.
Когда я разбираю конкретные примеры - то осваиваю методы и софты.

Re: Как в QGIS присвоить к полигону атрибутивные данные из наложенных полигонов?

Добавлено: 13 сен 2017, 19:51
trir
Не обязательно использовать PostGIS, на Windows можно использовать MS SQL Server (вместе с SQL Server Management Studio). Сначала надо загрузить данные, можно через GDAL (я использую ogr2gui). Ну а после загрузки можно выполнять sql-запросы - вот так это примерно выглядит

Re: Как в QGIS присвоить к полигону атрибутивные данные из наложенных полигонов?

Добавлено: 13 сен 2017, 19:52
Natalia Novoselova
Кажется нашла ручной способ решения. Если его алгоритмизировать, то будет скрипт. :) Но и этот ручной способ меня пока устраивает – т.к. пока хочу разбить лишь по штатам.Поскольку их немного я могу сделать так. Но вот если делать более мелкое деление, а также дл множества других подобных задач, то описанный ниже алгоритм может быть реально превратить в скрипт? Или найти уже сделанный.
Мне кажется, опция полезная для многих задач.

Даже здесь алгоритм довольно сложный. Запишу всем и себе для памяти.

Br_admdistr_vib1.shp - полигональная тема с Административными штатами. Их д.б. немного. Так как перебирать нужно каждый.
FragmentsTest.shp - полигональная тема лесных фрагментов К КОТОРОЙ нужно присоединить атрибуты из Br_admdistr_vib1.shp
Инсталлируем плагин Spatial Query. Он открывается через Vector в верхней панели.
Выделяем 1 штат в теме Br_admdistr_vib1.

Запускаем плагин Spatial Query. Делаем установки как на картинке.

В верхнем окне "Select source features from" выбираем FragmentsTest
В нижнем окне "Reference features of" выбираем Br_admdistr_vib1 Должно появится «1 selected geometries» - то есть, что выборку он будет делать только по наложению с одним выделенным полигоном темы Br_admdistr_vib1.shp
В Where the feature - ставим Overlaps.. "Intersect" (выделяет все фрагменты, которые находятся внутри штата и которые пересекают границы штата).

В And use the result to – выбираем Create new selection.
После нажатия на Apply в окне справа появляются результаты выборки.

Внизу указано, что 5 of 7 identified (т.е. 5 объектов из темы фрагментов пересекаются с выделенным полигоном-штатом).
Нажимаем на кнопку внизу окна Create layer with list of items и получаем тему FragmentsTest <Overlaps> BR_admdistr_vib1
Всё. Дальше ее пересохраняем, создем поле Name, куда вписываем значение штата в котором находятся фрагменты.Если по условию фрагменты там находится целиком, то нужно для выборки выбрать другую опцию в поле "Where the feature"

Делаем так по каждому штату. И на выходе получаем желаемое – темы лесных фрагментов для каждого штата.

Продолжение по алгоритму: https://gis-lab.info/forum/viewtopic.ph ... 11#p156711

Re: Как в QGIS присвоить к полигону атрибутивные данные из наложенных полигонов?

Добавлено: 13 сен 2017, 20:04
trir
вот лень вам искать плагин на каждый чих, когда достаточно изучить SQL и иметь полный контроль над данными?

Re: Как в QGIS присвоить к полигону атрибутивные данные из наложенных полигонов?

Добавлено: 13 сен 2017, 20:14
Natalia Novoselova
trir писал(а):
13 сен 2017, 20:04
вот лень вам искать плагин на каждый чих, когда достаточно изучить SQL и иметь полный контроль над данными?
Как его изучить? Если у меня почти ноль по базе программирования. Я не против попробовать.

Может быть, вам известны какие-то вводные простые вещи. Мне надо немного, на самом деле, чтобы освоить что-то для возможности начать там работать и развиваться.

Re: Как в QGIS присвоить к полигону атрибутивные данные из наложенных полигонов?

Добавлено: 13 сен 2017, 23:16
trir
Как его изучить?
странный вопрос - берёшь книжку и учишь

Re: Как в QGIS присвоить к полигону атрибутивные данные из наложенных полигонов?

Добавлено: 13 сен 2017, 23:55
ericsson
Угу, странный вопрос. Гугл выдает больше 16 миллионов страниц по ключевым словам SQL Tutorial (с которого надо начинать), 350 тысяч страниц - если добавить еще слово spatial.

Re: Как в QGIS присвоить к полигону атрибутивные данные из наложенных полигонов?

Добавлено: 14 сен 2017, 01:23
Natalia Novoselova
ericsson писал(а):
13 сен 2017, 23:55
Угу, странный вопрос. Гугл выдает больше 16 миллионов страниц по ключевым словам SQL Tutorial (с которого надо начинать), 350 тысяч страниц - если добавить еще слово spatial.
Конечно надо освоить . Даже тот алгоритм выше - в реалии оказался большой работой, т.к. объемы данных по фрагментам очень большие и просто так их полигонами штатов не выделишь.. памяти не хватает (точнее скорости софта? в общем он глючит и надо уменьшать объемы).