Pyqgis 2.0'da alan adları nasıl alınır


13

Bir eklentiyi QGIS 1.8'den 2.0'a değiştirmeye çalışıyorum. 1.8 sürümünde aşağıdaki gibi alan adlarının bir tablosunu oluşturuyorum:

layer = vlayer
provider = layer.dataProvider()
feat = QGSFeatrue()
allAttrs = provider.attributeIndexes()
provider.select(allAttrs)
fieldNames = []

while provider.nextFeature(feat)
    fields = layer.pendingFields()
    for (k, field) in fields.iteritems():
         fieldNames.append(field.name())

Bunu 2.0 sürümü için denedim

layer = vlayer
fieldNames = []

for feature in layer.getFeatures():
    fields = layer.pendingFields()
    for (k, field) in fields.iteritems():
         fieldNames.append(field.name())

Ancak pendingFields () benim için çalışmıyor. Artık alanların adlarını almak için yeni bir yöntem var mı?

Yanıtlar:


24

Sürüm 1.8'den daha basit:

layer = qgis.utils.iface.activeLayer()  
fields = layer.pendingFields()   
field_names = [field.name() for field in fields]

veya bir satırda

field_names = [field.name() for field in layer.pendingFields() ]

sonra

for elem in layer.getFeatures():  
   print dict(zip(field_names, elem.attributes()))
{u'adip': 17, u'dipdir': 130, u'tdip': 29}
{u'adip': 55, u'dipdir': 325, u'tdip': 75}
.....

Genellikle yeni bir işlevi keşfetmek için, içeride ne olduğunu incelemek için dir () veya see modülünü kullanıyorum:

dir(fields)
['FieldOrigin', 'OriginEdit', 'OriginJoin', 'OriginProvider', 'OriginUnknown', '__class__', '__delattr__', '__delitem__', '__dict__', '__doc__', '__format__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__len__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'append', 'at', 'clear', 'count', 'extend', 'field', 'fieldOrigin', 'fieldOriginIndex', 'indexFromName', 'isEmpty', 'remove', 'size', 'toList']

veya

see(fields)
[]                 hash()             help()             len()
repr()             str()              .FieldOrigin()     .OriginEdit
.OriginJoin        .OriginProvider    .OriginUnknown     .append()
.at()              .clear()           .count()           .extend()
.field()           .fieldOrigin()     .fieldOriginIndex()
.indexFromName()   .isEmpty()         .remove()          .size()
.toList()

Ve bir field () işlevi olduğunu görebilirsiniz.

print fields.field(0)
qgis.core.QgsField object at 0x163E39C0

ve bir alanın adı, türü, hassasiyeti vardır ...:

see(fields.field(0))
<                 <=                ==                !=                >
>=                hash()            help()            repr()
str()             .comment()        .displayString()  .length()
.name()           .precision()      .setComment()     .setLength()
.setName()        .setPrecision()   .setType()        .setTypeName()
.type()           .typeName()

yani:

fields.field(0).name()
u'adip'
fields.field(0).type()
2
fields.field(0).typeName()
u'Integer'
fields.field(0).precision()
0
....

.dataProvider () ile

Bu .field ()

....
prov = layer.dataProvider()
prov.fields().field(0).name()
u'adip'
prov.fields().field(0).typeName()
u'Integer'

ve

field_names = [field.name() for field in prov.fields()]

Tamam, bu sadece qgis Python Editör'de çalışır. Eklentimde bu işlevi kullandığımda hiçbir şey olmuyor. İşlev alanlardaki alana kadar gidiyor ama orada duruyor. Daha sonra bir mesaj kutusu göstermeye çalıştım ama kod hattına ulaşmadı. Belki bir şey almayı unuttum? Qgis.core, qgis.gui ve qgis.utils dosyalarım var.
Martin

.dataprovider () kullanmalısınız, cevabımdaki eke bakınız
gen

Teşekkür ederim. Çalışıyor. Sorun aktif katman ile katman kimliği almaya çalıştım getLayerID()ama artık çalışmıyor.
Martin

2

Örneğin bu şekilde çalışır (son QGIS dev 1.9'dan beri):

layer = vlayer # QGsVectorlayerObject
prov = vlayer.dataProvider()
fieldNames = []
fields = prov.fields()
for field in fields:
    fieldNames.append( field.name() )

1
Benim için bu işe yaramıyor. Alanlar arasında yineleme yapmaya çalıştığımda hiçbir şey olmuyor. 2.0'daki dataProvider hala kullanılabilir mi?
Martin

1
jup öyle. Ve benim eklenti için yukarıdaki kod sorunsuz çalışır. kodu yürütürken nesnelerin türünü ve içeriğini yazdırmayı deneyin. Hata ayıklamaya yardımcı olur
Curlew

QgsMapLayerRegistry.instance () ile çalıştı. mapLayers (). değerleri ():
Muhammad Faizan Khan
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.