PyQGIS로 필드를 추가하고 표현식을 계산 하시겠습니까?


10

PyQGIS를 사용하여 새 필드를 추가하고 각 기능의 값을 계산하고 싶습니다. 필드 계산기 옵션과 유사합니다.

내 '필드 계산기'표현은 다음과 같습니다. 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(final 결측 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 coord'를 QVariant.Int에 보내는 것은 좋은 생각이 아니며 오류는 없지만 나쁜 프로그래밍 일뿐입니다. 이중이 있어야합니다. 감사합니다
OHTO

솔직히 말해서, 그런 문제에 직면 한 것은 이번이 처음입니다. 항상 그렇듯이 줄마다 테스트하면 어떤 일이 발생하는지 힌트를 얻을 수 있습니다.
Germán Carrillo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.