융무의 기술블로그
article thumbnail

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

 

Geocoding

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

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

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

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 형태로 되어있어서 이를 함수 식을 통해 리스트 형태로 바꾸겠습니다.

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를 만들었습니다. 

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)

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

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을 이용하여 

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

융무의 기술블로그

@융무

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