PyQGISを介してQGISでラインまたはマルチライン座標を取得する

Dec 03 2020

次のコードでポイントレイヤーの座標を取得できますが、ラインまたはマルチラインの座標を知りたいです。これらの座標を取得する方法は?

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

回答

4 Zoltan Dec 03 2020 at 14:01

マルチパートラインストリングの場合、次のコードを使用できます(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())

単一部分の線ストリングの場合:

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

asMultiPolylineおよびasPolylineはポイントのリストを返すため、インデックスを使用できます。

レイヤーのジオメトリタイプをチェックするためのUPDATEは、レイヤーのgeometryTypeメソッドを使用します。シングルタイプとマルチタイプを分離するには、isSingleType関数を使用します。そのためのコードは次のとおりです。

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

MultiPolylineジオメトリの頂点のxyを抽出する場合は、次のコードを使用できます。

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

出力は次のようになります

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