PyQGIS에서 이름으로 레이어를 가져 오시겠습니까?


15

거리를 제공하면 도시 목록에 대한 버퍼를 찾는 플러그인이 있습니다. 시 /도 이름은 속성 테이블에서 가져 오며 그에 따라 필터링됩니다. 내가 원하는 것은 내 플러그인은 캔버스에있는 다른 레이어와 상관없이 캔버스에서 레이어의 레이어 이름 또는 순서를 식별하고 해당 레이어에서 해당 속성에 액세스해야합니다.

다른 레이어가 있지만 코드에서 특정 레이어 이름을 가리키는 것이 반복 오류를 유발하는지 궁금합니다.

아래 코드는 어디에서 변경해야하며 변경 내용은 무엇입니까?

    if dist and centerCity:
        #QMessageBox.information(self.dlg, "info", "both True")
        st = '"name" = \'' + centerCity + '\''
        exp = QgsExpression(st)
    else:
        QMessageBox.warning(self.dlg, "Enter the distance","Enter the distance and try again.")        
        return          #terminate the function

    layer = self.iface.activeLayer() 
    it = layer.getFeatures(QgsFeatureRequest(exp))
    feature = it.next()
    mbuf = feature.geometry().buffer(dist, 2)       

    iterFeat = layer.getFeatures()

    for f in iterFeat:
        geom2 = f.geometry()
        valTest = QgsGeometry.within(geom2, mbuf)

답변:


41

업데이트 : 10.04.2018

사용 3.x를 QGIS 당신이 사용할 수 mapLayersByName에서 방법을 QgsProject이런 식으로 클래스를 :

layers = QgsProject.instance().mapLayersByName('my layer name')

QGIS의 레이어 패널에서 이름이 같은 여러 레이어를 가질 수 있으므로 위의 방법으로 일치하는 레이어 목록을 제공합니다.


대한 QGIS 2.x를 :

레이어에 다른 이름과 구별 할 수있는 이름이 있는지 확인하면됩니다. 대신 다음을 layer = self.iface.activeLayer()수행하십시오.

layer=None
for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.name() == "YOUR_LAYER_NAME":
        layer = lyr
        break

레이어 이름을 신뢰할 수없는 경우 (결국 사용자가 언제든지 변경할 수 있음) 레이어 소스를 확인할 수 있습니다. 레이어가 셰이프 파일 인 경우 다음과 같이 셰이프 파일의 경로를 확인할 수 있습니다.

layer=None
for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.source() == "/path/to/shapefile.shp":
        layer = lyr
        break

편집 : @Jakob이 주석에서 지적했듯이 첫 번째 블록을 한 줄에 작성할 수 있습니다.

layerList = QgsMapLayerRegistry.instance().mapLayersByName("YOUR_LAYER_NAME")

또는:

layerList = [lyr for lyr in QgsMapLayerRegistry.instance().mapLayers().values() if lyr.name() == "YOUR_LAYER_NAME"]

어쨌든 layerList첫 번째 요소에 액세스하기 전에 비어 있지 않은지 확인해야합니다 .

if layerList: 
    layer = layerList[0]

2
print [lys.name () == "LAND"] [0] .name () 인 경우 QgsMapLayerRegistry.instance (). mapLayers (). values ​​()에서 lyr에 대한 lyr
Jakob

7
layer = QgsMapLayerRegistry.instance (). mapLayersByName ( "mylayername") [0]
Jakob

layer = none코드 시작 부분에서 왜 설정 합니까? 특히 기능에 있다면 불필요 해 보입니다
user32882

1
for 안에 if가 있기 때문에 기본값입니다. if가 절대로 충족되지 않으면 for 후에 레이어가 전혀 존재하지 않습니다. 나중에 레이어 변수를 읽을 수 있는지 확인하십시오.
Germán Carrillo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.