pyQGIS를 이용한 벡터 데이터 처리 2 : 레이어 추가 및 삭제

SHP 파일 등과 같은 벡터 데이터를 레이어로 추가하는 코드는 다음과 같습니다.

layer = QgsVectorLayer("D:/__Data__/세종특별자치시_36000/TL_SPRD_MANAGE.shp", "TL_SPRD_MANAGE")
QgsProject.instance().addMapLayers([layer])

실행 결과는 다음과 같습니다. 레이어를 추가할 때 추가된 레이어가 바로 지도뷰에 꽉 차게 표시하기 위한 코드는 다음과 같습니다.

canvas = iface.mapCanvas()
extent = layer.extent()
canvas.setExtent(extent)

추가한 레이어에 대한 객체를 얻는 코드는 다음과 같습니다.

layers = QgsProject.instance().mapLayersByName("TL_SPRD_MANAGE")
print(len(layers), layers[0].name())

레이어의 이름으로 객체를 얻는 것인데, 레이어의 이름은 중복될 수 있으므로 동일한 이름이라도 여러개의 레이어 객체가 참조 될 수 있습니다.

추가한 레이어를 삭제하는 코드는 다음과 같습니다.

layers = QgsProject.instance().mapLayersByName("TL_SPRD_MANAGE")
QgsProject.instance().removeMapLayer(layers[0].id())

레이어의 이름은 중복될 수 있으므로 실제 삭제 시에는 레이어의 ID 값을 지정하여 삭제해야 합니다.

추가된 모든 레이어를 삭제하는 코드는 다음과 같습니다.

QgsProject.instance().removeAllMapLayers()

pyQGIS를 이용한 벡터 데이터 처리 1 : Message, Progress 출력

QGIS 프로그램 안에서 사용자에게 어떤 메세지를 전달하고자 할 때의 코드의 예는 다음과 같습니다.

iface.messageBar().pushMessage("안녕하세요, pyQGIS")

실행 결과는 QGIS의 맵영역 상단에 표시되며 다음과 같습니다.

iface의 messageBar를 통한 pushMessage 매서드는 더 많은 인자를 받을 수 있습니다. 다음 코드를 보면요.

iface.messageBar().pushMessage(
    "환영", 
    "안녕하세요, pyQGIS",
    level=Qgis.Success,
    duration=5
)

아래의 실행 결과를 통해 각 인자의 의미를 유추할 수 있습니다.

세번째와 네번째 인자에 대해 언급하면 먼저 level 인자는 4가지 값을 가질 수 있습니다. Qgis.Critical, Qgis.Warning, Qgis.Info, Qgis.Success이며 각각 에러 메세지, 경고 메세지, 정보 메세지, 성공 메세지에 대한 아이콘을 표시해 줍니다. 그리고 duration은 메세지를 몇초간 표시하고 사라지게 할지 지정할 수 있습니다.

QGIS에서는 시간이 오래 걸리는 연산이 많이 수행됩니다. 이때 수행되는 연산의 진행율을 사용자에게 알려주는 코드는 다음과 같습니다.

import time

progressMessageBar = iface.messageBar().createMessage("처리 메세지")

progress = QProgressBar()
progress.setMaximum(100)
progressMessageBar.layout().addWidget(progress)

iface.messageBar().pushWidget(progressMessageBar, Qgis.Info)

for i in range(100):
    time.sleep(0.01)
    progress.setValue(i + 1)

time.sleep(0.01)을 100번 호출하므로 1초에 걸쳐 최대 100까지 값을 증가시켜 진행율을 표시합니다. 실행결과는 다음과 같습니다.