Chciałbym zaktualizować jeden atrybut funkcji. Nie wiem jednak, jak go zaktualizować za pomocą obiektu funkcji. Muszę użyć dostawcy danych, aby go zaktualizować.
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 })
Czy mogę zmienić wartość atrybutu za pomocą QgsFeature
obiektu?
Co więcej, czy można zapętlić za pomocą obiektu iteratora?
my_index = layer.fieldNameIndex("my_field_name")
aby uzyskać indeks.Odpowiedzi:
Odpowiadając na dwa pytania:
Możesz zmienić wartości funkcji z
layer
obiektu, bez potrzeby dostępu dodataProvider()
.Tak, możesz używać iteratora w
for
pętli.Sprawdź kod poniżej:
To aktualizuje wartość trzeciego pola (indeks 2) do 30 dla wszystkich funkcji warstwy.
Uwaga: Jak wskazałeś, z jakiegoś powodu obiekt QgsFeature nie może aktualizować wartości funkcji, chociaż API mówi, że może.
źródło
Tak, ale musisz znać indeks pola:
Możesz uzyskać pola za pomocą,
QgsFeature::fields
a następnie iterować przez nie, aż znajdziesz to, które chcesz lubQgsFeature::attribute(const QString & name )
indeks pola według nazwy.Powodem QVariant jest to, że setAttribute może przyjmować typy Integer, Float, Date i Text. QgsFeature.attribute (nazwa) zwraca wariant również typu int, jeśli atrybut zostanie znaleziony, i coś innego, jeśli nie można go znaleźć. Pamiętaj o tym w swoim kodzie. Warunkiem jest blok try..except, spróbuj przekonwertować na int i chyba że typ nie jest int.
Możliwe, że twoja funkcja nie obsługuje tej metody. Inną metodą, którą zastosowałem jest
QgsVectorLayer::changeAttributeValue
:Informuje warstwę, aby zaktualizowała określoną funkcję i określony atrybut. W tym przypadku wartość pochodzi z widżetu.
źródło
feat.setAttribute(1, QVariant(20))
ale system powiedział, że TypeError: PyQt4.QtCore.QVariant reprezentuje odwzorowany typ i nie można go utworzyćfeat.setAttribute(1, 20)
ale wartości się nie zmieniają. Jednak mogęprint(feat.attributes()[1])