Додавання поля та обчислення вираження за допомогою PyQGIS?


10

Я хочу використовувати PyQGIS для додання нового поля та обчислення значень для кожної функції. Подібний варіант поля Field Calculator.

Наприклад, мій вираз "Калькулятор поля": 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()

Це помилка, яку я отримую:

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'

Відповіді:


11

Помилка, яку ви отримуєте, говорить про індекс поля -1, тому ваше нове поле не знайдено в таблиці атрибутів.

Це може статися тому, що:

  1. Ви повинні використовувати QVariant.Doubleзамість QVariant.Float.
  2. Ви не заповнили нове поле постачальнику шарів, перш ніж запитати новий індекс стовпця.
  3. Ви запитуєте індекс, myNewColumnале ваш провайдер може зберігати лише 10 символів для імен полів, тому він зберігається myNewColum(відсутній фінал n). (Щойно зі мною трапилось, даючи відповідь спробувати)

Спробуйте це замість цього:

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

Тепер idxмає бути інакше, ніж -1ви можете це перевірити:

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

До речі, ви можете запустити #step 1код із блоку редагування.


1
Після деякого базового тестування я думаю, що його межа символу поля. Звичайно, відправлення "x координати" на QVariant. Це теж не дуже гарна ідея, однак помилок немає, просто погане програмування. Подвійний має бути там. спасибі
OHTO

Якщо чесно, то вперше я стикаюся з такою проблемою. Як завжди, тестування по черзі дає підказки щодо того, що може статися.
Герман Каррільо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.