Đếm số đỉnh của vật thể trên lớp vector PyQGIS


8

Trước hết, tôi muốn nói rằng tôi biết rằng vấn đề tương tự đã được nêu ra trước đây, nhưng nó không cung cấp giải pháp thỏa mãn.

Tôi cần lấy số đỉnh của mọi đối tượng trên lớp vectơ. Dựa trên bài viết này: https://joseguerreroa.wordpress.com/2014/07/28/contar-y-extraer-nodos-vertices-para-vectoriales-de-linea-o-poligono-mediante-pyqgis/

Tôi đã làm mã này:

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

Và kết quả là tôi nhận được số đỉnh, nhưng chỉ của đối tượng cuối cùng. Tôi đoán tôi đang thiếu một vòng lặp while trên lớp (để lấy số cho mọi đối tượng), phải không? Nhưng tôi không biết nó trông như thế nào.

Tôi biết rằng có plugin 'Vertices counter ", nhưng nó không hoạt động (thậm chí không bắt đầu) trong trường hợp của tôi (QGIS 2.12, Win 8.1). Và tôi cần nó được thực hiện bằng Python.

Nhân tiện, bạn không nghĩ rằng các chàng trai, thật khó để có được số đỉnh trong khi rất dễ để có được tọa độ của mọi đỉnh?

EDIT: @nwduncan (@ArMoraer cũng vậy) đề nghị sửa chữa một vết lõm, và đó là đầu mối tốt. Tôi nhận thấy rằng bảng điều khiển Python cần được làm mới, bởi vì đôi khi nó không thể xử lý các vết lõm. Hy vọng nó sẽ giúp những người mới bắt đầu. Mã cuối cùng là:

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
Tôi không quen thuộc với pyqgis, nhưng tôi có thể thấy từ mã của bạn rằng tính năng của bạn trong vòng lặp feat đang gán đối tượng hình học cho biến geom và sau đó ghi đè lên nó bằng đối tượng hình học tiếp theo mà không thực sự đếm đỉnh. Hãy thử thụt dòng 6-15 để chúng ngồi dưới featuer trong vòng lặp feat.
nwduncan

Tôi đã thử nó trước đây và tôi đã nhận được rất nhiều lỗi 'thụt lề bất ngờ'. Nhưng ... vì tôi hơi nản chí nên tôi đã làm theo lời khuyên của bạn. Vì vậy, một lần nữa, tôi đã thay đổi thụt lề và lần này tôi đã lưu nó vào tập tin mới và nó đã hoạt động! Tôi nghĩ vấn đề là giao diện điều khiển Python của QGIS không hoàn hảo và việc lưu mã vào tệp mới bằng cách nào đó đã giúp ích. Không biết làm thế nào, nhưng nó đã làm :) Cảm ơn vì manh mối!
antonio

1
Nếu bạn chỉ mới sử dụng Python, tôi sẽ tránh các vòng lặp while nếu bạn có thể. Rất dễ dàng để có được chính mình vào một vòng lặp vô hạn. Cũng QgsPoint(0,0)là một điểm hợp lệ trong một số dự đoán.
Nathan W

Câu trả lời:


4

Lõm.

Phần đầu tiên của mã của bạn là chính xác, nhưng phần còn lại có thể được đơn giản hóa rất nhiều nếu bạn chỉ muốn số lượng đỉnh:

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

Nếu bạn cũng muốn tọa độ của các đỉnh, thì bạn có thể viết (chỉ polylines):

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

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

    for v in vertices:
        points.append(v)

Cảm ơn rất nhiều. Mã bạn đã viết hoạt động cho Polyline. Tôi đã thử tương tự với MultiPolyline vertices = feature.geometry().asPolyline()với vertices = feature.geometry().asMultiPolyline()Nó không đếm số đỉnh nhưng in loại số ngẫu nhiên (tôi không thể liên kết nó với bất kỳ dữ liệu nào tôi có)
antonio

Ok, tôi đã chỉnh sửa kịch bản đầu tiên của mình. Bây giờ nó sẽ hoạt động cho MultiPolylines.
ArMoraer

2

Trong QGIS 2.14, một chức năng mới để đếm các đỉnh có sẵn trong field calculator:

Máy tính trường trong QGIS 2.14


1

Một cách tiếp cận khác sẽ là sử dụng một biểu thức do người dùng định nghĩa. Công cụ biểu thức sẽ lặp lớp cho bạn. Blog của Nathans có một bản demo tốt về điều đó:

http://nathanw.net/2012/11/10/user-dained-expression-fifts-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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.