PyQGIS에서 QgsFeature를 사용하여 속성 값을 변경하는 방법은 무엇입니까? = QgsMapLayerRegistry.instance().mapLayersByName(‘my_line’) layer = layers[0] dp =

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

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객체를 사용하여 속성 값을 변경할 수 있습니까 ?

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



답변

두 가지 질문에 대한 답변 :

  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 객체가 기능 값을 업데이트 할 수 없습니다.


답변

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

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)

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