У меня есть два векторных слоя, один из которых представляет собой точечный слой, основанный на «событиях» с помощью дистанционного зондирования, а второй - линейный слой из локальных исследований.
В моем случае это землетрясения и тектонические разломы, но я думаю, что можно просто выбрать «автомобильные аварии и дороги» в качестве общего примера.
Поэтому я хотел бы переместить / скопировать точки в ближайшую точку линий, если они находятся в пределах допустимого расстояния (скажем, 1-2 км или 0,0xx °), с новым слоем точек (+ attr перемещено г / л).
Есть идеи ?
Linux, QGIS 1.8
Ответы:
Выложил фрагмент кода (протестированный в консоли Python), который делает ниже
Изменить: только что обнаружил, что метод @radouxju с использованием closestSegmentWithContext дает те же результаты в меньшем количестве строк кода. Интересно, почему они придумали это странное имя метода? должно было быть что-то вроде closestPointOnGeometry.
Таким образом, мы можем избежать стройной и делать, как,
источник
вот псевдокод для начала. Я надеюсь, что это поможет и что у кого-то будет время предоставить полный код (у меня нет в настоящее время)
Первое, что нужно сделать, это зациклить точку и выбрать линии, которые находятся в пределах порогового расстояния до каждой точки. Это можно сделать с помощью QgsSpatialIndex
В первом цикле, второе, что нужно сделать, это зациклить выбранные линии и найти ближайшую точку на линии. Это можно сделать напрямую на основе QgsGeometry :: closestSegmentWithContext
третий шаг (в первом цикле) будет состоять в обновлении геометрии точки с геометрией minDistPoint с наименьшим расстоянием
обновить с некоторым кодом (на QGIS3)
источник