folium 서울시 지도 시각화

생각하는 마리오네트·2022년 5월 14일
0

Visualization

목록 보기
23/31

folium은 지도 시각화를 하는데 강력한 도구이다. 이 folium으로 어디까지 활용할 수 있을지, 빅데이터와 folium의 활용의 무궁무진함을 꾸준히 기록하려고 한다.

가장 먼저 folium의 기본적인 기능부터 시작해서 다양한 API와 라이브러리 들을 함께 사용하여 멋진 시각화 까지, 또 시각화의 본질은 정보전달을 잘 하기위한 방법까지 쭉 다루어 보려고한다.

기본적인 folium의 사용

(시작하기에 앞서 folium을 다운받고 import한다.)

# params ---- 1.
center = [37.541, 126.986]
tiles = ['cartodbpositron', 'Stamen Toner', 'OpenStreetMap']

# visualization ---- 2.
m = folium.Map(
    location = [center[0], center[1]],
    zoom_start = 12,
    tiles = tiles[0]
)

# show
m

먼저 우리가 지도를 파이썬 환경에 띄운다고 가정을 했을때 원하는 위치를 지정해주어야 한다. 그렇기 위해서 필요한 파라미터들을 1번과 같이 사전에 정의해준다.


그렇게 코드를 실행하면 다음과 같이 지도가 출력이된다.

파라미터들을 간다하게 설명하면,

center 는 우리가 보고싶은 지도상의 위치의 위도와 경도가 필요하기때문에 이를 넣어주는 변수이다.
tiles 는 우리가 지도를 시각화 했을때 맨 아랫단의 배경에 깔리는 타일의 종류를 뜻하며, 기본적으로 위의 3가지가 제공되고 있다.

1. OpenStreetMap

위에서 출력한 타일이 OpenStreetMap 타일이다.

2. Stamen Toner

3. cartodbpositron

이렇게 목적에 맞는 타일을 사용하면된다. 추가적인 다른 타일은 다른 API를 통해 가능하지만 이부분은 나중에 다루려고 한다.

Marker

folium.Marker(
    location = [lat, lon],
    popup = '반포자이',
    tooltip = '반포자이',
    icon = folium.Icon('red', icon = icon[0])
).add_to(m)
m

위의 코드를 입력해준다면 아래와 같은 출력이 나온다.

처음과 달라진 점이라면 지도상에 별모양 마커가 추가된것을 볼 수있다. 내가 좋아하는 아파트인 반포자이 아파트의 위경도 좌표에 해당하는 곳에 저렇게 도장 찍듯이 마커를 찍은것으로 이해하면된다.

코드는 folium.Marker 안에 필요한 파라미터들을 채우고 .add_to(m) 을 통해서 처음에 만들었던 기본 지도 m에 추가해 주는것이다.

folium 의 매커니즘은 포토샵을 해본분들이라면 레이어를 하나씩 쌓아 올리는 느낌이라고 생각하면 이해가 빠를것이다, 만약 포토샵을 사용해보지 않았다면 지도만 그려지있는 도화지 위에 투명색이고 마커만 찍혀있는 도화지를 하나 겹쳐두었다고 생각하면 이해가 될것이다. 이것이 folium의 전부라고 볼 수 있다.

파라미터는 공식문서에서 다양하게 사용해보는것을 권장하고 lon, lat은 반포자이 아파트에 해당하는 좌표정보를 변수에 각각 lon, lat에 저장한것이다.

GeoJson

다음은 GeoJson을 활용하여 레이어를 쌓는 방법에 대해 소개한다.
GeoJson에 대한 설명은 아래 링크에서 설명해두었다.

https://velog.io/@ljs7463/GeoJson-%EA%B3%B5%EA%B0%84%EC%A0%95%EB%B3%B4-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC-%EB%8B%B4%EB%8B%A4

# GeoJson 활용
folium.GeoJson(
    geo,
    name = '서초구',
    style_function = lambda x: {'fillColor':'#00000000' ,
    							'color':'black',
                                'weight' :'1'}
).add_to(m)

저는 시군구의 경계가 POLYGON으로 되어있는 GeoJson파일을 Geo라는 변수에 저장해두었습니다.
그리고 style_function으로POLYGON색상, 선색상, 굵기를 파라미터로 던저준 모습입니다.

그러면 위의 사진처럼 각 시군구 마다 경계가 설정해둔 검정색으로 POLYGON은 투명색을 주었기때문에 이전에 쌓은 레이어가 가려지지 않고 잘 보이는 모습입니다. 만약에 우리가 보고싶은 서울 그 중에서도 반포자이가 있는 서초구를 좀 더 강조하고싶다면 해당 경계 위치정보 파일이 들어있는 Json파일을 한번더 호출하는데 해당하는 시군구의 경계만 호출하여 색을 집어넣으면됩니다. 아래와같은 모습이 될것같네요

위에보이는 마지막 지도에 대한 코드는 아래와 같습니다.

# params
center = [37.541, 126.986]
icon = ['star','flag']
tiles = ['cartodbpositron', 'Stamen Toner', 'OpenStreetMap']


# Base Map
m = folium.Map(
    location = [center[0], center[1]],
    zoom_start = 12,
    width = 750,
    height = 500,
    tiles = tiles[2]
)

# Marker
folium.Marker(
    location = [lat, lon],
    popup = '반포자이',
    tooltip = '반포자이',
    icon = folium.Icon('red', icon = icon[0])
).add_to(m)

# GeoJson 활용(시군구 경계  API 호출)
folium.GeoJson(
    geo,
    name = '서초구',
    style_function = lambda x: {'fillColor':'#00000000',
    							'color':'black',
   							    'weight' :'1'}
).add_to(m)

# GeoJson2(서초구 시군구 경계 API 호출)
folium.GeoJson(
    geo2,
    name = '서초구',
    style_function = lambda x: {'fillColor':'red' 
   					![](https://velog.velcdn.com/images/ljs7463/post/21a8efe5-401b-4362-95ee-249128e3336a/image.png)
			'color':'black',
    							'weight' :'1',
    							'fillOpacity':'0.3'}
).add_to(m)

# show
m

다시한번 folium의 메커니즘을 이해해 보면 처음에 소스코드에 보이는 기본 지도 를 깔고 그위에 "반포자이" 아파트 위치를 알려주는 마크를 깔고, 다시 위에 시군구의 경계를 호출해와서 깔아주고 마지막 맨위에 서초구 시군구에 해당하는 곳은 빨간색으로 fillOpacity 파라미터를 이용하여 투명도 조절을 해서 마무리 해 주었습니다.

사실 더 표현하기 좋은, 이해를 돕는 다양한 타일과 방법론이 존재하지만 이번에는 이렇게 기본적인 활용을 했습니다.

profile
문제를해결하는도구로서의"데이터"

0개의 댓글