Saya ingin memperbarui satu atribut fitur. Namun, saya tidak tahu untuk memperbaruinya menggunakan objek fitur. Saya harus menggunakan penyedia data untuk memperbaruinya.
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 })
Bisakah saya mengubah nilai atribut menggunakan QgsFeature
objek?
Selain itu, apakah mungkin untuk mengulang menggunakan objek iterator?
my_index = layer.fieldNameIndex("my_field_name")
untuk mendapatkan indeks.Jawaban:
Menjawab dua pertanyaan Anda:
Anda dapat mengubah nilai fitur dari
layer
objek, tidak perlu mengaksesdataProvider()
.Ya, Anda bisa menggunakan iterator dalam satu
for
lingkaran.Periksa kode di bawah ini:
Ini memperbarui nilai bidang ketiga (indeks 2) ke 30 untuk semua fitur lapisan.
Catatan: Seperti yang Anda tunjukkan, untuk beberapa alasan objek QgsFeature tidak dapat memperbarui nilai fitur, meskipun API mengatakan itu bisa.
sumber
Ya, tetapi Anda harus tahu indeks bidang:
Anda bisa mendapatkan bidang menggunakan
QgsFeature::fields
dan kemudian beralih melalui mereka sampai Anda menemukan yang Anda inginkan atauQgsFeature::attribute(const QString & name )
untuk menemukan indeks bidang dengan nama.Alasan untuk QVariant adalah bahwa setAttribute dapat menggunakan tipe Integer, Float, Date dan Text. QgsFeature.attribute (nama) mengembalikan varian juga dari tipe int jika atribut ditemukan dan sesuatu yang lain jika tidak dapat ditemukan .. sadari hal ini dalam kode Anda. Blok try..except akan dibenarkan, cobalah untuk mengonversi ke int dan kecuali jika jenisnya tidak int.
Mungkin saja fitur Anda tidak mendukung metode ini. Metode lain yang saya gunakan adalah
QgsVectorLayer::changeAttributeValue
:Ini memberitahu layer untuk memperbarui fitur dan atribut tertentu. Dalam contoh kasus, nilai berasal dari widget.
sumber
feat.setAttribute(1, QVariant(20))
tetapi sistem mengatakan TypeError: PyQt4.QtCore.QVariant mewakili tipe yang dipetakan dan tidak dapat dipakaifeat.setAttribute(1, 20)
tetapi nilainya tidak berubah. Namun, saya bisaprint(feat.attributes()[1])