Creazione di punti nella distanza specificata lungo la linea usando QGIS?


20

Voglio usare QGIS creando punti lungo la linea, ma a una distanza specificata. Ho trovato due strumenti GRASS in SEXTANTE Toolbox :

  • v.to.points
  • v.segment

Ho provato v.to.points , impostando la distanza massima tra i punti nelle unità della mappa su 100 e ho ottenuto questo :

punti lungo la linea

sguardo ravvicinato

La seconda foto mostrava uno sguardo ravvicinato da quello superiore. Il risultato è stato quello che voglio, ma voglio ottenere meno punti , ma anche se ho impostato la distanza massima su 1000 o 1000000, il risultato è stato lo stesso.

Ho provato a utilizzare v.segment , ma non avevo file contenenti regole di segmento.

Underdark mi ha dato alcuni consigli e ho provato le geometrie di Densify a un intervallo . Prima mi ha dato un file di forma polilinea uguale a quello che ho inserito, quindi ho usato i nodi di estrazione per cercare di ottenere quei punti. Ma il risultato è stato lo stesso che ho ottenuto usando i punti v.to. , indipendentemente da ciò che ho impostato l'intervallo di distanza.

Come posso creare punti lungo la linea e nella distanza specificata?



Grazie per avermi dato questo utile consiglio! Se voglio usare il tuo script, devo installare Python? o nella nuova versione QGIS 2.0, ha già questa funzione integrata?
Heinz,

5
C'è un plugin per questo ora in QGIS 2.0, chiamato QChainage. Scarica il plug-in e installalo.
Willy,

Si noti che la casella degli strumenti "Sextante" è chiamata "Elaborazione" in QGIS 2.2.0+ e le geometrie Densify assegnate a un intervallo "si trovano nel menu ProcessingToolbox / QGISGeoalgorithms / VectorGeometryTools. Notare che ciò denota la geometria e non rimuove i vertici che sono più vicini dell'intervallo scelto.
Dave X

Questo ha funzionato per me: plugins.qgis.org/plugins/LocatePoints
Tactopoda

Risposte:


20

Nella console di Python:

1) crea una classe di livello di memoria (classe completa (senza attributi) su 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) funzioni di algebra vettoriale (da 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) direzione coseni

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

4) linea di processo o segmenti di linea

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

risultati

polilinea, punto equidistante con Shapely o PyQGIS2, con direzione dei coseni

polylineformosovector_algebra

Quindi basta regolare l'intervallo


Osservando la giunzione, sembra che mantenga i punti del nodo preesistenti sulla linea, quindi non può assottigliarli a una risoluzione inferiore ai vertici già presenti sulla linea. Con linee complicate e curve come nel PO, queste procedure potrebbero non avere molto effetto.
Dave X,

puoi adattare perfettamente la sceneggiatura.
gene

17

Ora c'è un plugin chiamato QChainage che fa esattamente quello che vuoi. Si specifica una distanza di intervallo e il plug-in crea punti lungo la linea all'intervallo specificato.


* Nota che questo non catturerà i tuoi nodi di linea, quindi se ne hai bisogno dovrai anche usare lo strumento Geometria - estrai nodi e aggiungi ai tuoi punti di concatenamento.
Jason,

1
Benvenuti in GIS SE! Penso che le informazioni che hai aggiunto qui come commento siano meglio incorporate nella tua risposta effettiva usando il pulsante di modifica sotto di essa. Puoi farlo con una copia / incolla e cancellare il tuo commento facendo clic sulla crocetta accanto ad esso.
PolyGeo

11

Ho scritto una sceneggiatura che cambia lo strumento di geometria Densify Sextante per accettare una certa distanza. Si chiama Densify Geometry dato un intervallo .

Dopo aver eseguito Densify, è possibile estrarre i punti utilizzando lo strumento Estrai nodi .

Puoi scaricarlo da Github e le istruzioni di installazione sono sul mio blog .

inserisci qui la descrizione dell'immagine


Sembra che questo strumento sia ora disponibile in QGIS senza l'installazione di Sextante (QGIS 2.18.7). Non l'ho visto nei menu, ma l'ho trovato come un geoalgoritmo QGIS durante la ricerca nella Casella degli strumenti di elaborazione.
Nate Wanner,

0

Se non vuoi andare in giro con gli script Python, puoi semplicemente installare e utilizzare il plug-in "Profilo dalla linea" e ignorare / eliminare la colonna del valore raster. La catena sarà qualunque sia l'impostazione dell'intervallo di campionamento.


In QGIS 2.2.0, vedo uno strumento "Profilo", "qProf" e "VoGIS-ProfilTool", ma non uno strumento "Profilo da linea".
Dave X,

0

Beh, non sono sicuro se questo è nella versione stabile, ma nella casella degli strumenti sestante su 1.9 alpha in Geoalgorithims-> Vector è l'opzione "Converti linee in punti". Funziona a meraviglia, sii fantastico se ha aggiunto anche un campo per la distanza lungo la linea.

È interessante notare che ha aggiunto il campo NAME dal mio livello vettoriale.

Ho provato a far funzionare Python Script di Nathan Woodrow, ma faccio schifo con Python. E con il codice in generale sembra.


0

Ho trascorso molto tempo alle prese con questo problema, ma alla fine ho ottenuto più o meno quello che stavo cercando usando QChainage. Quello che vorrei condividere è qualcosa che può aiutare gli altri. Quando si utilizza lo strumento di dissoluzione geoprocessing SAGA sulla linea, QChainage produce risultati errati. L'uso di un altro strumento di dissolvenza fa sì che funzioni correttamente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.