본문 바로가기
GIS

[QGIS] 여러 shp 파일 한번에 불러오기 (기존 레이어 복제후 연결)

2024. 7. 18.

상황 :

  • 기존 레이어를 복제해서(특성을 그대로 살린채) shp 파일을 연결하고자 한다. shp파일 수만큼 레이어가 복제될 것이다. 기존 복제할 레이어명은 "1". 아래 작업은 시도별 shp 파일을 모두 한번에 불러오는 경우에 편리하게 쓸 수 있다.
  • shp파일은 지정한 폴더에 하위폴더로 여러 폴더 안에 들어있고 다수이다.

 

아래 코드를 QGIS 파이썬 창에서 실행시킨다.

 

import os
from qgis.core import (
    QgsProject,
    QgsVectorLayer,
    QgsDataSourceUri
)

# Shapefile이 저장된 디렉토리 경로 (raw string 사용)
directory_path = 'C:/Users/Username/Documents/지도/shp/'

# 경로가 존재하는지 확인
if not os.path.exists(directory_path):
    print(f"The directory path '{directory_path}' does not exist.")
else:
    # 모든 하위 디렉토리까지 포함한 Shapefile 불러오기
    shapefiles = []
    for root, dirs, files in os.walk(directory_path):
        for file in files:
            if file.endswith('.shp'):
                shapefiles.append(os.path.join(root, file))

    # QGIS 프로젝트 인스턴스 가져오기
    project = QgsProject.instance()

     # "1" 레이어 찾기
    original_layer = None
    for layer in project.mapLayers().values():
        if layer.name() == "1":
            original_layer = layer
            break

    if original_layer is None:
        print("Layer '1' not found!")
    else:
        # Shapefile별로 "1" 레이어 복제 및 데이터 연결
        for shapefile in shapefiles:
            layer_name = os.path.splitext(os.path.basename(shapefile))[0]
            print(f"Processing Shapefile: {shapefile}")

            # "1" 레이어 복제
            clone_layer = original_layer.clone()
            clone_layer.setName(layer_name)

            # 복제된 레이어의 데이터 소스 변경
            clone_layer.setDataSource(shapefile, layer_name, 'ogr')

            # 프로젝트에 추가
            project.addMapLayer(clone_layer)
            print(f"Layer {layer_name} loaded successfully.")

    print("All shapefiles have been processed.")

댓글