융무의 기술블로그
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

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

import pandas as pd
import json

import mapboxgl
import os
데이터 불러오기

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

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

geojson 파일

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

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
import mapboxgl
from mapboxgl.viz import *
import os
from mapboxgl.utils import create_color_stops

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

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

access_token : mapbox의 api key 값

center : 중심점

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

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

zoom : 지도의 줌

center = [126.986, 37.565]
color_breaks = [0, 0.5, 1, 1.5, 2]
color_stops = create_color_stops(color_breaks, colors='BuPu')
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에서 사용하는 유형

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

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

viz = CircleViz(
    state_geo1,
    access_token=MAPBOX_API_KEY,
    center=center,
    zoom=10)

viz.show()

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

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

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

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

융무의 기술블로그

@융무

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