GIS

QGIS 파이썬 콘솔(PyQGIS)에서 연속지적도형 제어하기

유병혁 2021. 3. 23. 19:06

안녕하세요? 이번 글은 QGIS 파이썬 콘솔(PyQGIS)에서 연속지적도형을 제어하는 과정을 정리해 보겠습니다.

연속지적도형과 같은 주제도에서 반복 작업을 하는 경우, PyQGIS가 업무 자동화에 도움이 되실 것 같습니다.

 

먼저, 연속지적도형을 하나 받아보겠습니다. 국가공간정보포털 '국가중점데이터'에 접속합니다.

 

국가공간정보포털

국가중점데이터 전체 국가중점데이터가 36건 입니다. 공간융합 개방데이터(17년)   -  4건 API SHP CSV API SHP CSV API SHP CSV API SHP CSV 국가공간 개방데이터(16년)   -  12건 API SHP API SHP CSV API SHP CSV AP

openapi.nsdi.go.kr

부동산 개방데이터 목록 중 '연속지적도형정보(SHP)'를 클릭합니다.

시도는 '세종특별자치시', 구분은 '전체데이터'를 선택한 후 '조회' 버튼을 클릭해 보겠습니다. 'SHP'를 다운로드합니다.

QGIS를 실행하고 상단 메뉴 바 중 '플러그인 > 파이썬 콘솔'을 클릭합니다.

이제 콘솔 창에서 코드를 실행해 보시면 되겠습니다.

PyQGIS Developer Cookbook이 코드 작성의 기본이 됩니다. 자, 그럼 시작해볼까요?!

 

PyQGIS Developer Cookbook — QGIS Documentation documentation

© Copyright 2002-now, QGIS project. Last updated on Mar 23, 2021 10:01.

docs.qgis.org

먼저, 연속지적도형 레이어를 추가합니다.

# 연속지적도형 레이어 추가
cadLyr = QgsVectorLayer('D:/GEODATA/AL_36_D002_20210323.shp', 'AL_36_D002_20210323', 'ogr')
if cadLyr.isValid():
    QgsProject.instance().addMapLayer(cadLyr)

'채우기 색상'도 코드로 제어가 가능한데요, 색상 확인은 아래 코드를 실행하시면 됩니다.

# 색상 확인
QColor().colorNames()

저는 'whitesmoke' 색상을 채우기 색상으로 적용해 보겠습니다.

# 색상 적용
renderer = cadLyr.renderer()
symbol = renderer.symbol()
symbol.setColor(QColor('whitesmoke'))
cadLyr.triggerRepaint()
iface.layerTreeView().refreshLayerSymbology(cadLyr.id())

연속지적도형 속성 테이블은 아래와 같은데요,

여기서 "A5" 필드값이 '23-247천'과 일치하는 객체를 선택하고 '선택 객체 범위로 확대'해 보겠습니다.

# 속성으로 객체 선택
cadLyr.selectByExpression("\"A5\"='23-247천'")
iface.actionZoomToSelected().trigger()

선택한 객체를 ESRI Shapefile로 저장하는 코드는 아래와 같습니다.

인코딩('utf-8')과 좌표계(4326)를 함께 지정한 것을 확인하실 수 있습니다.

# ESRI Shapefile로 저장
newLyr =  QgsVectorFileWriter.writeAsVectorFormat(cadLyr,
    r'D:\GEODATA\NewSHP.shp', 'utf-8', 
    QgsCoordinateReferenceSystem(4326), 'ESRI Shapefile', bool(True))

이번에는 선택한 객체를 AutoCAD DXF로 저장해 보겠습니다. 코드는 다음과 같습니다.

# AutoCAD DXF로 저장
newLyr =  QgsVectorFileWriter.writeAsVectorFormat(cadLyr,
    r'D:\GEODATA\NewCAD.dxf', 'utf-8', 
    QgsCoordinateReferenceSystem(4326), 'DXF', onlySelected=True, skipAttributeCreation=True)

DXF는 EPSG:4326으로 저장되었지만 레이어 좌표계는 정의되지 않음을 확인하실 수 있습니다.

레이어 좌표계를 지정해 줘야 할 텐데요, CRS 설정을 PyQGIS로 간단히 처리하실 수 있습니다.

아래와 같이 EPSG:4326을 지정하여 레이어를 추가해 주시면 됩니다. DXF 파일이 잘 매칭됐죠?!

# DXF 레이어 추가(CRS 설정)
dxfLyr = QgsVectorLayer('D:/GEODATA/NewCAD.dxf', 'NewCAD', 'ogr')
dxfLyr.setCrs(QgsCoordinateReferenceSystem(4326, QgsCoordinateReferenceSystem.EpsgCrsId))
if dxfLyr.isValid():
    QgsProject.instance().addMapLayer(dxfLyr)

참고로 QGIS 파이썬 콘솔 이용 시 참고가 되는 웹페이지들을 링크해 봅니다.

[1] GDAL: 대부분의 경우, GDAL로 다 해결됩니다. gdal.org/gdal.pdf은 제본해두면 도움이 됩니다.

 

GDAL — GDAL documentation

 

gdal.org

[2] Python OGR/GDAL Cookbook: Jared Erickson(자레드 에릭슨)님이 제공하시는 쿡북입니다.

 

Welcome to the Python GDAL/OGR Cookbook! — Python GDAL/OGR Cookbook 1.0 documentation

 

pcjericks.github.io

[3] Open Source RS/GIS Python: 유타주립대학교 RS/GIS Laboratory에서 제작한 강의 교안(ospy_slide*)입니다.

 

Index of /~chrisg/python/2009/lectures

 

www.gis.usu.edu

[4] GIS Stack Exchange: 말이 필요없겠죠?! PyQGIS 관련 구글링 결과의 대부분은 이 웹페이지에 착륙할 겁니다.

 

Geographic Information Systems Stack Exchange

Q&A for cartographers, geographers and GIS professionals

gis.stackexchange.com