Próbuję utworzyć punkty (nowa warstwa) w określonej odległości wzdłuż drogi (istniejąca warstwa) w QGIS. Tworzenie regularnych punktów co metr na poziomie hrabstwa za pomocą ArcGIS Desktop? daje rozwiązanie dla ArcGIS. Jak to osiągnąć w QGIS? Dodawanie punktów do warstwy wektorów punktowych za pomocą QGIS? wyjaśnia, jak tworzyć punkty, ale nie robi nic z odległości.
(Zastosowałem proponowane rozwiązania z różnymi miarami długości, ponieważ nie znałem konwersji) Rozwiązanie @ Nathans działało do pewnego stopnia, dostałem ...
. Tutaj rzut tych równo odległych punktów różni się od pierwotnej linii.
Mam sugestię @ underdark
gdzie punkty nie wydają się być w równej odległości. Wydaje mi się, że w obu przypadkach występuje problem z projekcją, którego nie rozumiem.
import locate
linię więcej niż raz. Po prostu zadzwoń raz, a będziesz mógł dzwonićlocate.pointsAlongLine(30)
tyle, ile potrzebujeszOdpowiedzi:
Uwaga: dostępna jest teraz wtyczka QGIS
QChainage
. Robi to wszystko i jeszcze więcej. Poniższy kod jest nieaktualny w przypadku QGIS 2.0 i nowszych wersji.Oto kod Pythona, który możesz umieścić w pliku i użyć w QGIS:
QGIS ma w sobie metodę API do wykonywania odwołań do liniowej, jednak nie mogłem go poprawnie uruchomić, ale skontaktuję się z autorem kodu i sprawdzę, czy zrobiłem coś złego.
Na razie będziesz potrzebować zgrabnej biblioteki Pythona, którą i tak powinieneś zainstalować, ponieważ dobrze jest mieć ją przy sobie. Ma również świetną dokumentację na stronie http://toblerity.github.com/shapely/manual.html
To jest sekcja, której używam w poniższym przykładzie http://toblerity.github.com/shapely/manual.html#interoperation .
Większość następującego kodu to prosty kod QGIS, który po prostu tworzy funkcje, warstwy, konwertuje z wkb i wkt iz powrotem. Bit rdzenia to taki,
point = line.interpolate(currentdistance)
który zwraca punkt w pewnej odległości wzdłuż linii. Po prostu owijamy to w pętlę, dopóki nie zabraknie linii.Skopiuj i wklej powyższy kod do pliku, nazwałem mój locate.py, w
~./qgis/python
katalogu (ponieważ znajduje się on w ścieżce Pythona) i po prostu zrób to w konsoli Pythona w QGIS.Spowoduje to utworzenie nowej warstwy punktowej z punktami co 30 metrów wzdłuż wybranych linii:
Uwaga: kod jest dość zgrubny i może wymagać trochę czyszczenia.
EDYCJA: Ostatnia wersja QGIS może teraz robić to natywnie.
Zmień pętlę while
createPointsAt
na:i możesz usunąć
źródło
locate
i korzystania z niego, ale nadal nie dostałem równo odległych punktów. Ponadto jestem neofitą w Pythonie, więc nie zrozumiałem, gdzie uruchomić kod (1) python w katalogu qgis lub (2), że w C: \ Python27 \?C:\Users\{you user name}\.qgis\python
a następnie uruchom ponownie QGIS, jeśli jest otwarty, i przejdź do `Plugins-> Python Console. Load a line layer, select a line a call
import locate` ilocate.pointsAlongLine(30)
Możesz użyć narzędzia QGIS GRASS plugin v.to.points do tworzenia punktów wzdłuż linii w regularnych odstępach czasu
źródło
CRS of Original Shape file, the line = EPSG:26915 - NAD83 / UTM zone 15N, CRS of Grass line vector obtained using v.in.ogr = EPSG:4269 - NAD83, CRS of Grass points vector obtained using v.to.points = EPSG:4326 - WGS 84
Jeśli chcesz narysować pikietaż w ustalonych odstępach wzdłuż linii drogi, możesz użyć do tego wtyczki „Profil z linii”. Potrzebujesz DEM pod warstwą linii drogi, ale procedura jest szybka i bardzo prosta. Nacięcie.
źródło
Uwaga: model danych Shapely (Python) / GEOS (C ++) jest zdefiniowany w płaszczyźnie. Więc jeśli twoje punkty składają się z pozycji GPS (szerokość, długość), użycie tej
shapely.geometry.LineString.interpolate(distance)
metody wyświetli pozycję GPS w odległości euklidesowej wzdłuż podanejLineString
.Shapely's
interpolate()
jest oparty nageos::linearref::LengthIndexedLine
klasie GEOS przy użyciu tejextractPoint
metody.Podobno jednakowa interpolacja w płaszczyźnie szerokość-długość geograficzna jest wystarczająca do zastosowań uwzględniających stosunkowo małe odległości. Zasadniczo należy jednak wziąć pod uwagę odległość na kuli dla aplikacji GIS (zgodnie z definicją w WGS84 ).
Mogę wymyślić dwa obejścia za pomocą modułu Shapely:
LineString
wszystkie właściwości mają podane punkty i krzywe interpolowane liniowo wzdłuż nich. Być może możesz napisać element, który uzyskuje dostęp do interpolowanych krzywych i zaimplementować następującą całkę liniową, zastępując odległość euklidesową. Podoba mi się to podejście, ponieważ stosując ciągłą krzywą fragmentaryczną pożądane punkty można uzyskać, obliczając przecięcia sąsiednich okręgów wzdłuż krzywej z promieniemr = radian_measure(arc_length) = arc_length / R
, gdzie R jest równe promieniowi Ziemi w danej pozycji.Aby to osiągnąć, chciałbym odnieść się do następującego pytania StackOverflow, aw szczególności tej odpowiedzi :
źródło
Sextante ma narzędzie, które może Ci pomóc. Sextante można pobrać z repozytorium wtyczek Qgis.
Poszukaj:
„Narzędzia do warstw linii”
„Linie do wyrównanych punktów”
źródło