융무의 기술블로그
article thumbnail

지도 시각화를 하는 데 있어서 folium, plotly, dash 등 다양한 라이브러리가 존재하는데 이번에는 pydeck을 이용한 지도 시각화를 해보려고 합니다. pydeck의 장점은 여러 레이어를 쌓을 수 있다는 점과 geopandas를 이용한 유용한 기능들이라고 생각합니다. 

 

Geocoding

- boundary를 통해서 경계를 그려볼 수 있습니다.

<python />
df_test = gpd.read_file('TBGIS.geojson') df_test.geometry[0].boundary df_test.head(1)

- Point를 통해서 여러 경계의 중심점을 구할 수 있습니다. 이를 통해서 haversine을 이용하여 원하는 곳 근처의 몇 M 이내에 있는 변수들도 그려볼 수 있을거 같습니다.

<python />
df_test.geometry.centroid

PolygonLayer

pydeck에서 자주 사용하는 것중 하나인 PolygonLayer를 사용해보려고 합니다. data는 서울의 geojson 파일을 이용하여 geopandas를 사용하였으며 전처리를 하였고 서울시 우리마을가게 상권분석서비스(행정동별 상권변화지표)를 사용하였습니다.(http://data.seoul.go.kr/dataList/OA-15575/S/1/datasetView.do )

 

서울시 우리마을가게 상권분석서비스(행정동별 상권변화지표)

상권변화지표 : 상업공간의 변화를 생존한 사업체의 평균 영업기간과 폐업한 사업체의 평균 영업기간을 기준으로 4개 등급으로 나눈 지표

LL : 도시재생 및 신규 개발 상권으로 창업 진

data.seoul.go.kr

서울의 geojson파일을 geopandas를 불러들어와 형태를 살펴보겠습니다. 경곗값인 geometry가 MULTIPOLYGON 형태로 되어있어서 이를 함수 식을 통해 리스트 형태로 바꾸겠습니다.

<python />
import pandas as pd import geopandas as gpd import pydeck as pdk MAPBOX_API_KEY = 'pk.개인 MAPBOX API 키값' df = gpd.read_file('Seoul.geojson') df.head(2)

 

PolygonLayer를 위한 데이터인 df를 만들었습니다. 

<html />
def multipolygon_to_coordinates(x): lon, lat = x[0].exterior.xy return [[x, y] for x, y in zip(lon, lat)] df = pd.DataFrame(df) df.head(2)

여기에 보여주고 싶은 다른 데이터를 불러오겠습니다.

<python />
df_a = pd.read_csv('서울시 우리마을가게 상권분석서비스(행정동별 상권변화지표).csv',encoding='cp949') df['운영_영업_개월_평균'] = df_a['운영_영업_개월_평균'] df['폐업_영업_개월_평균'] = df_a['폐업_영업_개월_평균'] df['정규화인구'] = df['운영_영업_개월_평균'] / df['운영_영업_개월_평균'].max() df_a.head(2)

이제 mapbox_key를 통해서 서울시를 행정동 기준으로  pydeck을 이용하여 그려보겠습니다. 

pydeck도 반응형 그래프여서 변수들이 나오는데 나중에 tooltip을 이용하여 

<python />
layer = pdk.Layer( 'PolygonLayer', df, get_polygon='coordinates', get_fill_color='[0, 255*정규화인구, 0]', pickable=True, auto_highlight=True ) center = [126.986, 37.565] view_state = pdk.ViewState( longitude=center[0], latitude=center[1], zoom=10) r = pdk.Deck(layers=[layer], map_style='mapbox://styles/mapbox/outdoors-v11', mapbox_key=MAPBOX_API_KEY, initial_view_state=view_state) r.to_html('demo.html')

pydeck에 PolygonLayer로 서울시 지도 시각화를 하였는데 레이어를 몇 개를 추가하느냐에 따라서 가시성이 달라질거 같습니다. 다음은 서울시 우리마을가게 상권분석서비스의 데이터를 가지고 골목상권과 발달 상권을 추가하여 상권 영역에 대한 지도 시각화를 해보려고 합니다. 

profile

융무의 기술블로그

@융무

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