중요

번역은 여러분이 참여할 수 있는 커뮤니티 활동입니다. 이 페이지는 현재 100.00% 번역되었습니다.

2. 프로젝트 불러오기

힌트

PyQGIS 콘솔을 사용하지 않는 경우 이 페이지에 있는 코드 조각들을 다음과 같이 가져와야 합니다:

1from qgis.core import (
2    Qgis,
3    QgsProject,
4    QgsPathResolver
5)
6
7from qgis.gui import (
8    QgsLayerTreeMapCanvasBridge,
9)

플러그인으로부터 기존 프로젝트를, 또는 (더 자주) 독립 설치형 QGIS 파이썬 응용 프로그램을 개발할 때, 기존 프로젝트를 불러와야 하는 경우가 많습니다. (파이썬 응용 프로그램 참조)

현재 QGIS 응용 프로그램으로 프로젝트를 불러오려면 QgsProject 클래스의 인스턴스를 생성해야 합니다. 이 클래스는 싱글턴(singleton) 클래스이기 때문에, 생성하려면 이 클래스의 instance() 메소드를 사용해야만 합니다. 이 클래스의 read() 메소드를 호출해서 불러올 프로젝트의 경로를 넘겨줄 수 있습니다:

 1# If you are not inside a QGIS console you first need to import
 2# qgis and PyQt classes you will use in this script as shown below:
 3from qgis.core import QgsProject
 4# Get the project instance
 5project = QgsProject.instance()
 6# Print the current project file name (might be empty in case no projects have been loaded)
 7# print(project.fileName())
 8
 9# Load another project
10project.read('testdata/01_project.qgs')
11print(project.fileName())
testdata/01_project.qgs

프로젝트를 (예를 들어 몇몇 레이어를 추가하거나 제거하기 위해) 수정하고 변경 사항을 저장해야 한다면, 프로젝트 인스턴스의 write() 메소드를 호출하십시오. write() 메소드도 프로젝트를 새 위치에 저장하기 위한 선택적인 경로를 입력받습니다.

# Save the project to the same
project.write()
# ... or to a new file
project.write('testdata/my_new_qgis_project.qgs')

read()write() 두 함수 모두 작업 수행이 성공적이었는지 확인할 수 있는 불(boolean) 값을 반환합니다.

참고

QGIS 독립 설치형 응용 프로그램을 작성하고 있는 경우, 불러온 프로젝트를 캔버스와 동기화시키려면 다음 예시에서처럼 QgsLayerTreeMapCanvasBridge 클래스의 인스턴스를 생성해야 합니다:

bridge = QgsLayerTreeMapCanvasBridge( \
         QgsProject.instance().layerTreeRoot(), canvas)
# Now you can safely load your project and see it in the canvas
project.read('testdata/my_new_qgis_project.qgs')

2.1. 경로 오류 해결하기

프로젝트에 불러온 레이어들이 또다른 위치로 옮겨지는 경우가 있을 수 있습니다. 이런 프로젝트를 다시 불러오는 경우 모든 레이어 경로가 깨지게 됩니다. QgsPathResolver 클래스를 사용하면 프로젝트 안에서 레이어 경로를 다시 작성할 수 있습니다.

이 클래스의 setPathPreprocessor() 메소드는 사용자 정의 경로 전처리기(pre-processor) 함수를 설정해서, 경로와 데이터 소스를 파일 참조 또는 레이어 소스로 해석하기 전에 조작할 수 있게 해줍니다.

처리기(processor) 함수는 반드시 (원본 파일 경로 또는 데이터 소스를 표현하는) 단일 문자열 인자를 받아서 해당 경로를 처리한 버전을 반환해야만 합니다. 오류가 발생한 어떤 레이어 처리자(handler)보다도 먼저 이 경로 전처리기 함수를 호출합니다. 전처리기를 여러 개 설정한 경우, 원래 전처리기들이 설정된 순서대로 차례차례 호출할 것입니다.

다음은 몇몇 활용 사례입니다:

  1. 변경된 경로를 대체:

    def my_processor(path):
        return path.replace('c:/Users/ClintBarton/Documents/Projects', 'x:/Projects/')
    
    QgsPathResolver.setPathPreprocessor(my_processor)
    
  2. 새 데이터베이스 호스트 주소로 대체:

    def my_processor(path):
        return path.replace('host=10.1.1.115', 'host=10.1.1.116')
    
    QgsPathResolver.setPathPreprocessor(my_processor)
    
  3. 저장된 데이터베이스 인증 정보를 새 정보로 대체:

    1def my_processor(path):
    2    path= path.replace("user='gis_team'", "user='team_awesome'")
    3    path = path.replace("password='cats'", "password='g7as!m*'")
    4    return path
    5
    6QgsPathResolver.setPathPreprocessor(my_processor)
    

마찬가지로, 경로 작성자 함수에 setPathWriter() 메소드를 사용할 수 있습니다.

경로를 변수로 대체하는 예시입니다:

def my_processor(path):
  return path.replace('c:/Users/ClintBarton/Documents/Projects', '$projectdir$')

QgsPathResolver.setPathWriter(my_processor)

두 메소드 모두 전처리기 또는 메소드가 추가한 작성자를 제거하는 데 사용할 수 있는 id 를 반환합니다. removePathPreprocessor()removePathWriter() 를 참조하세요.

2.2. 속도 향상을 위해 플래그 사용하기

완전하게 기능하는 프로젝트를 사용할 필요는 없고 특정한 이유 때문에 프로젝트에 접근만 하면 되는 경우, 플래그가 도움이 될 수도 있습니다. ProjectReadFlag 클래스 아래에서 전체 플래그 목록을 찾아볼 수 있습니다. 플래그 여러 개를 함께 추가할 수도 있습니다.

예를 들어 실제 레이어와 데이터에는 관심이 없고 (예를 들면 조판 또는 3D 뷰 설정 때문에) 단순히 프로젝트에 접근만 하고 싶은 경우, 데이터 무결성 검증 단계를 뛰어넘고 오류가 발생한 레이어 대화창이 열리는 일을 방지하려면 DontResolveLayers 플래그를 다음 코드처럼 사용하면 됩니다:

readflags = Qgis.ProjectReadFlags()
readflags |= Qgis.ProjectReadFlag.DontResolveLayers
project = QgsProject.instance()
project.read('C:/Users/ClintBarton/Documents/Projects/mysweetproject.qgs', readflags)

플래그를 더 많이 추가하려면 반드시 파이썬 비트 연산자(bitwise operator) OR(|)를 사용해야만 합니다.