Obtenir les coordonnées Line ou MultiLine dans QGIS via PyQGIS

Dec 03 2020

Nous pouvons obtenir les coordonnées de la couche de points via le code suivant, mais je veux connaître les coordonnées de la ligne ou de la multiligne. Comment obtenir ces coordonnées?

layer = QgsProject.instance().mapLayersByName("layerName")[0]
iter = layer.getFeatures()
for feature in iter:
  geom=feature.geometry()
  print(geom.asPoint().x(),geom.asPoint().y())

Réponses

4 Zoltan Dec 03 2020 at 14:01

Pour la chaîne de lignes en plusieurs parties, vous pouvez utiliser le code suivant (je l'ai testé en 3.16.1)

layer = QgsProject.instance().mapLayersByName("folyo")[0]
for feature in layer.getFeatures():
    for part in feature.geometry().asMultiPolyline():
        print("part")
        for pnt in part:
            print(pnt.x(), pnt.y())

Pour linestring monobloc:

layer = QgsProject.instance().mapLayersByName("Single parts")[0]
for feature in layer.getFeatures():
    for pnt in feature.geometry().asPolyline():
        print(pnt.x(), pnt.y())

asMultiPolyline et asPolyline renvoient une liste de points, vous pouvez donc utiliser des index.

MISE À JOUR pour vérifier le type de géométrie de la couche, utilisez la méthode geometryType de la couche. Pour séparer les types simples et multiples, utilisez la fonction isSingleType. Voici le code pour cela:

layer = QgsProject.instance().mapLayersByName("your_layer")[0]
if layer.geometryType() ==  QgsWkbTypes.LineGeometry:
    for feature in layer.getFeatures():
        geom = feature.geometry()
        if QgsWkbTypes.isSingleType(geom.wkbType()):
            # single
            for pnt in geom.asPolyline():
                print(pnt.x(), pnt.y())
        else:
            # multipart
            for part in geom.asMultiPolyline():
                print("part")
                for pnt in part:
                    print(pnt.x(), pnt.y())
2 ahmadhanb Dec 03 2020 at 14:03

Si vous souhaitez extraire le xy des sommets d'une géométrie MultiPolyline, vous pouvez utiliser le code suivant:

layer = QgsProject.instance().mapLayersByName("layerName")[0]
iter = layer.getFeatures()
for feature in iter:
    geom=feature.geometry()
    verts = geom.asMultiPolyline() # use geom.asPolyline() for line geometry
    for vert in verts:
        for i in range(len(vert)):
            print(vert[i].x(),vert[i].y())

La sortie sera comme ça

-3487202.783144876 10010395.30478035
-3428476.505393841 10049595.900699263
-3428476.505393841 10049595.900699263
-3374593.995628879 9923727.261801671
-3428476.505393841 10049595.900699263
-3359626.0983730364 10059037.052994486