Ближайшие объекты
- zubenko1592
- Активный участник
- Сообщения: 164
- Зарегистрирован: 23 апр 2011, 10:18
- Репутация: -1
Ближайшие объекты
Здравствуйте!
Появилась необходимости перейти на qgis.
До этого работал в Арке.
Столкнулся с рядом проблем.
Была стандартная задача:
есть точечный слой и линейный.
точки в точечном слое расположены в доль полилиний с минимальными смещениями.
нужно получить для каждой из точек FID ближайшей полилинии, координаты ближайшего места на полилинии и ближайшее расстояние до полилинии.
В арке это не вызывало абсолютно никаких проблем. Делалось все чуть ли не в 2 клика...
Но в Qgis... в панели анализа такой функци я не нашел. максимально похожее что я нашел в Q - это v.distance в grass.
работает она ужасно...:
1) у меня структура каталогов (сложилась за долгие года работы) имеет в названиях кирилицу... пути с кирилицей сразу ошибка... попробовал создать в корне диска папку с названием латиницей.Вродебы ошибка исчезла, но...
2) в журнале хода выполнения начали появляться милион других ошибок...
3) делается все ооооочнь долго. около 400 точек обрабатывалось минут 20...
4) по итогу v.distance выдал список ОТДЕЛЬНЫХ шейпов для каждой из точек. При этом выдал ошибку их создания.... он для каждой точки стоздает свой слой?????
5) в самой опции v.distance нужно выбирать соответсвующее количество полей 'upload'. Без этого функция вообще не запускается...
По итогу потратил кучу времени, танцев с бубном и ничего в результате не получилось....
Как решать эту задачу в Qшке?? не уже-ли она на стольно топорная??
Появилась необходимости перейти на qgis.
До этого работал в Арке.
Столкнулся с рядом проблем.
Была стандартная задача:
есть точечный слой и линейный.
точки в точечном слое расположены в доль полилиний с минимальными смещениями.
нужно получить для каждой из точек FID ближайшей полилинии, координаты ближайшего места на полилинии и ближайшее расстояние до полилинии.
В арке это не вызывало абсолютно никаких проблем. Делалось все чуть ли не в 2 клика...
Но в Qgis... в панели анализа такой функци я не нашел. максимально похожее что я нашел в Q - это v.distance в grass.
работает она ужасно...:
1) у меня структура каталогов (сложилась за долгие года работы) имеет в названиях кирилицу... пути с кирилицей сразу ошибка... попробовал создать в корне диска папку с названием латиницей.Вродебы ошибка исчезла, но...
2) в журнале хода выполнения начали появляться милион других ошибок...
3) делается все ооооочнь долго. около 400 точек обрабатывалось минут 20...
4) по итогу v.distance выдал список ОТДЕЛЬНЫХ шейпов для каждой из точек. При этом выдал ошибку их создания.... он для каждой точки стоздает свой слой?????
5) в самой опции v.distance нужно выбирать соответсвующее количество полей 'upload'. Без этого функция вообще не запускается...
По итогу потратил кучу времени, танцев с бубном и ничего в результате не получилось....
Как решать эту задачу в Qшке?? не уже-ли она на стольно топорная??
- zubenko1592
- Активный участник
- Сообщения: 164
- Зарегистрирован: 23 апр 2011, 10:18
- Репутация: -1
Re: Ближайшие объекты
нашел модуль NNJoin
он быстро и без проблем выдает расстояния до ближайших объектов. только не выдает ближайшие координаты ближайшего объекта. а это тоже нужно
Поэтому проблема решилась только частично.
Есть ли полное решение?
он быстро и без проблем выдает расстояния до ближайших объектов. только не выдает ближайшие координаты ближайшего объекта. а это тоже нужно
Поэтому проблема решилась только частично.
Есть ли полное решение?
-
- Завсегдатай
- Сообщения: 316
- Зарегистрирован: 24 мар 2022, 05:54
- Репутация: 137
- Ваше звание: хм, сам не знал
- Откуда: Томск
Re: Ближайшие объекты
Давайте по шагам двигаться.
Ваш слой точек, открываете таблицу атрибутов, и в ней ищете кнопку "Калькулятор полей".
Этот метод работает в текущем слое, без создания его новых реплик, что бывает удобно.
Итак, в калькуляторе полей пишите выражение:
to_int( array_to_string( overlay_nearest( 'ваш_слой_с_линиями', id_l)))
где overlay_nearest вернет значение поля id_L ближайшего к текущей точке линейного объекта в слое 'ваш_слой_с_линиями' в виде массива, array_to_string - преобразует массив в текст, а to_int - попробует преобразовать текст в целое число.
Там же, в диалоге, говорите "Новое поле" (как вариант - Обновить существующее), даете ему название, тип. После Ок в таблице точек появится новое поле, в котором Id_L ближайшего линейного объекта у всех (или выбранных) записей.
-
- Завсегдатай
- Сообщения: 316
- Зарегистрирован: 24 мар 2022, 05:54
- Репутация: 137
- Ваше звание: хм, сам не знал
- Откуда: Томск
Re: Ближайшие объекты
Похожим образом, в другие поля можно собрать инфу о дистанциях и координатах. Здесь времени пока нет посмотреть, как, попробуйте сами, например покопайте функции shortest_line(geometry1,geometry2), distance(geometry1,geometry2), closest_point(geometry1,geometry2).
Последний раз редактировалось AlexRomantsov 06 окт 2022, 13:23, всего редактировалось 1 раз.
-
- Завсегдатай
- Сообщения: 316
- Зарегистрирован: 24 мар 2022, 05:54
- Репутация: 137
- Ваше звание: хм, сам не знал
- Откуда: Томск
Re: Ближайшие объекты
Подобные выражения также прикручиваются к Формам полей (Свойства слоя), для целей автоматизированного заполнения атрибутов из значений других объектов, например при создании новой точки можно сразу подставить в нужное поле ID (или Name, любое поле) из ближайшей к точке линии.
- zubenko1592
- Активный участник
- Сообщения: 164
- Зарегистрирован: 23 апр 2011, 10:18
- Репутация: -1
Re: Ближайшие объекты
работает!AlexRomantsov писал(а): ↑06 окт 2022, 12:46to_int( array_to_string( overlay_nearest( 'ваш_слой_с_линиями', id_l)))
-
- Завсегдатай
- Сообщения: 316
- Зарегистрирован: 24 мар 2022, 05:54
- Репутация: 137
- Ваше звание: хм, сам не знал
- Откуда: Томск
Re: Ближайшие объекты
Отлично. Теперь следующий шаг. Также, Таблица атрибутов точечного слоя, Калькулятор полей, Новое поле, в выражении ищем кратчайшую дистанцию от текущей точки до ближайшего линейного объекта в другом слое:
Дистанция до ближнего:
distance( $geometry, geometry( get_feature( 'ваш_слой_с_линиями', 'id_l', "id_Line" ) ) )
где distance - собственно функция, в которой
$geometry - очередной (в таблице) точечный объект,
geometry( get_feature - функция получения геометрии объекта из другого слоя при условии что id_l другого слоя равен найденному выше значению из поля (в точках) id_Line
Или в сочетании с предыдущим запросом, при котором не используем ранее найденный в таблицу Id линии:
distance( $geometry, geometry( get_feature( 'ваш_слой_с_линиями', 'id_l', to_int( array_to_string( overlay_nearest( 'ваш_слой_с_линиями', id_l))) )))
где to_int( array_to_string( overlay_nearest из предыдущего примера.
Внимание! Полученные значения дистанций зависят от настроек эллипсоида для вычисления расстояний. Проверьте Меню - Проект - Свойства, вкладка Общие, Измерения, Элдипсоид для вычислений. Корректно WGS84 (EPSG:7030), иногда Krassowsky.
Дистанция до ближнего:
distance( $geometry, geometry( get_feature( 'ваш_слой_с_линиями', 'id_l', "id_Line" ) ) )
где distance - собственно функция, в которой
$geometry - очередной (в таблице) точечный объект,
geometry( get_feature - функция получения геометрии объекта из другого слоя при условии что id_l другого слоя равен найденному выше значению из поля (в точках) id_Line
Или в сочетании с предыдущим запросом, при котором не используем ранее найденный в таблицу Id линии:
distance( $geometry, geometry( get_feature( 'ваш_слой_с_линиями', 'id_l', to_int( array_to_string( overlay_nearest( 'ваш_слой_с_линиями', id_l))) )))
где to_int( array_to_string( overlay_nearest из предыдущего примера.
Внимание! Полученные значения дистанций зависят от настроек эллипсоида для вычисления расстояний. Проверьте Меню - Проект - Свойства, вкладка Общие, Измерения, Элдипсоид для вычислений. Корректно WGS84 (EPSG:7030), иногда Krassowsky.
Последний раз редактировалось AlexRomantsov 07 окт 2022, 07:04, всего редактировалось 3 раза.
-
- Завсегдатай
- Сообщения: 316
- Зарегистрирован: 24 мар 2022, 05:54
- Репутация: 137
- Ваше звание: хм, сам не знал
- Откуда: Томск
Re: Ближайшие объекты
Ну и последнее, третье желание :
Координаты в каком виде вы хотели бы получить? В WKT, типа текста Point(123.456, 789.123)? Или отдельно x, отдельно y? Нужен ли пересчет в другие СК?
- zubenko1592
- Активный участник
- Сообщения: 164
- Зарегистрирован: 23 апр 2011, 10:18
- Репутация: -1
Re: Ближайшие объекты
Желательно в 2х разных столбцах X и Y. В текущей СК проекта.AlexRomantsov писал(а): ↑07 окт 2022, 06:31Координаты в каком виде вы хотели бы получить? В WKT, типа текста Point(123.456, 789.123)? Или отдельно x, отдельно y? Нужен ли пересчет в другие СК?
-
- Завсегдатай
- Сообщения: 316
- Зарегистрирован: 24 мар 2022, 05:54
- Репутация: 137
- Ваше звание: хм, сам не знал
- Откуда: Томск
Re: Ближайшие объекты
Ок, немного изменим предыдущее выражение.
Также, таблица атрибутов, калькулятор полей, новое поле Х (real), выражение:
x(closest_point( geometry( get_feature( 'ваш_слой_с_линиями', 'id_l', to_int( array_to_string( overlay_nearest( 'ваш_слой_с_линиями', id_l))) )),$geometry) )
где х - функция, извлекающая X координату из:
closest_point - функции, возвращающей точку геометрии 1, ближайшую к геометрии 2
остальные параметры в теме выше...
Повторить выражение для координаты y.
Также, таблица атрибутов, калькулятор полей, новое поле Х (real), выражение:
x(closest_point( geometry( get_feature( 'ваш_слой_с_линиями', 'id_l', to_int( array_to_string( overlay_nearest( 'ваш_слой_с_линиями', id_l))) )),$geometry) )
где х - функция, извлекающая X координату из:
closest_point - функции, возвращающей точку геометрии 1, ближайшую к геометрии 2
остальные параметры в теме выше...
Повторить выражение для координаты y.
Последний раз редактировалось AlexRomantsov 14 окт 2022, 09:29, всего редактировалось 2 раза.
-
- Завсегдатай
- Сообщения: 316
- Зарегистрирован: 24 мар 2022, 05:54
- Репутация: 137
- Ваше звание: хм, сам не знал
- Откуда: Томск
Re: Ближайшие объекты
При необходимости, в случае если системы координат каждого из слоев и карты разные, а xy надо получить в одной из них или вообще в четвертой, добавьте в нужные места выражения функцию
transform(geometry, идентификатор исходной СК, идентификатор целевой СК),
например так transform($geometry, 'EPSG:4326', 'USER:100017')
transform(geometry, идентификатор исходной СК, идентификатор целевой СК),
например так transform($geometry, 'EPSG:4326', 'USER:100017')
-
- Завсегдатай
- Сообщения: 316
- Зарегистрирован: 24 мар 2022, 05:54
- Репутация: 137
- Ваше звание: хм, сам не знал
- Откуда: Томск
Re: Ближайшие объекты
И в завершении, если такие операции повседневны, можно добавить в таблицу или в карточку атрибутов кнопку с нужным действием. Настраивается в Свойствах слоя - Действия. Но для этого нужны какие то представления о Питоне.
Лайт вариант - добавить выражение в Пользовательские, тогда всегда будет под рукой шаблон.
Лайт вариант - добавить выражение в Пользовательские, тогда всегда будет под рукой шаблон.
- Эдуард Казаков
- Гуру
- Сообщения: 546
- Зарегистрирован: 23 апр 2014, 17:11
- Репутация: 532
- Откуда: Planet Earth
- Контактная информация:
Re: Ближайшие объекты
Есть ещё модуль Closest Points
В нём инструмент "Find closest point for each feature". Результат - новый точечный слой ближайших точек на самой линии, в атрибутах айдишники исходных объектов и расстояние. Координаты извлекаются в калькуляторе полей или инструментом "add geometry attributes", и вместе с расстояниями присоединяются к исходным точкам через панель связи в свойствах слоя
В нём инструмент "Find closest point for each feature". Результат - новый точечный слой ближайших точек на самой линии, в атрибутах айдишники исходных объектов и расстояние. Координаты извлекаются в калькуляторе полей или инструментом "add geometry attributes", и вместе с расстояниями присоединяются к исходным точкам через панель связи в свойствах слоя
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 38 гостей