Python을 사용하여 QGIS에서 선택한 기능 중 하나의 데이터를 얻습니까?


10

파이썬과 QGIS에 관한 문제 / 질문이 있습니다. 파이썬을 사용하여 QGIS에서 하나의 선택된 기능의 데이터를 얻을 수 있습니까? 그렇다면 어떻게합니까?

내 예에서는 도시 계획을위한 소포를 보여주는 레이어가 있습니다. 이제 소포 중 하나를 선택하면 정확히이 소포의 데이터를 가져 오려고합니다. 이 데이터는 파이썬 스크립트로 읽은 다음 자동으로 생성 된 PDF 파일에 추가해야합니다. 마지막 단계는 쉽지만 선택한 기능에서 데이터를 얻지 못했습니다.

활성 레이어에서 데이터를 가져올 수 있지만이 레이어의 선택된 하나의 기능에서 데이터를 가져올 수도 있습니까?

당신이 나를 도울 수 있기를 바랍니다. 문안 인사

답변:


15

통화 layer.selectedFeatures()하면 선택한 기능이있는 목록이 반환됩니다. 그런 다음 feature.attributeMap()선택한 각 기능을 호출 하여 각 기능의 속성 사전을 얻을 수 있습니다.

layer = qgis.utils.iface.activeLayer()
selected_features = layer.selectedFeatures()
for i in selected_features:
    attrs = i.attributeMap()
    for (k,attr) in attrs.iteritems():
    print "%d: %s" % (k, attr.toString())

나는 최근 비슷한 질문에 대답했다 : pyqgis로 벡터 레이어를 반복 할 때 기능이 선택되었는지 어떻게 확인합니까?


이상은 QgsFeature합니다 ... selected_features의 결과가 어떤 형상 방법이 없다고 객체
user32882

9

버전 2.0 이후의 QGIS Python API 변경 사항을 고려하여 이전 답변에 대한 업데이트를 게시하고 싶었습니다 .

이전과 같이을 사용하여 선택한 기능 목록을 볼 수 iface.activeLayer().selectedFeatures()있지만 QGIS버전에서는 >= 2.0이제 QgsFeature.attributes()대신 기능을 사용합니다 QgsFeature.attributeMap(). 두 함수는 정확히 동일하지 않습니다. attributes()이제 list를 반환하고 , old attributeMap()dictionary를 반환했습니다 . 에 대한 API 문서를 찾아 잠시 시간을내어 QgsFeature.attributes(), QgsAttributes등이 속성은 저장 / 접근하는 방법을 이해하기를.

관심이 있으시면이 메일 링리스트 스레드에서 API 변경 사항에 대한 이론적 근거에 대해 읽어보십시오 : [Qgis-developer] 새로운 벡터 API 선택 기능 . 간단히 (QGIS 개발자 Martin Dobias의 말로) :

속성에 대한 액세스 : f.attributeMap()이제 속성이 list맵 (Python :) 대신 벡터 (Python :)에 저장되므로 더 이상 존재하지 않습니다 dict. QgsFeature클래스는 파이썬 컨테이너 객체 4를 에뮬레이션 하므로 QgsFeature인스턴스가 목록 또는 사전 인 것처럼 속성에 액세스 할 수 있으며 키는 필드 인덱스 또는 필드 이름입니다.

f[0] ... 첫 번째 속성

f["type"] ... "type"이라는 속성

모든 속성을 가져올 수 f.attributes()있습니다. 값 목록을 반환합니다.

따라서 수행 방법을 구체적으로 요청한 예 (선택한 단일 기능에 대한 데이터 가져 오기) city에 특성을 포함하여 각 특성 목록이있는 기능이 포함 된 계층이 있다고 가정 county합니다. county선택한 특정 도시 의 값 을 얻으려면 (예 Helena, AR:) Python 콘솔에서 다음을 수행하십시오.

city = iface.activeLayer().selectedFeatures()[0]
city["county"]
# OUTPUTS: u'Phillips'

도시의 속성 테이블에있는 모든 필드의 값을 원하면 다음을 사용하십시오.

cityData = city.attributes()

또한이 예제에서 city.fields (). names ()를 사용하여 필드 이름 목록을 반환하는 모든 필드 이름을 가져올 수 있습니다.
캐리 H

1

J. Taylor가 제공 한 답변에 유용한 것을 추가하고 2012 년 현재 수락 된 답변이 더 이상 정확하지 않다고 지적하고 싶습니다.

QgsFeature 객체는 __geo_interface__주어진 속성에서 사전을 반환하는 유용한 속성을 지원합니다 . 사전은 실제로 GeoJSON 표준에 있으므로 모든 속성 값 쌍과 지오메트리가 포함됩니다. 이 기능 은 2012 년 언젠가 Sean Gillies에 의해 처음 설명사용법으로 여기에 사용됩니다 . 사용 가능한 QGIS 버전 정보를 찾을 수없고 아직 QGIS 3을 시도하지는 않았지만 적어도 QGIS 2.14에서 구할 수있었습니다.

TL; DR :

layer = qgis.utils.iface.activeLayer()
selected_features = layer.selectedFeatures()
for i in selected_features:
    attrs = i.__geo_interface__
    print attrs # GeoJSON attributes of a feature
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.