Проверка нахождения точки внутри полигона

Вопросы по свободной ГИС QGIS. Сообщения об ошибках, предложения по улучшению, локализация.
Ответить
Аватара пользователя
AKOS
Новоприбывший
Сообщения: 7
Зарегистрирован: 26 фев 2019, 10:51
Репутация: 0
Откуда: Москва

Проверка нахождения точки внутри полигона

Сообщение AKOS » 13 мар 2019, 13:57

Всем привет

Такая вот задачка:
Есть два слоя:
1. полигоны (регионы РФ), с двузначным кодом региона
2. Точки (однородные объекты) с уникальным ID, состоящим из кода региона и порядковым (4-значным номером точки внутри региона). Например, для Москвы: 77-0001

Как сделать так, чтобы при размещении точки на карте сформировать её ID в зависимости от того, в каком регионе она расположена.
Т.е. сначала надо определить регион, в котором размещена точка, затем посчитать кол-во существующих в регионе точек (если есть) и сформировать ID

Помогите пожалуйста, граждане эксперты ?

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

Re: Проверка нахождения точки внутри полигона

Сообщение trir » 13 мар 2019, 14:04

можно сделать через триггеры

Аватара пользователя
AKOS
Новоприбывший
Сообщения: 7
Зарегистрирован: 26 фев 2019, 10:51
Репутация: 0
Откуда: Москва

Re: Проверка нахождения точки внутри полигона

Сообщение AKOS » 13 мар 2019, 16:23

А можно подробнее, если не затруднит, с примером ?

Dmitry Stasev
Участник
Сообщения: 67
Зарегистрирован: 13 мар 2018, 08:59
Репутация: 22
Откуда: MO

Re: Проверка нахождения точки внутри полигона

Сообщение Dmitry Stasev » 13 мар 2019, 17:50

Условие не понял
AKOS писал(а):
13 мар 2019, 13:57
Есть два слоя:
...
2. Точки (однородные объекты) с уникальным ID
Так надо этот ID в составном использовать или же генерировать порядковый номер, относительно региона?
И зачем "считать кол-во существующих в регионе точек"

freeExec
Гуру
Сообщения: 909
Зарегистрирован: 23 апр 2011, 10:32
Проекты: 1
Репутация: 139
Откуда: Ульяновск

Re: Проверка нахождения точки внутри полигона

Сообщение freeExec » 13 мар 2019, 18:07

Dmitry Stasev писал(а):
13 мар 2019, 17:50
И зачем "считать кол-во существующих в регионе точек"
Чтобы выдать номер для нового объекта. Насколько я понял, автору нужен механизм добавления нового.

Аватара пользователя
AKOS
Новоприбывший
Сообщения: 7
Зарегистрирован: 26 фев 2019, 10:51
Репутация: 0
Откуда: Москва

Re: Проверка нахождения точки внутри полигона

Сообщение AKOS » 13 мар 2019, 18:52

ID точки - составной. Первые две цифры - код региона, последние 4 цифры - порядковый номер объекта в регионе.
Да, freeExec абсолютно правильно понял

Аватара пользователя
Эдуард Казаков
Завсегдатай
Сообщения: 432
Зарегистрирован: 23 апр 2014, 17:11
Статьи: 3
Репутация: 415
Откуда: Санкт-Петербург
Контактная информация:

Re: Проверка нахождения точки внутри полигона

Сообщение Эдуард Казаков » 13 мар 2019, 19:35

Я бы сделал через python функцию в качестве значения поля по умолчанию.
Свойства слоя с точками, раздел Attributes form, выбираете поле с ID, в нижней части есть default value, собираете его из выражения, переходите на вкладку Function Editor и создаёте функцию, которая делает нужную работу. Потом эту функцию вызываете собственно в выражении.

Логика функции может быть достаточно простой. Весь код писать не буду, но идея такая:

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

from qgis.core import *
from qgis.gui import *

@qgsfunction(args='auto', group='Custom')
def getid(feature, parent):
    # берём слой с регионами
    regions_layer = QgsProject.instance().mapLayersByName('regions')[0]
    # и с точками
    points_layer = QgsProject.instance().mapLayersByName('points')[0]
    
    # находим тот регион, в который попала наша точка
    parent_region = regions_layer.getFeatures(QgsFeatureRequest().setFilterRect(feature.geometry().boundingBox()))[0]
    # и дальше
    # находим существующие точки, которые попадают в этот регион
    ...
    # получаем список id этих точек через uniqueValues, берём последнее
    ...
    # берём значение id из объекта parent_region 
    ...
    # собираем строку из последнего id точек +1, и id parent_region
    new_id = region_id + new_point_id
    return new_id

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

Re: Проверка нахождения точки внутри полигона

Сообщение trir » 13 мар 2019, 20:15

1. Загрузить в БД
2. Написать триггер

Dmitry Stasev
Участник
Сообщения: 67
Зарегистрирован: 13 мар 2018, 08:59
Репутация: 22
Откуда: MO

Re: Проверка нахождения точки внутри полигона

Сообщение Dmitry Stasev » 14 мар 2019, 08:36

freeExec писал(а):
13 мар 2019, 18:07
Dmitry Stasev писал(а): ↑Вчера, 17:50
И зачем "считать кол-во существующих в регионе точек"
Чтобы выдать номер для нового объекта. Насколько я понял, автору нужен механизм добавления нового.
Не очень хорошая идея для генерации ID.
После удаления имеющегося объекта можно получить "key violation"

Аватара пользователя
AKOS
Новоприбывший
Сообщения: 7
Зарегистрирован: 26 фев 2019, 10:51
Репутация: 0
Откуда: Москва

Re: Проверка нахождения точки внутри полигона

Сообщение AKOS » 14 мар 2019, 17:59

Эдуард Казаков писал(а):
13 мар 2019, 19:35
Я бы сделал через python функцию в качестве значения поля по умолчанию.
Спасибо. Ушёл курить матчасть

Vedmed
Участник
Сообщения: 67
Зарегистрирован: 19 янв 2012, 14:48
Репутация: 6

Re: Проверка нахождения точки внутри полигона

Сообщение Vedmed » 15 мар 2019, 14:47

Смешно, знаю как решить эту проблему с помощью MS Excel или LibreOffice Calc, но понятия не имею как решить только в QGIS.
Если точек меньше миллиона, я бы сделал так:
1. Присвоил точкам атрибуты по местоположению от полигонального слоя регионов (Вектор > Управление данными > Присвоить атрибуты...), тем самым получил бы код региона для каждой точки.
2. Потом, не заморачиваясь, открыл бы dbf таблицу слоя, пересохранил ее, во избежание, в xls или ods.
3. Отсортировал таблицу по коду региона. Если код региона находится в столбце B, а уникальный номер по региону надо поставить в столбце C, тогда в C2 пишем формулу =IF(B2=B1; B1+1; 1). В B1 у нас заголовок столбца, поэтому автоматом ставится 1, ну а остальное дальше уже рассчитывается как надо.
4. В столбце D делаем конкатенацию (CONCATENATE) столбца B и C, хотя этот процесс можно и в QGIS сделать.
5. Сохраняем результат в csv, подгружаем его в QGIS и связываем со слоем исходных точек в свойствах слоя через связи по начальным названиям точек.
Задача решена. Вроде как. Хотя громоздко и совершенно неизящно. Увы, не умею в питон.

Аватара пользователя
AKOS
Новоприбывший
Сообщения: 7
Зарегистрирован: 26 фев 2019, 10:51
Репутация: 0
Откуда: Москва

Re: Проверка нахождения точки внутри полигона

Сообщение AKOS » 19 мар 2019, 12:23

в Excel я и сам могу, мне бы по...ться (С)

Смысл не в пакетной обработке, а в интерактивной. Т.е. юзер ставит точку, и в атрибуты автоматом прописывается инфа из подлежащих слоёв, например из слоя регионов и/или росреестра например

Ответить

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость