Mam dwie warstwy wektorowe, z których jedna jest warstwą punktową opartą na „zdarzeniach” za pomocą teledetekcji, a druga to warstwa liniowa z lokalnych badań.
W moim przypadku są to trzęsienia ziemi i wady tektoniczne, ale wydaje mi się, że można po prostu wybrać „wypadki samochodowe i drogi” jako ogólny przykład.
Chciałbym więc przenieść / skopiować punkty na najbliższy punkt linii, o ile mieści się w odległości tolerancji (powiedzmy 1-2 km lub 0.0xx °), z nową warstwą punktową (przesunięcie + attr t / n).
Jakieś pomysły ?
Linux, QGIS 1.8
Odpowiedzi:
Wysłałem fragment kodu (przetestowany w konsoli Pythona), który spełnia poniższe wymagania
Edycja: Właśnie odkryłem, że metoda @radouxju przy użyciu closestSegmentWithContext daje te same wyniki w mniejszej liczbie wierszy kodu. Zastanawiam się, dlaczego wymyślili tę dziwną nazwę metody? powinien być czymś w rodzaju najbliższejPointOnGeometry.
Abyśmy mogli uniknąć zgrabnych i robić to,
źródło
tutaj jest pseudo-kod na początek. Mam nadzieję, że to pomoże i że ktoś będzie miał czas na dostarczenie pełnego kodu (obecnie nie mam)
pierwszą rzeczą do zrobienia jest zapętlenie punktu i wybranie linii, które znajdują się w odległości progowej do każdego punktu. Można to zrobić za pomocą QgsSpatialIndex
W ramach pierwszej pętli drugą rzeczą jest zapętlenie wybranych linii i znalezienie najbliższego punktu na linii. Można to zrobić bezpośrednio w oparciu o QgsGeometry :: closestSegmentWithContext
trzeci krok (w ramach pierwszej pętli) polegałby na zaktualizowaniu geometrii punktu o geometrię minDistPoint o najmniejszej odległości
aktualizacja z pewnym kodem (na QGIS3)
źródło