QGIS-Extraktknoten mit M-Werten für die lineare Referenzierung


10

Ich habe eine MultiLineStringZM-Ebene in einer SQLite-Datenbank und versuche, die Kennzahlen oder m-Werte an den Scheitelpunkten zu visualisieren. Ich habe versucht, Informationen dazu in QGIS nachzuschlagen, und alles, was ich sammeln konnte, ist, dass dies nicht direkt von der Linestring-Ebene aus möglich ist und dass die Punkte in eine separate Ebene extrahiert werden müssen.

Ich habe Vector-> Geometry Tools-> verwendet Extract nodes, um eine Mehrpunktebene zu erstellen, die die Scheitelpunkte meiner Mehrzeilenebene darstellt, aber der Prozess verliert die m-Werte der Scheitelpunkte. Ich brauche die m-Werte, die erhalten bleiben, indem ich entweder den m-Wert als Attribut des Punktes speichere oder etwas anderes?

Intern haben wir ein Befehlszeilen-Tool, das Linestrings in ein Punkt-Shapefile konvertiert, wobei die m-Werte als Attribut für jeden Punkt gespeichert sind. Damit habe ich überprüft, ob den Scheitelpunkten m-Werte zugewiesen sind, und ich könnte sie verwenden das, wenn ich muss, aber wenn möglich, wäre es schön, wenn dies direkt in QGIS geschehen könnte.

BEARBEITEN - Wiederholen Sie das, was ich oben gesagt habe, aber betonen Sie erneut die Tatsache, dass wir ein Befehlszeilentool haben, mit dem die von mir gesuchten Ergebnisse erzielt werden können. Dabei werden die GDAL-Bibliotheken verwendet, sodass eine Lösung nur eine teilweise Antwort in zeigt PyQGIS ist nicht die Antwort, die ich suche. Ich suche ein eingebautes Tool, ein für QGIS erstelltes Plugin oder ein vollständiges Skript, das m-Werte aus einer MultiLineStringZM- oder LineStringZM-Geometrie extrahieren (nicht erstellen / generieren) und visualisieren kann.


Sie können das LRS-Plugin verwenden, um die m-Werte abzurufen. Sie müssten die Knoten extrahieren und dann die Kennzahlen mithilfe des LRS-Plugins oder des Abstands entlang der Linienwerkzeuge aus dem Linestring abrufen.
jbalk

@jbalk Ich habe die LRS- und QChainage-Plugins ausprobiert, und beide Plugins scheinen so eingerichtet zu sein, dass sie in regelmäßigen Abständen Kennzahlen generieren, nicht für die Verwendung vorhandener Kennzahlen, es sei denn, ich vermisse etwas und verwende die Plugins nur falsch .
TJ Rockefeller

Auf der Seite des LRS-Plugins: - Das Plugin unterstützt die Kalibrierung, die Erstellung pünktlicher und linearer Ereignisse und die Berechnung von Punktmaßen. - Hier ist die Website blazek.github.io/lrs Stellen Sie eine Frage zum LRS-Plugin auf dieser Website, wenn Sie können finde es nicht heraus.
jbalk

Es sieht so aus, als könnten Sie mit dem LRS-Plugin nichts tun, bis Sie es kalibriert haben. Um es zu kalibrieren, benötigen Sie eine Punktebene mit Kennzahlen, die als Attribut gespeichert sind. Genau das versuche ich von meinem MultiLineStringZM zu erhalten Daher denke ich nicht, dass es in dieser Situation hilfreich sein wird.
TJ Rockefeller

Sie können alle 1000 m entlang Ihrer Linie Punkte erstellen, die für die Kalibrierung verwendet werden. Oder sehen Sie sich die Entfernung entlang der Linienwerkzeuge in den Toolboxen SAGA und GRASS in QGIS an, um die m-Werte zu erhalten.
jbalk

Antworten:


6

Soweit ich weiß, scheint es für diese genaue Situation keine existierende Lösung zu geben, aber ich wollte dies dennoch in QGIS tun können, also habe ich den Sprung in Python-Skripte gewagt.

Eine Anleitung zum Schreiben von Verarbeitungsalgorithmen finden Sie hier https://docs.qgis.org/2.18/en/docs/user_manual/processing/scripts.html

Um diesen Code zu verwenden, öffnen Sie die Toolbox "Verarbeitung", erweitern Sie "Skripte" und anschließend "Extras". Wählen Sie "Neues Skript erstellen" und kopieren Sie den folgenden Code und fügen Sie ihn in das Skriptfenster ein (seien Sie vorsichtig beim Kopieren und Einfügen von Python-Code, da Leerzeichen syntaktisch von Bedeutung sind. Wenn Sie Probleme haben, fügen Sie den Code in einen Texteditor ein, der Leerzeichen anzeigt, und stellen Sie sicher dass es richtig kopiert wurde). Speichern Sie es, wo immer Sie möchten, und oben im Fenster befindet sich eine Schaltfläche zum Ausführen eines Skripts. Nachdem Sie es gespeichert haben, können Sie "Skript aus Datei hinzufügen" und das Skript dauerhaft unter "Benutzerskripte" haben.

Wenn das Verarbeitungsfenster geöffnet wird, wählen Sie die Ebene aus, die die Vektorgeometrie enthält, und wählen Sie Ausführen aus. Das Skript verhält sich genauso wie "Knoten extrahieren", außer dass es eine Spalte mit dem Namen MValuesund oder ZValuesabhängig davon, was in der Eingabegeometrie verfügbar ist , hinzufügt .

##input_layer=vector
##output_layer=output vector

from qgis.core import QgsWKBTypes, QgsField, QgsVectorFileWriter, QgsFeature, QgsGeometry
from PyQt4.QtCore import QVariant

def addVertices( geometry, writer, inFeature ):
    coordinateSequence = geometry.coordinateSequence()
    for rings in coordinateSequence:
        for points in rings:
            for point in points:
                feature = QgsFeature( fields )
                feature.setGeometry( QgsGeometry( point ) )
                type = point.wkbType()
                attributes = inFeature.attributes()
                if QgsWKBTypes.hasM( type ):
                    attributes.append( point.m() )
                if QgsWKBTypes.hasZ( type ):
                    attributes.append(point.z())
                feature.setAttributes( attributes )
                writer.addFeature( feature )
    return

inlayer = processing.getObject( input_layer )
provider = inlayer.dataProvider()
fields = provider.fields()
geomType = QgsWKBTypes.Type(inlayer.wkbType())
outputGeomType = QgsWKBTypes.Point

if QgsWKBTypes.hasM( geomType ):
    outputGeomType = QgsWKBTypes.addM( outputGeomType )
    fields.append( QgsField( "MValue", QVariant.Double ) )

if QgsWKBTypes.hasZ( geomType ):
    outputGeomType = QgsWKBTypes.addZ( outputGeomType )
    fields.append( QgsField( "ZValue", QVariant.Double ) )

layer_options = 'SHPT=' + QgsWKBTypes.displayString(outputGeomType)
writer = QgsVectorFileWriter( output_layer, 'UTF-8', fields,  outputGeomType , inlayer.crs(), layerOptions=[layer_options] )

features = inlayer.getFeatures()
featureCount = inlayer.featureCount()
featureIndex = 0

for f in features:
    percent = ( featureIndex/float( featureCount ) ) * 100
    progress.setPercentage( percent )
    g = f.geometry().geometry()
    addVertices( g, writer, f )
    featureIndex +=1

del writer

4

Mit QGIS 3.0 oder neuer ist diese Aufgabe trivial. Suchen Sie in der "Processing Toolbox" (Öffnen mit Strg + Alt + T oder Processing -> Toolbox) nach "Extract Vertices" und führen Sie diesen Algorithmus aus.

Wählen Sie Ihre M- oder ZM-Linien- oder Polygongeometrie als Eingabeebene aus und führen Sie sie aus.

Die Eckpunkte werden mit intakten M- und Z-Werten extrahiert, je nachdem, was in der ursprünglichen Geometrie enthalten ist.

Wenn der M-Wert als Feld in der Attributtabelle benötigt wird, kann der Feldrechner mit einem Ausdruck wie verwendet werden m($geometry)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.