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

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

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

Сообщение AKOS »

Всем привет

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

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

Помогите пожалуйста, граждане эксперты ?
trir
Гуру
Сообщения: 5355
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir »

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

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

Сообщение AKOS »

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

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

Сообщение Dmitry Stasev »

Условие не понял
AKOS писал(а): 13 мар 2019, 13:57Есть два слоя:
...
2. Точки (однородные объекты) с уникальным ID
Так надо этот ID в составном использовать или же генерировать порядковый номер, относительно региона?
И зачем "считать кол-во существующих в регионе точек"
freeExec
Гуру
Сообщения: 1195
Зарегистрирован: 23 апр 2011, 10:32
Репутация: 205
Откуда: Ульяновск

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

Сообщение freeExec »

Dmitry Stasev писал(а): 13 мар 2019, 17:50И зачем "считать кол-во существующих в регионе точек"
Чтобы выдать номер для нового объекта. Насколько я понял, автору нужен механизм добавления нового.
Аватара пользователя
AKOS
Новоприбывший
Сообщения: 7
Зарегистрирован: 26 фев 2019, 10:51
Репутация: 0
Откуда: Москва

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

Сообщение AKOS »

ID точки - составной. Первые две цифры - код региона, последние 4 цифры - порядковый номер объекта в регионе.
Да, freeExec абсолютно правильно понял
Аватара пользователя
Эдуард Казаков
Гуру
Сообщения: 549
Зарегистрирован: 23 апр 2014, 17:11
Репутация: 535
Откуда: Planet Earth
Контактная информация:

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

Сообщение Эдуард Казаков »

Я бы сделал через 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
Гуру
Сообщения: 5355
Зарегистрирован: 09 апр 2010, 19:30
Репутация: 1021
Ваше звание: просто мимо прохожу
Откуда: Ё-бург

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

Сообщение trir »

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

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

Сообщение Dmitry Stasev »

freeExec писал(а): 13 мар 2019, 18:07
Dmitry Stasev писал(а): ↑Вчера, 17:50
И зачем "считать кол-во существующих в регионе точек"
Чтобы выдать номер для нового объекта. Насколько я понял, автору нужен механизм добавления нового.
Не очень хорошая идея для генерации ID.
После удаления имеющегося объекта можно получить "key violation"
Аватара пользователя
AKOS
Новоприбывший
Сообщения: 7
Зарегистрирован: 26 фев 2019, 10:51
Репутация: 0
Откуда: Москва

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

Сообщение AKOS »

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

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

Сообщение 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 и связываем со слоем исходных точек в свойствах слоя через связи по начальным названиям точек.
Задача решена. Вроде как. Хотя громоздко и совершенно неизящно. Увы, не умею в питон.
Аватара пользователя
AKOS
Новоприбывший
Сообщения: 7
Зарегистрирован: 26 фев 2019, 10:51
Репутация: 0
Откуда: Москва

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

Сообщение AKOS »

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

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

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

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

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