Страница 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 я и сам могу, мне бы по...ться (С)
Смысл не в пакетной обработке, а в интерактивной. Т.е. юзер ставит точку, и в атрибуты автоматом прописывается инфа из подлежащих слоёв, например из слоя регионов и/или росреестра например