Проверка нахождения точки внутри полигона
- AKOS
- Новоприбывший
- Сообщения: 7
- Зарегистрирован: 26 фев 2019, 10:51
- Репутация: 0
- Откуда: Москва
Проверка нахождения точки внутри полигона
Всем привет
Такая вот задачка:
Есть два слоя:
1. полигоны (регионы РФ), с двузначным кодом региона
2. Точки (однородные объекты) с уникальным ID, состоящим из кода региона и порядковым (4-значным номером точки внутри региона). Например, для Москвы: 77-0001
Как сделать так, чтобы при размещении точки на карте сформировать её ID в зависимости от того, в каком регионе она расположена.
Т.е. сначала надо определить регион, в котором размещена точка, затем посчитать кол-во существующих в регионе точек (если есть) и сформировать ID
Помогите пожалуйста, граждане эксперты ?
Такая вот задачка:
Есть два слоя:
1. полигоны (регионы РФ), с двузначным кодом региона
2. Точки (однородные объекты) с уникальным ID, состоящим из кода региона и порядковым (4-значным номером точки внутри региона). Например, для Москвы: 77-0001
Как сделать так, чтобы при размещении точки на карте сформировать её ID в зависимости от того, в каком регионе она расположена.
Т.е. сначала надо определить регион, в котором размещена точка, затем посчитать кол-во существующих в регионе точек (если есть) и сформировать ID
Помогите пожалуйста, граждане эксперты ?
-
- Гуру
- Сообщения: 5292
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1015
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Проверка нахождения точки внутри полигона
можно сделать через триггеры
- AKOS
- Новоприбывший
- Сообщения: 7
- Зарегистрирован: 26 фев 2019, 10:51
- Репутация: 0
- Откуда: Москва
Re: Проверка нахождения точки внутри полигона
А можно подробнее, если не затруднит, с примером ?
-
- Участник
- Сообщения: 67
- Зарегистрирован: 13 мар 2018, 08:59
- Репутация: 22
- Откуда: MO
Re: Проверка нахождения точки внутри полигона
Условие не понял
И зачем "считать кол-во существующих в регионе точек"
Так надо этот ID в составном использовать или же генерировать порядковый номер, относительно региона?
И зачем "считать кол-во существующих в регионе точек"
-
- Гуру
- Сообщения: 1195
- Зарегистрирован: 23 апр 2011, 10:32
- Репутация: 205
- Откуда: Ульяновск
Re: Проверка нахождения точки внутри полигона
Чтобы выдать номер для нового объекта. Насколько я понял, автору нужен механизм добавления нового.
- AKOS
- Новоприбывший
- Сообщения: 7
- Зарегистрирован: 26 фев 2019, 10:51
- Репутация: 0
- Откуда: Москва
Re: Проверка нахождения точки внутри полигона
ID точки - составной. Первые две цифры - код региона, последние 4 цифры - порядковый номер объекта в регионе.
Да, freeExec абсолютно правильно понял
Да, freeExec абсолютно правильно понял
- Эдуард Казаков
- Гуру
- Сообщения: 546
- Зарегистрирован: 23 апр 2014, 17:11
- Репутация: 532
- Откуда: Planet Earth
- Контактная информация:
Re: Проверка нахождения точки внутри полигона
Я бы сделал через python функцию в качестве значения поля по умолчанию.
Свойства слоя с точками, раздел Attributes form, выбираете поле с ID, в нижней части есть default value, собираете его из выражения, переходите на вкладку Function Editor и создаёте функцию, которая делает нужную работу. Потом эту функцию вызываете собственно в выражении.
Логика функции может быть достаточно простой. Весь код писать не буду, но идея такая:
Свойства слоя с точками, раздел 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
-
- Гуру
- Сообщения: 5292
- Зарегистрирован: 09 апр 2010, 19:30
- Репутация: 1015
- Ваше звание: просто мимо прохожу
- Откуда: Ё-бург
Re: Проверка нахождения точки внутри полигона
1. Загрузить в БД
2. Написать триггер
2. Написать триггер
-
- Участник
- Сообщения: 67
- Зарегистрирован: 13 мар 2018, 08:59
- Репутация: 22
- Откуда: MO
Re: Проверка нахождения точки внутри полигона
Не очень хорошая идея для генерации ID.freeExec писал(а): ↑13 мар 2019, 18:07Чтобы выдать номер для нового объекта. Насколько я понял, автору нужен механизм добавления нового.Dmitry Stasev писал(а): ↑Вчера, 17:50
И зачем "считать кол-во существующих в регионе точек"
После удаления имеющегося объекта можно получить "key violation"
- AKOS
- Новоприбывший
- Сообщения: 7
- Зарегистрирован: 26 фев 2019, 10:51
- Репутация: 0
- Откуда: Москва
Re: Проверка нахождения точки внутри полигона
Спасибо. Ушёл курить матчастьЭдуард Казаков писал(а): ↑13 мар 2019, 19:35Я бы сделал через python функцию в качестве значения поля по умолчанию.
-
- Участник
- Сообщения: 70
- Зарегистрирован: 19 янв 2012, 14:48
- Репутация: 6
Re: Проверка нахождения точки внутри полигона
Смешно, знаю как решить эту проблему с помощью 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 и связываем со слоем исходных точек в свойствах слоя через связи по начальным названиям точек.
Задача решена. Вроде как. Хотя громоздко и совершенно неизящно. Увы, не умею в питон.
Если точек меньше миллиона, я бы сделал так:
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: Проверка нахождения точки внутри полигона
в Excel я и сам могу, мне бы по...ться (С)
Смысл не в пакетной обработке, а в интерактивной. Т.е. юзер ставит точку, и в атрибуты автоматом прописывается инфа из подлежащих слоёв, например из слоя регионов и/или росреестра например
Смысл не в пакетной обработке, а в интерактивной. Т.е. юзер ставит точку, и в атрибуты автоматом прописывается инфа из подлежащих слоёв, например из слоя регионов и/или росреестра например
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 39 гостей