ベクターレイヤーPyQGIS上のオブジェクトの頂点の数を数える


8

まず第一に、以前に同様の問題が提起されたことを知っていますが、それは満足のいく解決策を提供しませんでした。

ベクターラインレイヤー上のすべてのオブジェクトの頂点の数を取得する必要があります。この記事を基に:https : //joseguerreroa.wordpress.com/2014/07/28/contar-y-extraer-nodos-vertices-para-vectoriales-de-linea-o-poligono-mediante-pyqgis/

私はこのコードをしました:

layer = qgis.utils.iface.activeLayer()
feat = layer.getFeatures()
for feature in feat:
    geom = feature.geometry()

n = 1
ver = geom.vertexAt(0)
points=[]

while(ver != QgsPoint(0,0)):
    n +=1
    points.append(ver)
    ver = geom.vertexAt(n)

print n

その結果、頂点の数を取得しますが、最後のオブジェクトのみを取得します。(すべてのオブジェクトの番号を取得するために)レイヤーでwhileループが1つ欠けていると思いますが、そうですか?しかし、私はそれがどのように見えるべきかわかりません。

'Vertices counter'プラグインがあることは知っていますが、私の場合(QGIS 2.12、Win 8.1)で機能しません(起動しません)。そして、Pythonで実行する必要があります。

ところで、すべての頂点の座標を取得するのは簡単ですが、頂点の数を取得するのは途方もなく難しいと思いませんか。

編集:@nwduncan(@ArMoraerも)はインデントを修正することを提案し、それは良い手がかりでした。Pythonコンソールはインデントを処理できないことがあるため、更新が必要であることに気付きました。それが他の初心者を助けることを願っています。最終的なコードは次のとおりです。

layer = qgis.utils.iface.activeLayer()
feat = layer.getFeatures()
for feature in feat:
    geom = feature.geometry()
    n   = 1
    ver = geom.vertexAt(0)
    points=[]

    while(ver != QgsPoint(0,0)):
        n +=1
        points.append(ver)
        ver=geom.vertexAt(n)

    print n

1
私はpyqgisに精通していませんが、コードから、feat loopの機能がジオメトリオブジェクトをgeom変数に割り当て、頂点を実際にカウントせずに次のジオメトリオブジェクトで上書きしていることがわかります。6〜15行目をインデントしてみて、featループのfor featuerの下に配置します。
nwduncan 2016

以前に試しましたが、「予期しないインデント」エラーがたくさん発生しました。しかし...少しイライラしていたので、あなたのヒントに従いました。もう一度、インデントを変更し、今回は新しいファイルaaaに保存しました。問題は、QGIS Pythonコンソールが完全ではなく、コードを新しいファイルに保存することがどういうわけか役に立ったことだったと思います。方法はわかりませんが、それは:)手がかりをありがとう!
antonio 2016

1
Pythonが初めての場合は、whileループをできるだけ避けます。無限ループに入るのは非常に簡単です。また QgsPoint(0,0)、一部の予測では有効な点です。
Nathan W

回答:


4

インデント。

コードの最初の部分は正しいですが、頂点の数だけが必要な場合は、残りを大幅に簡略化できます。

layer = qgis.utils.iface.activeLayer()
feat = layer.getFeatures()

for feature in feat:
    if feature.geometry().isMultipart(): # new part for multipolylines
        vertices = feature.geometry().asMultiPolyline()
        print [len(v) for v in vertices]
    else:
        vertices = feature.geometry().asPolyline()
        n = len(vertices)
        print n

頂点の座標も必要な場合は、次のように記述できます(ポリラインのみ)。

layer = qgis.utils.iface.activeLayer()
feat = layer.getFeatures()

for feature in feat:
    vertices = feature.geometry().asPolyline()
    points = []

    for v in vertices:
        points.append(v)

どうもありがとう。あなたが書いたコードはポリラインで動作します。MultiPolylineで同じことを試しました が、頂点の数はカウントvertices = feature.geometry().asPolyline()vertices = feature.geometry().asMultiPolyline()れませんが、乱数の種類を出力します(持っているデータにリンクすることはできません)
antonio

では、最初のスクリプトを編集しました。マルチポリラインで機能するようになりました。
ArMoraer 2016

2

QGIS 2.14では、頂点をカウントする新しい関数がで利用可能ですfield calculator

QGIS 2.14のフィールド計算機


1

別のアプローチは、ユーザー定義の式を使用することです。式エンジンがレイヤーをループします。Nathansブログには、その良いデモがあります。

http://nathanw.net/2012/11/10/user-defined-expression-functions-for-qgis/

from qgis.utils import qgsfunction
from qgis.core import QGis

@qgsfunction(0, "Python")
def vertices(values, feature, parent):
    """
        Returns the number of vertices for a features geometry
    """
    count = None
    geom = feature.geometry()
    if geom is None: return None
    if geom.type() == QGis.Polygon:
        count = 0
        if geom.isMultipart():
          polygons = geom.asMultiPolygon()
        else:
          polygons = [ geom.asPolygon() ]
        for polygon in polygons:
          for ring in polygon:
            count += len(ring)
    return count
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.