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

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

Добавлено: 13 мар 2019, 13:57
AKOS
Всем привет

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

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

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

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

Добавлено: 13 мар 2019, 14:04
trir
можно сделать через триггеры

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

Добавлено: 13 мар 2019, 16:23
AKOS
А можно подробнее, если не затруднит, с примером ?

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

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

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

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

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

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

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

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

Добавлено: 13 мар 2019, 20:15
trir
1. Загрузить в БД
2. Написать триггер

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

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

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

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

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

Добавлено: 15 мар 2019, 14:47
Vedmed
Смешно, знаю как решить эту проблему с помощью 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 и связываем со слоем исходных точек в свойствах слоя через связи по начальным названиям точек.
Задача решена. Вроде как. Хотя громоздко и совершенно неизящно. Увы, не умею в питон.

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

Добавлено: 19 мар 2019, 12:23
AKOS
в Excel я и сам могу, мне бы по...ться (С)

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