PyQGIS를 사용하여 속성 값을 읽는 방법은 무엇입니까?


18

pyqgis를 사용하여 속성 테이블에 포함 된 정보 (예 : 2 열, 2 행)를 얻는 방법은 무엇입니까?


이것은 도움이되지만 속성의 가치 만 제공하는 것 같습니다. 속성은 이름 / 값 쌍이어야합니다. 각 속성의 이름을 어떻게 얻습니까? 이것이 "필드"에 관한 것입니까?
ajpieri

이것은 실제로 질문에 대답하지 않습니다. 다른 질문이 있으면 질문하기를 클릭하여 질문 할 수 있습니다 . 당신은 또한 충분한 명성을 얻은 후에이 질문에 더 많은 관심을 끌기 위해 현상금추가 할 수 있습니다 . - 리뷰에서
Martin Hügi

답변:


43

레이어의 모든 기능을 반복하려면 getFeatures()생성기를 사용하십시오 . QgsFeature레이어 의 피처 반복자 ( )를 반환합니다 .

for feature in layer.getFeatures():
    pass # do something with feature

레이어의 모든 기능 대신 특정 기능에만 관심이있는 경우 a QgsFeatureRequest및 FID를 사용하여 액세스 할 수 있습니다 .

fid = 1 # the second feature (zero based indexing!)
iterator = layer.getFeatures(QgsFeatureRequest().setFilterFid(fid))
feature = next(iterator)

당신은 일단 QgsFeature객체를 당신이 사용할 수있는 attributes()해당 기능 (일명 행), 예와 관련된 (열 또는 필드 일명) 속성을 검색하는 방법 :

# get the feature's attributes
attrs = feature.attributes()
# print the second attribute (note zero based indexing of Python lists)
print(attrs[1])

숫자가 아닌 이름으로 필드를 색인화하려면 필드 맵핑을 사용해야합니다.

idx = layer.fieldNameIndex('name')
print(feature.attributes()[idx])

루프 중에 필드 인덱스는 변경되지 않아야하므로 한 번만 호출하면됩니다.

PyQGIS 쿡북에는 더 많은 정보와 예제가 있습니다 : http://www.qgis.org/pyqgis-cookbook/vector.html#iterating-over-vector-layer

최신 정보

당신은 사용하여 훨씬 더 쉽게 기능 속성에 액세스 할 수 있습니다 QgsFeature유사한 dict, 예를 들어,

for feature in layer.getFeatures():
    name = feature["name"]

어떤 버전이 출시되었는지 또는 항상 존재하는지 확실하지 않습니다.


11

이 문제를 인터넷 검색하면이 질문이 반환되므로 실제로 일부 코드를 추가한다고 생각했습니다. 대부분의 사람들은 빠른 추가 설명이나 코드 스 니펫을 선호하는 많은 추가 정보가있는 페이지로 연결되는 링크를 선호합니다.

테이블의 정보를 얻으려면 먼저 레이어의 기능액세스해야합니다 . 제 경우에는 기능을 변수에 넣었습니다. 그런 다음 기능반복 하고 각 기능에 대해 해당 속성호출 한 다음 열 색인을 사용하여 인쇄 할 수 있습니다 . 예를 들어 두 번째 열의 모든 값을 얻으려면 다음과 같이하십시오.

lyr = iface.activeLayer()

features = lyr.getFeatures()

for feat in features:
    attrs = feat.attributes()
    print attrs[1]

1

위의 답변은 활성 레이어에 대해이 작업을 수행하는 방법 만 보여줍니다. 많은 경우에 활성 레이어가 아닌 레이어 또는 레이어 창에서 확인 된 레이어가 아닌 해당 레이어에 대한 특성을 찾고 싶을 것입니다. 아래 코드는 레이어 창에 추가 한 모든 레이어의 목록을 가져와 (확인 또는 활성 여부에 관계없이) 2 행, 2 열에서 속성을 찾습니다.

from qgis.core import QgsProject

layer = QgsProject.instance().mapLayersByName("myLayerName")[0]
        value = layer.getFeature(2).attribute(2)

참고 mapLayersByName은 지정된 이름의 레이어 목록을 반환합니다. 이 예제에는 하나가 있다고 가정합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.