Nœuds d'extraction QGIS avec valeurs M pour le référencement linéaire

10

J'ai une couche MultiLineStringZM dans une base de données sqlite, et j'essaie de visualiser les mesures ou les valeurs m aux sommets. J'ai essayé de rechercher des informations sur la façon de le faire dans QGIS, et tout ce que j'ai pu recueillir est que cela n'est pas possible directement à partir de la couche linestring et que les points doivent être extraits vers une couche séparée.

J'ai utilisé Vector-> Geometry Tools-> Extract nodespour créer une couche multipoint représentant les sommets de ma couche multi-chaîne, mais le processus perd les valeurs m des sommets. J'ai besoin que les valeurs m soient préservées en enregistrant la valeur m en tant qu'attribut du point, ou autre chose?

En interne, nous avons un outil en ligne de commande qui convertit les chaînes de lignes en un fichier de formes de points avec les valeurs m stockées en tant qu'attribut sur chaque point, et je l'ai utilisé pour vérifier qu'il existe des valeurs m attribuées aux sommets, et je pourrais utiliser que si je dois, mais si possible, ce serait bien si cela pouvait être fait directement à l'intérieur de QGIS.

EDIT - En répétant ce que j'ai dit ci-dessus, mais en soulignant à nouveau le fait que nous avons un outil en ligne de commande qui peut atteindre les résultats que je recherche et qui utilise les bibliothèques GDAL, donc une solution montrant juste une réponse partielle dans PyQGIS n'est pas la réponse que je cherche. Je recherche un outil intégré, un plugin prêt à l'emploi pour QGIS, ou un script complet qui peut extraire (pas créer / générer) et visualiser des valeurs m à partir d'une géométrie MultiLineStringZM ou LineStringZM.

TJ Rockefeller
la source
Vous pouvez utiliser le plugin LRS pour obtenir les valeurs m. Vous devez extraire les nœuds, puis obtenir les mesures de la chaîne de lignes à l'aide du plug-in LRS ou des outils de distance le long de la ligne.
jbalk
@jbalk J'ai essayé les plugins LRS et QChainage, et ces deux plugins semblent être configurés pour générer des mesures à intervalles réguliers, pas pour utiliser des mesures existantes, sauf si je manque quelque chose et que j'utilise les plugins de manière incorrecte .
TJ Rockefeller
Depuis la page du plugin LRS: - Le plugin prend en charge l'étalonnage, la création d'événements ponctuels et linéaires et le calcul de mesures pour les points - Voici le site Web blazek.github.io/lrs Posez une question sur le plugin LRS sur ce site si vous le pouvez pas le comprendre.
jbalk
Il semble que vous ne puissiez rien faire avec le plug-in LRS avant de le calibrer, et pour le calibrer, vous avez besoin d'une couche de points avec des mesures stockées en tant qu'attribut, ce qui est exactement ce que j'essaie d'obtenir de mon MultiLineStringZM , donc je ne pense pas que ce sera utile dans cette situation.
TJ Rockefeller
Vous pouvez créer des points tous les 1000 m le long de votre ligne à utiliser pour l'étalonnage. Ou regardez la distance le long des outils de ligne dans les boîtes à outils SAGA et GRASS dans QGIS pour obtenir les valeurs m.
jbalk

Réponses:

6

D'après ce que je peux trouver, il ne semble pas y avoir de solution existante pour cette situation exacte, mais je voulais toujours pouvoir le faire dans QGIS, alors j'ai franchi le pas dans les scripts python.

Un guide pour l'écriture d'algorithmes de traitement peut être trouvé ici https://docs.qgis.org/2.18/en/docs/user_manual/processing/scripts.html

Pour utiliser ce code, ouvrez la boîte à outils Traitement, puis développez Scripts, puis développez Outils. Sélectionnez "Créer un nouveau script" et copiez et collez le code ci-dessous dans la fenêtre de script (soyez prudent lorsque vous copiez et collez du code python car l'espace blanc est syntaxiquement significatif. Si vous rencontrez des problèmes, placez le code dans un éditeur de texte qui montre l'espace blanc et assurez-vous que qu'il a copié correctement). Enregistrez-le où vous voulez et il y a un bouton d'exécution de script en haut de la fenêtre. Après l'avoir enregistré, vous pouvez "Ajouter un script à partir d'un fichier" et avoir le script en permanence sous "Scripts utilisateur".

Lorsque la fenêtre de traitement apparaît, sélectionnez la couche contenant la géométrie vectorielle et sélectionnez exécuter. Le script se comporte de la même manière que "Extraire les nœuds", sauf qu'il ajoute une colonne appelée MValueset ou ZValuesselon ce qui est disponible dans la géométrie d'entrée.

##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
TJ Rockefeller
la source
4

Avec QGIS 3.0 ou plus récent, cette tâche est triviale. Dans la "Boîte à outils de traitement" (Ouvrir avec ctrl + alt + t ou Traitement -> Boîte à outils), recherchez "Extraire les sommets" et exécutez cet algorithme.

Sélectionnez votre ligne M ou ZM ou votre géométrie de polygone comme calque d'entrée et exécutez.

Les sommets seront extraits avec les valeurs M et Z intactes selon ce qui se trouve dans la géométrie d'origine.

Si la valeur M est nécessaire en tant que champ dans la table attributaire, le calculateur de champ peut être utilisé avec une expression comme m($geometry)

TJ Rockefeller
la source