Tworzenie punktów w określonej odległości wzdłuż linii za pomocą QGIS?


20

Chcę używać QGIS do tworzenia punktów wzdłuż linii, ale w określonej odległości. W SEXTANTE Toolbox znalazłem dwa narzędzia GRASS :

  • v.to. punkty
  • v.segment

Próbowałem v.to. punktów , ustawiając maksymalną odległość między punktami w jednostkach mapy na 100 i otrzymałem to :

punkty wzdłuż linii

bliskie spojrzenie

Drugie zdjęcie pokazało dokładne spojrzenie z górnego. Rezultat był tym, czego chcę, ale chcę uzyskać mniej punktów , ale nawet ustawiłem maksymalną odległość na 1000 lub 1000000, wynik był taki sam.

Próbowałem użyć v.segment , ale nie miałem pliku zawierającego reguły segmentów.

Podmrok dał mi kilka rad i spróbowałem geometrii Densify z pewnym odstępem czasu . Najpierw dał mi plik kształtu polilinii taki sam, jak na wejściu, a następnie użyłem ekstraktów z węzłów, aby spróbować uzyskać te punkty. Ale wynik był taki sam, jak w przypadku punktów v.to. , bez względu na to, co ustawiłem interwał odległości.

Jak mogę tworzyć punkty wzdłuż linii i w określonej odległości?


4
Spójrz na to, daj nam znać nathanw.net/2012/08/05/…
Willy

Dzięki za udzielenie mi tej pomocnej porady! Jeśli chcę użyć twojego skryptu, czy muszę zainstalować Pythona? czy w nowej wersji QGIS 2.0, czy ma już wbudowaną tę funkcję?
Heinz

5
W QGIS 2.0 dostępna jest teraz wtyczka o nazwie QChainage. Pobierz wtyczkę i zainstaluj ją.
Willy,

Zauważ, że zestaw narzędzi „Sextante” nazywa się „Przetwarzanie” w QGIS 2.2.0+, a geometrie Densify z określonym interwałem ”znajdują się w menu ProcessingToolbox / QGISGeoalgorithms / VectorGeometryTools. Uwaga: oznacza to geometrię i nie usuwa wierzchołków które są bliżej niż wybrany przedział
Dave X

Odpowiedzi:


20

W konsoli Python:

1) Utwórz klasę warstwy pamięci (klasa pełna (bez atrybutów) na crea_mem_layer.py )

class Create_vlayer(object):
    '''creation of a virtual layer''' 
     def __init__(self,nom,type):
         self.type=type
         self.name = nom
         self.layer =  QgsVectorLayer(self.type, self.name , "memory")
         self.pr =self.layer.dataProvider() 
     def create_point(self,geometry):
         # add point to the layer
         self.seg = QgsFeature()
         self.seg.setGeometry(QgsGeometry.fromPoint(geometry))
         self.pr.addFeatures([self.seg])
         self.layer.updateExtents()
     @property
     def display_layer(self):
         #end of layer and display layer 
         QgsMapLayerRegistry.instance().addMapLayers([self.couche])

2) funkcje algebry wektorowej (z algèbre_vect_PyQGIS.py )

import math 
def mag(point):
    # magnitude of a vector
    return math.sqrt(point.x()**2 + point.y()**2)
def diff(point2, point1):
    # substraction betwen two vector
    return QgsPoint(point2.x()-point1.x(), point2.y() - point1.y())
def length(point1,point2):
    # with PyQGIS: sqrDist
    return math.sqrt(point1.sqrDist(point2))

3) kierunek cosinus

def dircos(point):
    cosa = point.x() / mag(point)
    cosb = point.y()/ mag(point)
    return cosa,cosb

4) linia procesowa lub odcinki linii

def pairs(list):
    # list pairs iteration 
    for i in range(1, len(list)):
    yield list[i-1], list[i]

layer = qgis.utils.iface.activeLayer()
# interval between points
interval = 5 m
# create virtual layer
gen_pt  = Create_vlayer("mid5", "Point")

for elem in layer():
    line = elem.geometry()
    for seg_start, seg_end in pairs(line.asPolyline()):
       line_start = QgsPoint(seg_start)
       line_end = QgsPoint(seg_end)
       # mid point = vector coordinates [x2-x1,y2-y1]
       pointm =diff(line_end, line_start)
       # direction cosines of the segment
       cosa,cosb = dircos(pointm)
       # length of the segment
       lg = length(line_end, line_start)
       # generate and add points to the virtual layer 
       for i in range(interval,lg,interval):
           gen_pt.create_point(QgsPoint(line_start.x()  + (i * cosa), line_start.y() + (i*cosb)))

# display layer
gen_pt.display_layer

Wyniki

polilinia, punkt w równej odległości z Shapely lub PyQGIS2, z cosinusami kierunku

poliliniakształtnywektor_algebra

Następnie dostosuj interwał


Patrząc na skrzyżowanie, wygląda na to, że utrzymuje wcześniej istniejące punkty węzła na linii, więc nie może ich rozrzedzić do rozdzielczości mniejszej niż wierzchołki już na linii. Przy skomplikowanych, krzywych liniach, jak w PO, procedury te mogą nie mieć większego wpływu.
Dave X

możesz idealnie dostosować skrypt.
gen

17

Jest teraz wtyczka o nazwie QChainage, która robi dokładnie to, co chcesz. Podajesz odległość interwału, a wtyczka tworzy punkty wzdłuż linii w określonym interwale.


* Pamiętaj, że nie uchwyci to twoich węzłów linii, więc jeśli będziesz ich potrzebować, będziesz także musiał użyć narzędzia geometrii - wyodrębnij węzły i dołącz do punktów pikietażu.
Jason

1
Witamy w GIS SE! Myślę, że informacje, które dodałeś tutaj jako komentarz, lepiej by zostały uwzględnione w twojej rzeczywistej odpowiedzi, używając przycisku edycji poniżej. Możesz to zrobić za pomocą opcji Kopiuj / Wklej i usuń swój komentarz, klikając mały krzyżyk obok niego.
PolyGeo

11

Napisałem skrypt, który zmienia narzędzie geometrii Sextante Densify na akceptowanie pewnej odległości. Nazywa się to geometriami Densify z określonym interwałem .

Po uruchomieniu Densify możesz wyodrębnić punkty za pomocą narzędzia Wyodrębnij węzły .

Możesz go pobrać z Github, a instrukcje instalacji znajdują się na moim blogu .

wprowadź opis zdjęcia tutaj


Wygląda na to, że to narzędzie jest teraz dostępne w QGIS bez instalacji Sextante (QGIS 2.18.7). Nie widziałem go w menu, ale znalazłem go jako geo-algorytm QGIS podczas wyszukiwania w przyborniku przetwarzania.
Nate Wanner

0

Jeśli nie chcesz korzystać ze skryptów Pythona, możesz po prostu zainstalować wtyczkę „Profil z linii” i użyć jej oraz zignorować / usunąć kolumnę wartości rastrowej. Pikietaż będzie taki, jak ustawiony interwał próbkowania.


W QGIS 2.2.0 widzę „Narzędzie profilowe”, „qProf” i „VoGIS-ProfilTool”, ale nie narzędzie „Profil z linii”.
Dave X

0

Nie jestem pewien, czy jest to wersja stabilna, ale w przyborniku sextante na wersji 1.9 alfa pod Geoalgorytmami-> Wektor jest opcja „Konwertuj linie na punkty”. Działa przysmak, bądź świetny, jeśli dodał również pole do odległości wzdłuż linii.

Ciekawe, że dodał pole NAME z mojej warstwy wektorowej.

Próbowałem uruchomić ten skrypt Pythona autorstwa Nathana Woodrowa, ale mam do czynienia z Pythonem. I wydaje się, że z kodem w ogóle.


0

Długo walczyłem z tym problemem, ale w końcu dostałem mniej więcej to, czego szukałem za pomocą QChainage. Chciałbym się podzielić tym, co może pomóc innym. Podczas korzystania z narzędzia do rozpuszczania geoprzetwarzania SAGA na linii, QChainage generuje nieprawidłowe wyniki. Użycie innego narzędzia do rozpuszczania powoduje jego prawidłowe działanie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.