Thêm trường và tính biểu thức với PyQGIS?


10

Tôi muốn sử dụng PyQGIS để thêm trường mới và tính toán các giá trị cho từng tính năng. Tương tự như tùy chọn Máy tính Trường.

Ví dụ, biểu thức 'Máy tính trường' của tôi là: y(start_point($geometry))

from PyQt4.QtCore import QVariant
from qgis.core import QgsField, QgsExpression, QgsFeature
vl = iface.activeLayer()

vl.startEditing()

#step 1
myField = QgsField( 'myNewColumn', QVariant.Float )
vl.addAttribute( myField )
idx = vl.fieldNameIndex( 'myNewColumn' )

#step 2
e = QgsExpression( 'y(start_point($geometry))' )
e.prepare( vl.pendingFields() )

for f in vl.getFeatures():
    f[idx] = e.evaluate( f )
    vl.updateFeature( f )

vl.commitChanges()

Đây là lỗi tôi nhận được:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/var/folders/0r/q6nxg6w54fv4l7c8gksb2t500000gn/T/tmp9dosIe.py", line 30, in <module>
    f[idx] = e.evaluate( f )
KeyError: '-1'

Câu trả lời:


11

Lỗi bạn nhận được cho biết chỉ mục trường là -1, vì vậy trường mới của bạn không được tìm thấy trong bảng thuộc tính của bạn.

Điều đó có thể xảy ra vì:

  1. Bạn cần sử dụng QVariant.Doublethay vì QVariant.Float.
  2. Bạn đã không cam kết trường mới cho nhà cung cấp lớp trước khi yêu cầu chỉ mục cột mới của bạn.
  3. Bạn đang yêu cầu chỉ mục của myNewColumnnhưng nhà cung cấp của bạn chỉ có thể lưu trữ 10 ký tự cho tên trường, vì vậy nó đã được lưu trữ myNewColum(thiếu cuối cùng n). (Chỉ xảy ra với tôi trong khi thử trả lời)

Hãy thử điều này thay thế:

#step 1
myField = QgsField( 'newColumn', QVariant.Double )
vl.dataProvider().addAttributes([myField])
vl.updateFields()
idx = vl.fieldNameIndex( 'newColumn' )

Bây giờ idxnên khác hơn -1, bạn có thể kiểm tra nó:

if idx != -1:
    print "Field found!"

Nhân tiện, bạn có thể chạy #step 1mã ra khỏi khối chỉnh sửa.


1
Sau một số thử nghiệm cơ bản, tôi nghĩ rằng giới hạn ký tự của tên trường. Tất nhiên, gửi 'x tọa độ' đến QVariant. Tôi cũng không phải là một ý tưởng hay, mặc dù không có lỗi, chỉ là lập trình xấu. Đôi nên ở đó. cảm ơn
OHTO

Thành thật mà nói, đây là lần đầu tiên tôi phải đối mặt với vấn đề như vậy. Như mọi khi, kiểm tra từng dòng cho bạn gợi ý về những gì có thể xảy ra.
Germán Carrillo
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.