지리 데이터를 통해 지도에 행정구역 경계를 표시할 수 있는 folium 라이브러리의 사용법을 소개하려고 합니다.
0. 설치
pip install folium
1. 데이터
대한민국 행정동 경계 또는 통계청 API를 통해 받을 수 있습니다. 저는 API를 사용해서 데이터를 받았습니다.
params = {
'accessToken': access_token,
'year':'2021',
'adm_cd':code, # 행정구역코드 2(시) or 5(구) or 8(행정동) 자리
'low_search':1 # 하위 정보 단계
}
res = requests.get('https://sgisapi.kostat.go.kr/OpenAPI3/boundary/hadmarea.geojson',params=params).json()
데이터를 가공하여 최종적으로 위 형태와 같이 변환해 주면 됩니다. 서울시의 426개 행정동 데이터가 있고 'coordinates' 안에 행정구역경계에 대한 위치정보가 리스트 형태로 저장돼 있습니다.
※ 다만 여기서 주의해야 할 점은 API를 통해 얻은 데이터는 UTM-K좌표계이기 때문에 WGS84 좌표계를 사용하는 folium에서는 사용할 수 없습니다. 따라서 UTM-K좌표계에서 WGS84 좌표계로 변환해주어야 합니다. (데이터가 평소에 보던 위도, 경도 데이터가 아닌 것 같으면 WGS84 좌표계가 아닐 확률이 높습니다.)
from pyproj import Transformer
transformer = Transformer.from_crs("EPSG:5178", "EPSG:4326") # UTM-K좌표계에서 WGS84좌표계로 변환
x1, y1 = geo_json['features'][0]['geometry']['coordinates'][0][0][1],geo_json['features'][0]['geometry']['coordinates'][0][0][0]
transform_list = list(transformer.transform(geo_json['features'][0]['geometry']['coordinates'][0][0][1], geo_json['features'][0]['geometry']['coordinates'][0][0][0]))
x2, y2 = transform_list[1], transform_list[0]
print(f'({round(x1,2)},{round(y1,2)}) change to ({round(x2,2)},{round(y2,2)})')
(1953335.74,953553.93) change to (126.97,37.58)
2. 사용법
2-1) 서울시 중심의 위도와 경도를 입력하여 맵을 생성 합니다.
seoul_map = folium.Map(location=[37.5502,126.982],tiles='cartodbpositron',zoom_start = 12)
2-2) 경계 데이터를 넘겨주고 키값으로 행정동 코드(adm_cd)를 넣어주면 완성됩니다.
seoul_map.choropleth(geo_data=geo_json,
key_on='properties.adm_cd',
highlight=True,
fill_opacity=0.05,
line_opacity=1,
fill_color='PuRd')
seoul_map
2-3) 마커를 추가할 수도 있고 html을 삽입하여 팝업창을 보여줄 수도 있습니다.
folium.Marker([y2, x2],
popup='<iframe width="560" height="315" src="https://www.siksinhot.com/search?keywords=%EC%A2%85%EB%A1%9C%EA%B5%AC+%EC%82%AC%EC%A7%81%EB%8F%99+%EB%A7%9B%EC%A7%91" title="food list" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>',
tooltip="마커").add_to(seoul_map)
seoul_map
'Python' 카테고리의 다른 글
[Python] 언어모델의 출력을 스트리밍 방식으로 출력하기 (1) | 2023.06.11 |
---|---|
[Python] PEFT 라이브러리 알아보기 (0) | 2023.05.29 |
[Python] selenium 사용 시 chromedriver 자동 업데이트하기 (0) | 2023.02.12 |
[Python] Faiss, 효율적인 유사도 검색 엔진 (1) | 2022.09.30 |
[Python] 페이지랭크 알고리즘 (0) | 2022.08.14 |