PyQGIS에서 QgsFeature를 사용하여 속성 값을 변경하는 방법은 무엇입니까?


12

기능의 한 속성을 업데이트하고 싶습니다. 그러나 기능 객체를 사용하여 업데이트하는 것을 모르겠습니다. 데이터 공급자를 사용하여 업데이트해야합니다.

layers = QgsMapLayerRegistry.instance().mapLayersByName('my_line') 
layer = layers[0]
dp = layer.dataProvider()
it = dp.getFeatures()

for i in range(0, dp.featureCount()):
  feat = it.next()
  attrs = { 2 : 30 }
  layer.dataProvider().changeAttributeValues({ feat.id() : attrs })

QgsFeature객체를 사용하여 속성 값을 변경할 수 있습니까 ?

또한 반복자 객체를 사용하여 반복 할 수 있습니까?


색인을 사용하지 않고 어떻게 값을 변경할 수 있습니까? 필드 이름을 지정하여 값을 변경하고 싶습니다. 훨씬 편할 것입니다. 대단히 감사합니다! 인사말 Robert
Robert BK

단순히 my_index = layer.fieldNameIndex("my_field_name")색인을 얻기 위해 사용 하십시오.
Germán Carrillo

이 경우 어떻게 내가 할 수있는 문자열을 필드에 추가 할 수 없습니까?
Hamed Makian

새로운 질문이 있으면 질문하기 버튼 을 클릭하여 질문하십시오 . 컨텍스트를 제공하는 데 도움이되는 경우이 질문에 대한 링크를 포함하십시오. - 검토에서
Dan C

Hamed, GIS Stack Exchange에 오신 것을 환영합니다! 이 질문에 이미 답변 되었으므로 gis.stackexchange.com/questions/ask에서 질문을 새 별도 질문으로 질문하십시오 .
cm1

답변:


17

두 가지 질문에 대한 답변 :

  1. layer에 액세스 할 필요없이 객체 에서 기능 값을 변경할 수 있습니다 dataProvider().

  2. 예, 반복기에서 for루프를 사용할 수 있습니다 .

아래 코드를 확인하십시오.

layers = QgsMapLayerRegistry.instance().mapLayersByName('my_line') 
layer = layers[0]
it = layer.getFeatures()

layer.startEditing()
for feat in it:
  layer.changeAttributeValue(feat.id(), 2, 30)

layer.commitChanges()

모든 레이어 피처에 대해 세 번째 (인덱스 2) 필드 값이 30으로 업데이트됩니다.


참고 : 지적한 바와 같이, 어떤 이유로 API가 할 수 있다고하더라도 QgsFeature 객체가 기능 값을 업데이트 할 수 없습니다.


5

예, 그러나 필드의 색인을 알아야합니다.

QgsFeature::setAttribute(int field,const QVariant & attr )  

QgsFeature::fields원하는 QgsFeature::attribute(const QString & name )필드를 찾 거나 이름으로 필드 인덱스를 찾을 때까지 필드를 사용하여 필드 를 반복 할 수 있습니다 .

QVariant의 이유는 setAttribute가 Integer, Float, Date 및 Text 유형을 사용할 수 있기 때문입니다. QgsFeature.attribute (name)은 속성이 발견되면 int 유형과 변형이 발견되지 않으면 int 유형의 변형을 리턴합니다. 코드에서이를 인식하십시오. try..except 블록이 보증되면 int로 변환하고 type이 int가 아닌 경우를 제외하고 시도하십시오.

기능이이 방법을 지원하지 않을 수 있습니다. 내가 사용한 다른 방법은 QgsVectorLayer::changeAttributeValue다음과 같습니다.

self.canvas.currentLayer().changeAttributeValue(UpdateFeatureID,FieldToUpdate,self.CurrentWidget.text(),True)

레이어에 특정 기능 및 특정 속성을 업데이트하도록 지시합니다. 예제의 경우 값은 위젯에서 나옵니다.


나는 시도 feat.setAttribute(1, QVariant(20))하지만 시스템 말했다 형식 오류가 : PyQt4.QtCore.QVariant 매핑 된 형태를 표현하고 인스턴스화 할 수 없습니다
wannik

feat.setAttribute (1, 20)는 이전에 수행 한 방법입니다. 그것은 '20'이라는 값을 속성 1에 넣습니다.
Michael Stimson

시도 feat.setAttribute(1, 20)했지만 값이 변경되지 않습니다. 그러나, 나는 할 수print(feat.attributes()[1])
wannik

편집을 참조하십시오. 아마도 드라이버를 사용하여 변경해야하는 QgsVectorLayer.changeAttributeValue를 호출해야합니다.
Michael Stimson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.