PyQGIS içinde QgsFeature kullanarak bir özniteliğin değeri nasıl değiştirilir?


12

Bir özelliğin bir özelliğini güncellemek istiyorum. Ancak, özellik nesnesini kullanarak güncelleştirmeyi bilmiyorum. Güncellemek için veri sağlayıcı kullanmak zorundayım.

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 })

QgsFeatureNesneyi kullanarak bir özniteliğin değerini değiştirebilir miyim ?

Dahası, bir yineleyici nesnesi kullanarak döngü yapmak mümkün müdür?


dizini kullanmadan değerleri nasıl değiştirebilirim? Alan adını isimlendirerek değerleri değiştirmek istiyorum. Bu çok daha rahat olurdu. Çok teşekkür ederim! Selamlar Robert
Robert BK

Sadece my_index = layer.fieldNameIndex("my_field_name")dizini almak için kullanın .
Germán Carrillo

bu durumda i can i nasıl dize alanında ekleyemezsiniz?
Hamed Makian

Yeni bir sorunuz varsa, lütfen Soru Sor düğmesini tıklayarak sorun . Bağlam sağlamaya yardımcı oluyorsa bu soruya bir bağlantı ekleyin. - Yorumdan
Dan C

Hamed, GIS Yığın Değişimi'ne hoş geldiniz! Bu soru zaten yanıtlandığından, lütfen sorunuzu burada yeni, ayrı bir soru olarak sorun gis.stackexchange.com/questions/ask .
cm1

Yanıtlar:


17

İki sorunuza cevap verin:

  1. Özellik değerlerinizi, layernesneye erişmenize gerek kalmadan nesneden değiştirebilirsiniz dataProvider().

  2. Evet, yineleyiciyi fordöngü içinde kullanabilirsiniz .

Aşağıdaki kodu kontrol edin:

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()

Bu, tüm katman özellikleri için üçüncü (dizin 2) alan değerini 30 olarak günceller.


Not: Belirttiğiniz gibi, herhangi bir nedenle QgsFeature nesnesi, API'nin söyleyebileceğini söylese de özellik değerlerini güncelleyemez.


5

Evet, ancak alanın dizinini bilmelisiniz:

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

Alanları kullanarak alabilir QgsFeature::fieldsve sonra istediğinizi bulana kadar veya QgsFeature::attribute(const QString & name )alan dizinini ada göre bulana kadar yineleyebilirsiniz .

QVariant'ın nedeni setAttribute öğesinin Tamsayı, Kayan Nokta, Tarih ve Metin türlerini alabilmesidir. QgsFeature.attribute (name), öznitelik bulunursa int türünde bir varyant ve bulunamazsa başka bir şey döndürür. Kodunuzda bunun farkında olun. Bir try..except bloğu garanti edilir, int'e dönüştürülmeye çalışılır ve tür int değilse hariç.

Özelliğiniz bu yöntemi desteklemiyor olabilir. Kullandığım başka bir yöntem QgsVectorLayer::changeAttributeValue:

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

Bu, katmana belirli bir özelliği ve belirli bir özelliği güncellemesini söyler. Örnek durumda değer bir widget'tan gelir.


Denedim feat.setAttribute(1, QVariant(20))ama sistem TypeError
wannik

feat.setAttribute (1, 20) bunu daha önce nasıl yaptığımdır. Bu, '20' değerini 1 özniteliğine yerleştirir.
Michael Stimson

Denedim feat.setAttribute(1, 20)ama değerler değişmiyor. Ancak, yapabilirimprint(feat.attributes()[1])
wannik

Düzenlemelere bakın, belki de değişiklikleri yapmak için sürücüyü kullanması gereken QgsVectorLayer.changeAttributeValue öğesini çağırmanız gerekir.
Michael Stimson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.