pyqgis 2.0에서 필드 이름을 얻는 방법


13

플러그인을 QGIS 1.8에서 2.0으로 변경하려고합니다. 1.8 버전에서는 다음과 같은 필드 이름 테이블을 만듭니다.

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

나는 이것을 2.0 버전으로 시도했다.

layer = vlayer
fieldNames = []

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

그러나 pendingFields ()는 작동하지 않습니다. 이제 필드 이름을 얻는 새로운 방법이 있습니까?

답변:


24

버전 1.8보다 간단합니다.

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

또는 한 줄로

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

이후

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

일반적으로 새로운 함수를 탐색하기 위해 dir () 또는 see 모듈을 사용하여 내부 내용을 검사합니다.

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']

또는

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

그리고 당신은 field () 함수가 있음을 알 수 있습니다.

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

그리고 필드는 이름, 타입, 정밀도, ...를가집니다 :

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

그래서:

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

.dataProvider () 사용

.field ()입니다

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

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

이것은 작동하지만 qgis의 Python 편집기에서만 작동합니다. 플러그인에서이 기능을 사용하면 아무 일도 일어나지 않습니다. 필드의 필드에 대해 기능이 수행 될 때까지 중지되지만 중지됩니다. 나중에 메시지 상자를 표시하려고했지만 코드 라인에 도달하지 못했습니다. 어쩌면 내가 가져 오기를 잊었습니까? qgis.core, qgis.gui 및 qgis.utils를 가져 왔습니다.
Martin

.dataprovider ()를 사용해야합니다. 답장에 추가 된 내용을 참조하십시오
gene

감사합니다. 작동 중입니다. 문제는 활성 레이어에서 레이어 ID를 가져 오려고 getLayerID()했지만 더 이상 작동하지 않는다는 것입니다.
Martin

2

예를 들어 다음과 같이 작동합니다 (마지막 QGIS dev 1.9부터).

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

1
나를 위해 이것은 작동하지 않습니다. 필드를 반복하려고하면 아무 일도 일어나지 않습니다. 2.0의 dataProvider를 계속 사용할 수 있습니까?
Martin

1
up. 그리고 내 플러그인의 경우 위의 코드는 문제없이 작동합니다. 코드를 실행하는 동안 객체의 유형과 내용을 인쇄하십시오. 디버깅 지원
Curlew

. QgsMapLayerRegistry.instance ()와 함께 일 mapLayers () 값 ().
무하마드 Faizan 칸
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.