QGIS Estrai nodi con valori M per riferimenti lineari


10

Ho un livello MultiLineStringZM in un database sqlite e sto cercando di visualizzare le misure o i valori m sui vertici. Ho provato a cercare informazioni su come eseguire questa operazione in QGIS e tutto ciò che sono stato in grado di raccogliere è che ciò non è possibile direttamente dal livello di linestring e che i punti devono essere estratti in un livello separato.

Ho usato Vector-> Geometry Tools-> Extract nodesper creare un livello multipunto che rappresenta i vertici del mio livello multlinestring, ma il processo perde i valori m dei vertici. Ho bisogno dei valori m conservati salvando il valore m come attributo del punto o qualcos'altro?

Internamente abbiamo uno strumento da riga di comando che converte le stringhe di linea in un shapefile punto con i valori m memorizzati come attributo su ciascun punto, e l'ho usato per verificare che ci siano valori m assegnati ai vertici, e potrei usare che se devo, ma se possibile sarebbe bello se questo potesse essere fatto direttamente all'interno di QGIS.

EDIT - Ripetendo ciò che ho detto sopra, ma ribadendo il fatto che abbiamo uno strumento da riga di comando in grado di ottenere i risultati che sto cercando che utilizza le librerie GDAL, quindi una soluzione che mostra solo una risposta parziale in PyQGIS non è la risposta che sto cercando. Sto cercando uno strumento integrato, un plug-in pronto per QGIS o uno script completo in grado di estrarre (non creare / generare) e visualizzare valori m da una geometria MultiLineStringZM o LineStringZM.


È possibile utilizzare il plug-in LRS per ottenere i valori m. Dovresti estrarre i nodi, quindi ottenere le misure dal linestring usando il plug-in LRS o la distanza lungo gli strumenti di linea.
jbalk

@jbalk Ho provato i plug-in LRS e QChainage ed entrambi i plug-in sembrano essere configurati per generare misure a intervalli regolari, non per l'utilizzo di misure esistenti, a meno che non mi manchi qualcosa e sto semplicemente usando i plugin in modo errato .
TJ Rockefeller,

Dalla pagina del plug-in LRS: - Il plug-in supporta la calibrazione, la creazione di eventi puntuali e lineari e il calcolo delle misure per i punti - Ecco il sito Web blazek.github.io/lrs Se è possibile porre una domanda sul plug-in LRS su questo sito, se è possibile non capirlo.
jbalk,

Sembra che non puoi fare nulla con il plug-in LRS fino a quando non lo calibrerai e, per calibrarlo, hai bisogno di un layer punti con misure memorizzate come attributo, che è esattamente quello che sto cercando di ottenere dal mio MultiLineStringZM , quindi non penso che sarà utile in questa situazione.
TJ Rockefeller,

È possibile creare punti ogni 1000 m lungo la linea da utilizzare per la calibrazione. Oppure osserva la distanza lungo gli strumenti di linea nelle caselle degli strumenti SAGA e GRASS all'interno di QGIS per ottenere i valori m.
jbalk

Risposte:


6

Da quello che posso trovare non sembra esserci una soluzione esistente per questa situazione esatta, ma volevo ancora essere in grado di farlo in QGIS, quindi mi sono tuffato nello scripting Python.

Una guida per la scrittura di algoritmi di elaborazione è disponibile qui https://docs.qgis.org/2.18/en/docs/user_manual/processing/scripts.html

Per utilizzare questo codice, apri la casella degli strumenti Elaborazione, quindi espandi Script, quindi espandi Strumenti. Seleziona "Crea nuovo script" e copia e incolla il codice sottostante nella finestra dello script (fai attenzione quando copi e incolli il codice Python poiché lo spazio bianco è sintatticamente significativo. Se hai problemi inserisci il codice in un editor di testo che mostri lo spazio bianco e assicurati che è stato copiato correttamente). Salvalo dove vuoi e c'è un pulsante di esecuzione dello script nella parte superiore della finestra. Dopo averlo salvato puoi "Aggiungi script da file" e avere lo script permanentemente in "Script utente".

Quando viene visualizzata la finestra di elaborazione, selezionare il livello che contiene la geometria vettoriale e selezionare Esegui. Lo script si comporta allo stesso modo di "Estrai nodi", tranne per il fatto che aggiunge una colonna chiamata MValuese o in ZValuesbase a ciò che è disponibile nella geometria di input.

##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

Con QGIS 3.0 o versioni successive questa attività è banale. Nella "Casella degli strumenti di elaborazione" (Apri con ctrl + alt + te Elaborazione -> Casella degli strumenti) cerca "Estrai vertici" ed esegui l'algoritmo.

Seleziona la linea M o ZM o la geometria poligonale come livello di input ed esegui.

I vertici verranno estratti con valori M e Z intatti a seconda di ciò che è nella geometria originale.

Se il valore M è necessario come campo nella tabella degli attributi, è possibile utilizzare il calcolatore di campo con un'espressione simile m($geometry)

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.