Abrufen der Linien- oder MultiLine-Koordinaten in QGIS über PyQGIS

Dec 03 2020

Wir können Punktschichtkoordinaten durch den folgenden Code erhalten, aber ich möchte die Koordinaten von Linien oder Mehrlinien kennen. Wie bekomme ich diese Koordinaten?

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

Antworten

4 Zoltan Dec 03 2020 at 14:01

Für mehrteilige Linestrings können Sie den folgenden Code verwenden (ich habe ihn in 3.16.1 getestet).

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())

Für Einzelteil-Linestring:

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

asMultiPolyline und asPolyline geben eine Liste der Punkte zurück, sodass Sie Indizes verwenden können.

UPDATE zum Überprüfen des Ebenengeometrietyps Verwenden Sie die GeometrieType-Methode der Ebene. Verwenden Sie die Funktion isSingleType, um einzelne und mehrere Typen zu trennen. Hier ist der Code dafür:

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

Wenn Sie das xy von Eckpunkten einer MultiPolyline-Geometrie extrahieren möchten, können Sie den folgenden Code verwenden:

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())

Die Ausgabe wird so sein

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