PyQGIS ile alan ekleme ve ifade hesaplama?


10

Yeni bir alan eklemek ve her özellik için değerleri hesaplamak için PyQGIS kullanmak istiyorum. Alan Hesaplayıcı seçeneğine benzer.

'Alan Hesaplayıcı' ifadem örneğin: y(start_point($geometry))

from PyQt4.QtCore import QVariant
from qgis.core import QgsField, QgsExpression, QgsFeature
vl = iface.activeLayer()

vl.startEditing()

#step 1
myField = QgsField( 'myNewColumn', QVariant.Float )
vl.addAttribute( myField )
idx = vl.fieldNameIndex( 'myNewColumn' )

#step 2
e = QgsExpression( 'y(start_point($geometry))' )
e.prepare( vl.pendingFields() )

for f in vl.getFeatures():
    f[idx] = e.evaluate( f )
    vl.updateFeature( f )

vl.commitChanges()

Aldığım hata bu:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/var/folders/0r/q6nxg6w54fv4l7c8gksb2t500000gn/T/tmp9dosIe.py", line 30, in <module>
    f[idx] = e.evaluate( f )
KeyError: '-1'

Yanıtlar:


11

Aldığınız hata alan dizinidir -1, bu nedenle yeni alanınız özellik tablonuzda bulunamadı.

Bu olabilir çünkü:

  1. Bunun QVariant.Doubleyerine kullanmanız gerekir QVariant.Float.
  2. Yeni sütun dizini sormadan önce yeni alanı katman sağlayıcısına taahhüt etmediniz.
  3. Dizinini soruyorsunuz, myNewColumnancak sağlayıcınız alan adları için yalnızca 10 karakter saklayabildiğinden, depolandı myNewColum(eksik final n). (Sadece bir cevap verirken başıma geldi)

Bunun yerine şunu deneyin:

#step 1
myField = QgsField( 'newColumn', QVariant.Double )
vl.dataProvider().addAttributes([myField])
vl.updateFields()
idx = vl.fieldNameIndex( 'newColumn' )

Şimdi idxbundan farklı olmalı -1, kontrol edebilirsiniz:

if idx != -1:
    print "Field found!"

Bu arada, #step 1kodu düzenleme bloğundan çalıştırabilirsiniz.


1
Bazı temel testlerden sonra alan adının karakter sınırı olduğunu düşünüyorum. Tabii ki bir QVariant'a 'x coord' göndermek de iyi bir fikir değil, hata değil, sadece kötü programlama. Çift orada olmalı. teşekkürler
OHTO

Dürüst olmak gerekirse, ilk kez böyle bir sorunla karşılaşıyorum. Her zaman olduğu gibi, satır satır test etmek, neler olabileceğine dair ipuçları verir.
Germán Carrillo
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.