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.