안녕하세요? 이번 글은 "첫 번째 QGIS 플러그인 만들기" 시리즈 세번째로, "사용자 인터페이스 추가"에 대해 다뤄봅니다. 이 시리즈는 Spatial Thoughts 우자발 간디(Ujaval Gandhi) "Building Your First QGIS Plugin (Full Workshop)" 내용을 재정리한 것입니다. 유익한 콘텐츠를 공유해 주신 우자발 간디 님께 감사드리며, 시작해 보겠습니다.
Vworld 레이어 선택 기능 추가
이번에는 콤보박스를 추가하고, Vworld 레이어들을 선택하여 추가할 수 있는 기능을 제작해 보겠습니다. main.py 파일에서 아래와 같이 코드를 추가합니다.
from PyQt5.QtWidgets import QAction, QComboBox, QLabel, QPushButton
# 사용할 모든 베이스맵과 해당 URL을 포함하는 딕셔너리 생성
osm = 'https://tile.openstreetmap.org/{z}/{x}/{y}.png'
vworld_base = 'https://xdworld.vworld.kr/2d/Base/service/{z}/{x}/{y}.png'
vworld_hybrid = 'https://xdworld.vworld.kr/2d/Hybrid/service/{z}/{x}/{y}.png'
vworld_midnight = 'https://xdworld.vworld.kr/2d/midnight/service/{z}/{x}/{y}.png'
vworld_satellite = 'https://xdworld.vworld.kr/2d/Satellite/service/{z}/{x}/{y}.jpeg'
vworld_white = 'https://xdworld.vworld.kr/2d/white/service/{z}/{x}/{y}.png'
BASEMAPS = {
'OpenStreetMap': osm,
'VworldBase': vworld_base,
'VworldHybrid': vworld_hybrid,
'VworldMidnight': vworld_midnight,
'VworldSatellite': vworld_satellite,
'VworldWhite': vworld_white
}
플러그인이 로드/언로드될 때 호출되는 initGui()와 unload() 메서드는 아래와 같이 수정하고, 끝으로 run() 메서드도 변경해 주시면 됩니다.
def initGui(self):
# 툴바 생성
self.basemapToolbar = self.iface.addToolBar('Basemap Selector')
# 로고가 있는 액션 생성
icon = os.path.join(os.path.join(cmd_folder, 'logo.png'))
self.action = QAction(QIcon(icon), 'Load Basemap', self.basemapToolbar)
# 레이블 생성
self.label = QLabel('Select a basemap', parent=self.basemapToolbar)
# 드롭다운 메뉴 생성
self.basemapSelector = QComboBox(parent=self.basemapToolbar)
self.basemapSelector.setFixedWidth(150)
# 드롭다운 메뉴에 모든 베이스맵 이름 추가
for basemap_name in BASEMAPS.keys():
self.basemapSelector.addItem(basemap_name)
# 툴바에 모든 위젯 추가
self.basemapToolbar.addWidget(self.label)
self.basemapToolbar.addWidget(self.basemapSelector)
self.basemapToolbar.addAction(self.action)
# run() 메서드를 액션과 연결
self.action.triggered.connect(self.run)
def unload(self):
del self.basemapToolbar
def run(self):
selected_basemap = self.basemapSelector.currentText()
basemap_url = BASEMAPS[selected_basemap]
zmin = 0
zmax = 19
crs = 'EPSG:3857'
uri = f'type=xyz&url={basemap_url}&zmax={zmax}&zmin={zmin}$crs={crs}'
rlayer = QgsRasterLayer(uri, selected_basemap, 'wms')
if rlayer.isValid():
QgsProject.instance().addMapLayer(rlayer)
self.iface.messageBar().pushSuccess('Success', 'Basemap Layer Loaded')
else:
self.iface.messageBar().pushCritical('Error', 'Invalid Basemap Layer')
자, 이제 Vworld 레이어를 선택한 후, 해당 레이어를 레이어 패널에 추가할 수 있습니다.
- 첫 번째 QGIS 플러그인 만들기 - (1) 플러그인 생성
- 첫 번째 QGIS 플러그인 만들기 - (2) 핵심 기능 추가
- 첫 번째 QGIS 플러그인 만들기 - (3) 사용자 인터페이스 추가
- 첫 번째 QGIS 플러그인 만들기 - (4) 플러그인 패키징 및 공유