GIS

PyQGIS: 공공데이터포털 Open API 서비스 활용 방법 소개

유병혁 2022. 5. 22. 01:23

공간정보는 각종 공공데이터포털을 통해 파일 다운로드나 Open API 형태로 활용할 수 있습니다. Open API(Open Application Programming Interface, 오픈 API)란 누구나 사용할 수 있도록 공개된 API를 뜻하며, 여기서 API는 개발자가 응용프로그램을 개발하는데 쓰이는 인터페이스를 말합니다.

 

Open API 형태의 공간정보는 Open API 호출 URL과 인증키를 입력하면, 원하는 데이터를 XML(eXtensible Markup Language) 또는 JSON(JavaScript Object Notation)과 같은 형태로 제공받아 활용할 수 있습니다.

 

공공데이터포털에서는 공공데이터를 파일데이터나 오픈API 등 다양한 방식으로 제공하고 있습니다. 이번에는 '제주특별자치도_제주오름요약설명’ 데이터를 Open API 형태로 활용해 보겠습니다.

 

공공데이터 포털

국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

www.data.go.kr

 

공공데이터포털에 로그인한 후, ‘제주특별자치도_제주오름요약설명 검색 > 오픈API 탭 > 활용신청’을 클릭합니다.

‘OpenAPI 개발계정 신청’ 페이지에서 활용목적 선택, 라이센스 표시(필수 입력항목: 활용목적 입력, 이용허락범위 동의) 후 ‘활용신청’을 클릭합니다. ‘제주특별자치도_제주오름요약설명’ 데이터는 심의여부가 자동승인이라 신청 후 즉시 활용 가능합니다.

공공데이터포털의 상단메뉴에서 ‘마이 페이지 > 오픈API > 개발계정’을 클릭해 활용신청 승인 상태를 확인합니다.

‘제주특별자치도_제주오름요약설명’ Open API 서비스를 위한 호출 URL과 인증키는 다음 ‘End Point’와 ‘일반 인증키(Decoding)’를 활용하시면 됩니다.

‘활용 명세’ 페이지에서 ‘인증키 설정’을 클릭합니다.

‘Value’에 ‘일반 인증키(Decoding)’를 입력하고 ‘설정’ 버튼을 클릭합니다.

‘닫기’ 버튼을 클릭합니다.

API 목록 페이지의 파란색 영역을 선택한 후 펼침 메뉴에서 ‘Parameters: OpenAPI 실행 준비’ 버튼을 클릭합니다.

‘OpenAPI 호출’ 버튼을 클릭합니다.

Curl과 Request URL 방식의 Open API 서비스를 확인합니다.

이제 Open API 호출 URL과 인증키를 활용하여 QGIS 파이썬 콘솔에서 Open API 레이어를 추가해 보겠습니다. ‘제주특별자치도_제주오름요약설명’ 데이터에 대해 도형은 Point 유형을, 속성은 경도, 위도, 오름명, 위치, 표고 5개 필드를 설정해 봅니다. ‘QGIS_OpenAPI.py’ 스크립트 파일을 활용하시면 됩니다.

QGIS_OpenAPI.py
0.00MB

# 모듈 추가
import requests
import pandas as pd
# Open API 데이터 획득
def get_openapi_data():
    df = pd.DataFrame(columns = ['경도','위도', '오름명', '위치', '표고'])
    page = 1
    while True:
        params = {
            'page': page,
            'perPage': '10',
            'serviceKey': 'FFxi2bmCFyXtw9eRlr23yy0BZ5GlcBnIdG1sjEanvSPT16k0OWoCOMw/by3wMpeFTkx/N2GLJ/hNR3zlpNdDJA==',
        }
        json_obj = requests.get('https://api.odcloud.kr/api/15096996/v1/uddi:6738a90c-ec96-4245-a187-9528cea62904', params=params).json()
        for data in json_obj['data']:
            df_s = pd.DataFrame(data, index=[0]).loc[:, ['경도', '위도', '오름명', '위치', '표고']]
            df = pd.concat([df, df_s])
        if page * 10 < json_obj['totalCount']:
            page += 1
        else:
            return df
# Open API 레이어 추가
def get_openapi_layer(df):
    vl = QgsVectorLayer("Point?crs=EPSG:4326", "OpenAPI 레이어", "memory") # 레이어 설정
    pr = vl.dataProvider()
    pr.addAttributes([QgsField("경도", QVariant.Double),
                      QgsField("위도", QVariant.Double),
                      QgsField("오름명", QVariant.String),
                      QgsField("위치", QVariant.String),
                      QgsField("표고", QVariant.Int)]) # 필드 설정
    vl.updateFields()
    for i in range(len(df)):
        f = QgsFeature()
        f.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(float(df.iloc[i, 0]), float(df.iloc[i, 1]))))
        f.setAttributes([df.iloc[i, 0], df.iloc[i, 1], df.iloc[i, 2], df.iloc[i, 3], df.iloc[i, 4]])
        pr.addFeature(f) # 피처 추가
    vl.updateExtents()    
    return vl
df = get_openapi_data()
vl = get_openapi_layer(df)
QgsProject.instance().addMapLayer(vl) # 레이어 추가
iface.setActiveLayer(vl)
iface.zoomToActiveLayer() # 확대 설정
symbol = QgsMarkerSymbol.createSimple({'name': 'square', 'color': 'red'}) # 심볼 설정
vl.renderer().setSymbol(symbol)
vl.triggerRepaint()
iface.layerTreeView().refreshLayerSymbology(vl.id())

QGIS를 실행하고 ‘탐색기 패널 > XYZ Tiles > VworldBase’ 레이어를 추가합니다. 상단 메뉴에서 ‘플러그인 > 파이썬 콘솔’을 실행하고 파이썬 콘솔 창에서 ‘편집기 보이기’를 클릭합니다.

‘스크립트 열기’ 버튼을 클릭 후 ‘QGIS_OpenAPI.py’를 지정합니다. ‘스크립트 실행’ 버튼을 클릭하면, 소스코드가 실행되면서 레이어 패널 목록에 Open API 레이어가 추가됩니다. 향후에는 ‘QGIS_OpenAPI.py’에 담긴 Open API 호출 URL, 인증키 정보 등을 적절히 변경해 활용하시면 되겠습니다.