QGIS Python에서 맵 레이어를 반복합니까?


30

지도 레이어를 반복하는 방법을 알아내는 데 어려움을 겪고 있습니다. 목차에서 현재 강조 표시된 레이어에 액세스 할 수 iface.activeLayer()있지만 코드가 모든 레이어에서 작동하기를 원합니다.

이 기능에 쉽게 액세스 할 수 있고 좋은 온라인 예를 찾을 수 없지만 뭔가를 놓친 API가 아무것도 보이지 않습니까?


QgsMapLayerRegistry 또는 QgsProject를 어떻게 사용하고 있는지 모르겠습니다. QGIS 3.0.2에서는 작동하지 않습니다. 그러나 iface.mapCanvas (). layers ()는 않습니다. 글쎄요 활성 레이어 (레이어 창에서 확인한 레이어) 만 제공하는 것 같습니다. 누구나 레이어 패널에서 선택하지 않은 레이어를 포함하여 모든 레이어 목록을 얻는 방법을 알고 있습니까? 또한 플러그인 빌더를 사용하는 경우 플러그인 쉘이 작성됩니다. 실행 기능에는 "self"매개 변수가 있으며 iface를 사용하는 데 필요합니다. 즉 self.iface.mapCanvas (). layers (), 단지 fyi.
ajpieri

답변:


24

시험...

# substitute 'self' with 'qgis.utils.iface' when run from Python console
# 'self.iface = iface' would usually precede this command in your class 
layers = self.iface.legendInterface().layers()

for layer in layers:
    layerType = layer.type()
    if layerType == QgsMapLayer.VectorLayer:
        # do some stuff here

에서 발췌 consolidatethread.py 에서 QConsolidate 플러그인 .

legendInterface ()에서 반환 된 QgsLegendInterface 객체에 대한 설명입니다 .

편집 : 위의 'self'에 대한 정보를 추가했습니다.


감사! 그 트릭을했다. 범례가 맵 레이아웃의 객체이고 목차가 레이어 목록을 나타내는 ESRI 세계에 너무 익숙하다고 생각합니다.
spencerrecneps

2
이것과 Nathan이 언급 한 mapCanvas () 테크닉 사이에 리턴되는 내용에는 차이가 있습니다. legendInterface () 객체는지도 캔버스에 표시되지 않은 경우에도 모든 레이어를 반환하지만 mapCanvas ()는 캔버스에 표시된 레이어 만 반환합니다. mapCanvas ()를 사용하면 보이는 레이어에 대한 참조를 얻을 수있는 좋은 방법입니다.
dakcarto

1
또 다른 참고로, 최신 버전의 QGIS (> = 1.8)를 사용하면 범례에 나열된 순서와 별도로 레이어의 렌더링 순서를 정의 할 수 있습니다 (매우 훌륭합니다!). legendInterface () 및 mapCanvas () 메서드는 각각에 대한 레이어 순서를 반환합니다.
dakcarto

19

다른 두 가지 방법이 있습니다.

layers = self.iface.mapCanvas().layers()

레이어 목록을 제공합니다

또는

layers = QgsMapLayerRegistry.instance().mapLayers()

for name, layer in layers.iteritems():
     print name, layer.type()

이 답변은 2.16이상 작동하지 않는 것 같습니다
raphael

10

QGIS 2.6의 경우 각 계층을 식별하고 그룹화하는 코드는 다음과 같습니다.

#make the desired groups for layers
toc = self.iface.legendInterface()
root = QgsProject.instance().layerTreeRoot()
group1 = root.insertGroup(0, "Group Point")
group2 = root.insertGroup(1, "Group Line")
group3 = root.insertGroup(2, "Group Polygon")
#get the list of layers  from registry
layers = QgsMapLayerRegistry.instance().mapLayers()
#segregate layers into groups 
for name, layer in layers.iteritems():
    # check the layer geometry type 
    if layer.geometryType() == QGis.Point:
        toc.moveLayer(layer, 0)

    if layer.geometryType() == QGis.Line:
        toc.moveLayer(layer, 1)

    if layer.geometryType() == QGis.Polygon:
        toc.moveLayer(layer, 2)

참고 : 그룹화 후 중복 레이어를 제거해야합니다 root.removeLayer(lyr).


9

QGIS 3 QgsMapLayerRegistry의 기능이로 이동되었습니다 QgsProject.

따라서 맵 레이어를 반복하려면 해당 구조를 사용해야합니다.

layers = QgsProject.instance().mapLayers()

.mapLayers()로 구조화 된 사전을 반환합니다 {layer_x_id: layer_x, layer_y_id: layer_y, ....}. 그런 다음 다음과 같은 레이어를 반복 할 수 있습니다.

for layer_id, layer in layers.items():
    print(layer.name())

.mapLayers()사전 ( dict)을 반환 하기 때문에이 경우 레이어가 포함 .values()된을 반환하는 사전 방법을 사용할 수도 있습니다 list. 그런 다음 다음과 같은 레이어를 반복 할 수 있습니다.

layers = QgsProject.instance().mapLayers().values()

for layer in layers:
    print(layer.name())

원하는 경우 다음과 같이 반복 할 수 있습니다.

layers = QgsProject.instance().mapLayers() # dictionary

for layer in layers.values():
    print(layer.name())

안녕! 공유해 주셔서 감사합니다. 레이어의 이름을 인쇄하는 것은 잘 작동하지만 사전의 키를 인쇄 할 수 없습니다. 저 좀 도와 주실 래요?
caio villaca

1
for layer in layers: print(layer)스크립트를 사용하여 키를 인쇄 할 수 있습니다. 또는 루프 print(layers.keys())없이 사용하십시오 for.
Kadir Şahbaz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.