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

Вопросы по свободной ГИС QGIS. Сообщения об ошибках, предложения по улучшению, локализация.
Аватара пользователя
Natalia Novoselova
Гуру
Сообщения: 2568
Зарегистрирован: 15 янв 2013, 20:14
Репутация: 36
Ваше звание: /

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

Сообщение Natalia Novoselova » 14 сен 2017, 01:42

Вообще, задача редуцировалась до вороса Как в QGIS провести выделение множества полигональных объектов темы А – одним полигоном темы В?


Нет ли еще какого-то способа это сделать? Технически - должно работать с Spatial Query. Но с моими объемами данных числа лесных фрагментов - QGIS делает это страшно медленно. 20 мин - 1%. И сейчас вообще завис. :cry: Короче - нельзя так.

Если бы режде разбивать по адм. районам, то объема данных было бы меньше для выделения. Но это вручную никак. :| :cry:

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

Аватара пользователя
Natalia Novoselova
Гуру
Сообщения: 2568
Зарегистрирован: 15 янв 2013, 20:14
Репутация: 36
Ваше звание: /

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

Сообщение Natalia Novoselova » 14 сен 2017, 03:36

По алгоритму через Spatial Query - добила, т.е. что мне надо - могу сделать. Но это противный ручной труд :( , т.е. - не то решение, которое нужно.

Может быть еще таки есть менее памятеёмкие плагины чтобы выполнить выделение множества полигональных объектов темы А – одним полигоном темы В?

trir
Гуру
Сообщения: 2946
Зарегистрирован: 09 апр 2010, 19:30
Статьи: 1
Репутация: 462
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir » 14 сен 2017, 07:39

Но с моими объемами данных числа лесных фрагментов - QGIS делает это страшно медленно. 20 мин - 1%.
даже любопытно стало, а можно данные посмотреть? Как они в БД себя повидут

Аватара пользователя
Natalia Novoselova
Гуру
Сообщения: 2568
Зарегистрирован: 15 янв 2013, 20:14
Репутация: 36
Ваше звание: /

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

Сообщение Natalia Novoselova » 14 сен 2017, 08:53

trir писал(а):
14 сен 2017, 07:39
даже любопытно стало, а можно данные посмотреть? Как они в БД себя повидут
Попробуйте. Может быть, дело и в мощности компа – сейчас я на ноуте, но его хватало раньше.
По ссылке
https://drive.google.com/file/d/0B6TJ2V ... sp=sharing

P1_AtlanForests_epsg4326.shp - четвертая часть данных фрагментов леса.
И Two_Braz_States.shp – 2 штата, которые приходятся на них.
Для них я пока только и вырезала. Тормозит жутко, сначала вручную максимально удаляю объекты из темы фрагментов. Потом вроде выделяет.
Но как... если долго зависает на 1% - то виснет. Если прорывается через 1%, то медленно доходит до конца. Но при большом объеме – не создает виртуальный слой. Однако делает выделение нужных фрагментов – и я его сохраняю в нужный шейп. А если не обрезать тему фрагментов, то и к процентам не переходит - сразу виснет.

Главная цель по всем данным (которые могу все прислать) это разбить все фрагменты на отдельные темы. Где 1 тема фрагментов – 1 штат.
Внутри плагина Spatial Query я использую в настройке «Where the feature» - "Intersect" (выделяет все фрагменты, которые находятся внутри штата и которые пересекают границы штата). А не Overlaps (как сказала сначала в описании алгоритма).



Почему тормозит? Да потому что в этой четверти – 68787 фрагментов! А всего их в 4-х файлах – 317 233! :shock:
Триста семнадцать тысяч – это число фрагментов, на которые сейчас разделен биом Атлантический лес.. Поле с рисом на карте.. Мой главный интерес – самые крупные фрагменты (в этой теме их немного, в основном, они в 3х других). Вот их надо спасать и от них вести восстановление и сохранение биома для будущих поколений.

Если у вас получится вдруг более оптимальный способ – с SQL запросом, я готова или прислать все данные, или по вашему алгоритму разобраться и сделать (для меня это наилучший способ обучения новой технике – просто делать сразу свои задачи)

trir
Гуру
Сообщения: 2946
Зарегистрирован: 09 апр 2010, 19:30
Статьи: 1
Репутация: 462
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir » 15 сен 2017, 21:02

лечится надо...

Код: Выделить всё

ogr2ogr.exe : ERROR 1: INSERT command for new feature failed. [Microsoft][ODBC SQL Server Driver][SQL Server]Произошла ошибка .NET Framework во время выполнения определя
емой пользователем подпрограммы или агрегатной функции "geometry": 
строка:3 знак:1
+ &$exe --config GDAL_DATA "G:\NextGIS_QGIS\share\gdal" -overwrite -f "MSSQLSpatia ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (ERROR 1: INSERT...ии "geometry": :String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError
 
System.FormatException: 24119: вход Polygon является недопустимым, так как начальная и конечная точки внешнего кольца не совпадают. Начальная и конечная точки каждого ко
льца в многоугольнике должны совпадать.
System.FormatException: 
   в Microsoft.SqlServer.Types.GeometryValidator.ValidatePolygonRing(Int32 iRing, Int32 cPoints, Do
ERROR 1: INSERT command for new feature failed. [Microsoft][ODBC SQL Server Driver][SQL Server]Произошла ошибка .NET Framework во время выполнения определяемой пользоват
елем подпрограммы или агрегатной функции "geometry": 

trir
Гуру
Сообщения: 2946
Зарегистрирован: 09 апр 2010, 19:30
Статьи: 1
Репутация: 462
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir » 16 сен 2017, 17:32

Запрос выполнялся чуть больше часа

Код: Выделить всё

INSERT INTO [AtlanForests].[dbo].[res_tbl] ([oid],[Geom],[ID_por],[ID_1],[NAME_1], ins_time)
SELECT fr.[Oid], fr.[Geom], fr.[ID_por], st.[ID_1], st.[NAME_1], CURRENT_TIMESTAMP
  FROM [AtlanForests].[dbo].[Two_Braz_States] as st RIGHT join 
  (SELECT * FROM [AtlanForests].[dbo].[P1_AtlanForests_epsg4326]) as fr
  on st.[Geom].STIntersects(fr.[Geom]) = 1
В слое P1_AtlanForests_epsg432 почти 4 миллиона точек (3812760)
результат

Аватара пользователя
Natalia Novoselova
Гуру
Сообщения: 2568
Зарегистрирован: 15 янв 2013, 20:14
Репутация: 36
Ваше звание: /

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

Сообщение Natalia Novoselova » 16 сен 2017, 20:32

trir писал(а):
16 сен 2017, 17:32
результат

Скачала результат. Спасибо! Там вижу разделение на 2 штата. Но часть данных - без присвоения имения штата (поле Name пустое). Это ошибка в запросе, или вы пробовали только по двум штатам?

В общем, сейчас не хочу никого загружать еще своей работой. Но по сделанному вами разобраться. Как я поняла, код выше - это код вашего запроса? Или что? Почему "лечится надо...", почему ошибки в коде? Если можно бы привести тот код, по которому вы делали запрос. Чтобы мне попробовать разрбраться на этом примере.

trir писал(а):
16 сен 2017, 17:32
В слое P1_AtlanForests_epsg432 почти 4 миллиона точек (3812760)
результат

В этом слое 68 782 полигонов. Каких 4 млн точек?

trir
Гуру
Сообщения: 2946
Зарегистрирован: 09 апр 2010, 19:30
Статьи: 1
Репутация: 462
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir » 16 сен 2017, 20:59

Но часть данных - без присвоения имения штата (поле Name пустое). Это ошибка в запросе, или вы пробовали только по двум штатам?
ну так вы мне дали границы только двух штатов - по ним и назначил, остальные данные в эти штаты не попали
Почему "лечится надо..."
"вход Polygon является недопустимым, так как начальная и конечная точки внешнего кольца не совпадают. Начальная и конечная точки каждого кольца в многоугольнике должны совпадать."
геометрия в shp'е не соответствует требованиям к геометрии в базе и ogr не может её импортировать и её надо "лечить", но я нашёл прогу для импорта
В этом слое 68 782 полигонов. Каких 4 млн точек?
выполняем запрос:

Код: Выделить всё

SELECT sum([Geom].STNumPoints()) FROM [AtlanForests].[dbo].[P1_AtlanForests_epsg4326]
https://docs.microsoft.com/en-us/sql/t- ... -data-type
и получаем количество точек во всём слое

а запрос:

Код: Выделить всё

SELECT sum([Geom].STNumPoints()) FROM [AtlanForests].[dbo].[Two_Braz_States]
даёт 96863 точек на два полигона - такой объём данных быстро шевелится не будет...

ericsson
Гуру
Сообщения: 3152
Зарегистрирован: 27 июл 2009, 19:26
Репутация: 664
Ваше звание: Вредитель полей

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

Сообщение ericsson » 16 сен 2017, 21:31

Natalia Novoselova писал(а):
16 сен 2017, 20:32
В этом слое 68 782 полигонов. Каких 4 млн точек?
Чтобы получилось четыре миллиона, в каждом полигоне должно быть всего-навсего порядка шестидесяти точек.
И что вообще значит это "Каких ...?" - вы что, больше доверяете своим ощущениям, чем цифрам, которые вам дает человек, на порядок лучше вас владеющий обработкой данных?

Аватара пользователя
Natalia Novoselova
Гуру
Сообщения: 2568
Зарегистрирован: 15 янв 2013, 20:14
Репутация: 36
Ваше звание: /

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

Сообщение Natalia Novoselova » 16 сен 2017, 21:34

trir писал(а):
16 сен 2017, 20:59
ну так вы мне дали границы только двух штатов - по ним и назначил, остальные данные в эти штаты не попали
Точно! Совсем забыла. :D
и получаем количество точек во всём слое
Я не могу понять, как в полигоне могут быть точки.
Это какие-то другие точки, которые применимы при SQL запросах?

Чтобы это понять, нужно найти базовые упражнения - как делать такие запросы в SQL. Вижу по вашему сопровождению, что логика тут сильна отлична от ГИСовской. Точки какие-то в полигонах, "геометрия в shp'е не соответствует требованиям к геометрии в базе и ogr " :oops: :roll:

Аватара пользователя
Natalia Novoselova
Гуру
Сообщения: 2568
Зарегистрирован: 15 янв 2013, 20:14
Репутация: 36
Ваше звание: /

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

Сообщение Natalia Novoselova » 16 сен 2017, 21:35

ericsson писал(а):
16 сен 2017, 21:31
, в каждом полигоне должно быть всего-навсего порядка шестидесяти точек.
И что вообще значит это "Каких ...?" - вы что, больше доверяете своим ощущениям, чем цифрам, которые вам дает человек, на порядок лучше вас владеющий обработкой данных?
Я не понимаю, как точки могут быть в полигоне? Или это узловые точки его контура? Типа в квадрате (неважно какой площади) будет 4 точки? А в круге - 0 точек??

trir
Гуру
Сообщения: 2946
Зарегистрирован: 09 апр 2010, 19:30
Статьи: 1
Репутация: 462
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir » 16 сен 2017, 22:11

Я не понимаю, как точки могут быть в полигоне?
читаем про wkt
полигон с дыркой:
POLYGON ((35 10, 45 45, 15 40, 10 20, 35 10),
(20 30, 35 35, 30 20, 20 30))
точка - 35 10
Вижу по вашему сопровождению, что логика тут сильна отлична от ГИСовской.
чисто ГИС'ская логика, даже я бы сказал геометрическая логика

ericsson
Гуру
Сообщения: 3152
Зарегистрирован: 27 июл 2009, 19:26
Репутация: 664
Ваше звание: Вредитель полей

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

Сообщение ericsson » 16 сен 2017, 22:16

Мда, человек с диссертацией, жертва ArcGIS и собственных выдумок...

Любая геометрия в GIS (в CAD - иначе, там число примитивов больше) состоит из узлов. В окружности узлов, образующих ее контур, может быть хоть миллион - зависит от степени подробности того, как ломаная линия имитирует истинную окружность. Окружности, которые описаны точкой центра и радиусом, в GIS практически не встречаются, встречаются в CAD (софте для инженерной графики и моделирования).

Аватара пользователя
Natalia Novoselova
Гуру
Сообщения: 2568
Зарегистрирован: 15 янв 2013, 20:14
Репутация: 36
Ваше звание: /

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

Сообщение Natalia Novoselova » 17 сен 2017, 00:11

ericsson писал(а):
16 сен 2017, 22:16
Мда, человек с диссертацией, жертва ArcGIS и собственных выдумок...

Любая геометрия в GIS (в CAD - иначе, там число примитивов больше) состоит из узлов. В окружности узлов, образующих ее контур, может быть хоть миллион - зависит от степени подробности того, как ломаная линия имитирует истинную окружность. Окружности, которые описаны точкой центра и радиусом, в GIS практически не встречаются, встречаются в CAD (софте для инженерной графики и моделирования).
Да.. как то не сообразила. Не то что "не знала", но в работе учет точек полигонов не приходилось вести, и выпало из активного мышления. Замкнуло на "point object", который не имеет площади (от этого и странным показалось наличие точек в полигоне). Конечно, да.. полигон должен описываться узлами его границ (точками с координатами), а чем же еще.

Аватара пользователя
Natalia Novoselova
Гуру
Сообщения: 2568
Зарегистрирован: 15 янв 2013, 20:14
Репутация: 36
Ваше звание: /

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

Сообщение Natalia Novoselova » 20 сен 2017, 01:03

trir писал(а):
16 сен 2017, 17:32
В слое P1_AtlanForests_epsg432 почти 4 миллиона точек (3812760)
результат
Сравнила сделанное через Spatial Query, Intersect и по SQL запросу.
У меня вопрос – вы руками ведь данные не правили? Дело в том, что некоторые полигоны пересекают границы штата. И у меня (при использовании «Intersect» в Spatial Query) они присвоились сразу двум штатам. То есть надо править вручную (оставляя в том штате, где большая площадь) или так и оставлять. А в вашем примере – сразу полигоны остались в том штате, в котором они занимают наибольшую площадь. По крайней мере, так вышло по нескольким просмотренным примерам.
Это вы достигли путем формулы запроса ?

Неоднозначная штука. Так, если полигон занимает в двух штатах примерно равную площадь, его логичней и оставить в двух штатах (для моего анализа по штатам). Но где в одном штате он проходит по границе, а в другом – его основная площадь, то из первого его лучше исключать. И вот интересно, это вы так тонко смогли сделать запрос, или вручную правили?

Ответить

Вернуться в «QGIS»