Menghitung jumlah simpul objek pada layer vektor PyQGIS

8

Pertama-tama, saya ingin mengatakan bahwa saya tahu bahwa masalah serupa telah diangkat sebelumnya, tetapi tidak memberikan solusi yang memuaskan.

Saya perlu mendapatkan jumlah simpul dari setiap objek pada layer garis vektor. Mendasarkan pada artikel ini: https://joseguerreroa.wordpress.com/2014/07/28/contar-y-extraer-nodos-vertices-para-vectoriales-de-linea-o-poligono-mediante-pyqgis/

Saya melakukan kode ini:

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

Dan sebagai hasilnya saya mendapatkan jumlah simpul, tetapi hanya dari objek terakhir. Saya kira saya kehilangan satu loop sementara pada layer (untuk mendapatkan nomor untuk setiap objek), apakah saya benar? Tapi saya tidak tahu bagaimana tampilannya.

Saya tahu bahwa ada plugin 'Vertices counter ", tetapi tidak berfungsi (bahkan tidak memulai) dalam kasus saya (QGIS 2.12, Win 8.1). Dan saya perlu melakukannya dengan Python.

Ngomong-ngomong, bukankah menurut kalian, sangat sulit untuk mendapatkan jumlah simpul sementara sangat mudah untuk mendapatkan koordinat dari setiap simpul?

EDIT: @nwduncan (@ArMoraer juga) menyarankan untuk memperbaiki lekukan, dan itu adalah petunjuk yang bagus. Saya perhatikan bahwa konsol Python perlu penyegaran, karena terkadang tidak dapat menangani lekukan. Semoga ini akan membantu pemula lainnya. Kode terakhir adalah:

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
antonio
sumber
1
Saya tidak terbiasa dengan pyqgis, tapi saya bisa melihat dari kode Anda bahwa fitur Anda di feat loop adalah menetapkan objek geometri ke variabel geom dan kemudian menimpanya dengan objek geometri berikutnya tanpa benar-benar menghitung verticies. Coba indentasi baris 6-15 sehingga mereka duduk di bawah foratu di loop feat.
nwduncan
Saya sudah mencobanya sebelumnya, dan saya mendapat banyak kesalahan 'indentasi tak terduga'. Tapi ... karena saya sedikit frustrasi saya mengikuti tip Anda. Jadi sekali lagi, saya mengubah indentasi dan kali ini saya menyimpannya ke file baru dan berhasil! Saya pikir masalahnya adalah bahwa konsol Python QGIS tidak sempurna dan menyimpan kode ke file baru entah bagaimana membantu. Tidak tahu bagaimana, tapi itu memang :) Terima kasih atas petunjuknya!
antonio
1
Jika Anda baru menggunakan Python, saya akan menghindari loop sementara jika Anda bisa. Sangat mudah untuk membuat Anda menjadi loop tak terbatas. Juga QgsPoint(0,0)merupakan poin yang valid dalam beberapa proyeksi.
Nathan W

Jawaban:

4

Lekukan.

Bagian pertama dari kode Anda sudah benar, tetapi sisanya dapat sangat disederhanakan jika Anda hanya ingin jumlah simpul:

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

Jika Anda juga ingin koordinat titik, maka Anda dapat menulis (hanya polyline):

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

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

    for v in vertices:
        points.append(v)
ArMoraer
sumber
Terima kasih banyak. Kode yang Anda tulis berfungsi untuk Polyline. Saya mencoba hal yang sama untuk MultiPolyline vertices = feature.geometry().asPolyline()untuk vertices = feature.geometry().asMultiPolyline()Itu tidak menghitung jumlah simpul tetapi mencetak jenis angka acak (saya tidak dapat menghubungkannya dengan data yang saya miliki)
antonio
Oke, saya mengedit skrip pertama saya. Sekarang seharusnya berfungsi untuk MultiPolylines.
ArMoraer
2

Di QGIS 2.14, fungsi baru untuk menghitung simpul tersedia di field calculator:

Kalkulator lapangan di QGIS 2.14

etrimaille
sumber
1

Pendekatan lain adalah dengan menggunakan ekspresi yang ditentukan pengguna. Mesin ekspresi akan membuat lingkaran untuk Anda. Blog Nathans memiliki demo bagus tentang itu:

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
Jakob
sumber