융무의 기술블로그
article thumbnail

https://mjs1995.tistory.com/169?category=802136

 

[python][folium] geojson을 이용한 지도그리기 (1)

원하는 형태의 시군을 이용하여 229개의 시군 지도를 만들어 보려고한다. python을 이용해서 folium 작업을 하기 이전에 geojson 파일을 다운받는 방법부터 설명하려고 한다. www.gisdeveloper.co.kr/?p=2332 대

mjs1995.tistory.com

앞에서 만든 geojson 파일을 가지고 Python Mapbox을 이용한 지도 시각화를 하려고 합니다.

 

데이터는 Kosis에 있는 2018년도 시군구별 인구수 데이터를 이용하려고 합니다.

http://kosis.kr/statHtml/statHtml.do?orgId=101&tblId=DT_1B040A3&vw_cd=MT_ZTITLE&list_id=A_7&seqNo=&lang_mode=ko&language=kor&obj_var_id=&itm_id=&conn_path=MT_ZTITLE

 

KOSIS

 

kosis.kr

Mapbox를 이용한 지도시각화

Mapbox는 지도 API를 이용하여 Polygon 형태의 geojson파일 시각화를 해보겠습니다. Mapbox 지도시각화의 다양한 예제들은 Mapbox 깃허브에서 확인할 수 있습니다.

https://github.com/mapbox/mapboxgl-jupyter

필요한 라이브러리를 불러옵니다.

<python />
import pandas as pd import json import mapboxgl import os
데이터 불러오기

데이터는 2018년 소멸위험지수를 계산한 데이터를 사용하였습니다.

<python />
df = pd.read_csv('2018년소멸위험지수.csv', encoding='cp949') df['sigun_code']=df['sigun_code'].astype(str) df.head()

geojson 파일

geojson파일을 json.load를 이용해서 불러온 다음에 데이터를 확인해봅니다.

<python />
state_geo ='map (7).zip.geojson' state_geo1 = json.load(open(state_geo, encoding='utf-8')) for idx, sigun_dict in enumerate(state_geo1['features']): sigun_id = sigun_dict['properties']['merged'] sigun_nmm = df.loc[(df.sigun_code == sigun_id), 'sigun_nm'].iloc[0] risk = df.loc[(df.sigun_code == sigun_id), '총인구_여자(명)'].iloc[0] people = df.loc[(df.sigun_code == sigun_id), '총인구_65세이상(명)'].iloc[0] people_w = df.loc[(df.sigun_code == sigun_id), '소멸위험지수'].iloc[0] txt = f'<b><h4>{sigun_nmm}</h4></b>총인구_여자(명) :{risk:.2f}<br>총인구_65세이상(명) : {people}<br>소멸위험지수 : {people_w}' state_geo1['features'][idx]['properties']['tooltip1'] = txt state_geo1['features'][idx]['properties']['risk'] = people_w state_geo1['features'][0]

ChoroplethViz
<python />
import mapboxgl from mapboxgl.viz import * import os from mapboxgl.utils import create_color_stops

https://www.mapbox.com/  사이트에 들어가서 계정을 생성하고 account에 들어가면 본인의 token값에 대해 확인할 수 있습니다.

<python />
MAPBOX_API_KEY = 'mapbox사이트에서 본인의 api 주소 키'

access_token : mapbox의 api key 값

center : 중심점

color_property : 폴리곤 색상을 결정하는 값

color_stops : 폴리곤 색상을 결정하는 범주의 속성

zoom : 지도의 줌

<python />
center = [126.986, 37.565] color_breaks = [0, 0.5, 1, 1.5, 2] color_stops = create_color_stops(color_breaks, colors='BuPu')
<python />
viz = ChoroplethViz( access_token=MAPBOX_API_KEY, data=state_geo1, color_property='risk', color_stops=color_stops, center=center, zoom=10) viz.show()

bearing : 맵을 지정된 값만큼 좌우 회전

pitch : 맵을 지정된 값만큼 상하 회전

height_property : 3D 돌출을 위한 높이를 줄 속성

height_stops : 3D 돌출 높이를 결정하기 위한 속성

height_function_type : 높이를 할당하기 위해 Mapbox에서 사용하는 유형

<python />
from mapboxgl.utils import create_numeric_stops viz = ChoroplethViz( access_token=MAPBOX_API_KEY, data=state_geo1, color_property='risk', color_stops=color_stops, center=center, zoom=10, bearing = -17, pitch = 43, height_property = 'risk', height_stops = create_numeric_stops([0, 0.5, 1, 1.5, 2], 0, 30000), height_function_type = 'interpolate' ) viz.show()

CircleViz

단순한 지점을 점으로 시각화

<python />
viz = CircleViz( state_geo1, access_token=MAPBOX_API_KEY, center=center, zoom=10) viz.show()

점에 색상을 부여하여 시각화

<python />
viz = CircleViz( state_geo1, access_token=MAPBOX_API_KEY, color_property = 'risk', color_stops = create_color_stops( [0, 0.5, 1, 1.5, 2], colors='BuPu'), center=center, zoom=10) viz.show()

GraduatedCircleViz

점의 크기와 색상에 따라 데이터를 시각화

<python />
from mapboxgl.utils import create_color_stops from mapboxgl.utils import create_radius_stops viz = GraduatedCircleViz( state_geo1, access_token=MAPBOX_API_KEY, color_property='risk', color_stops=create_color_stops([0, 0.5, 1, 1.5, 2], colors='BuPu'), radius_property="risk", radius_stops=create_radius_stops([0, 0.5, 1, 1.5, 2], 0, 8), center=center, zoom=10) viz.show()

mapbox를 이용하여 지도 시각화를 하는법에 대해 알아봤습니다.

이 이외에도 공식깃허브에 들어가면 geojson데이터로 다양하게 시각화한 사례들을 살펴볼 수 있습니다.

 

profile

융무의 기술블로그

@융무

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!