본문 바로가기

STUDY/Python

[visualization] 지도 시각화 - folium 소개 및 간단 사용법

파이썬에선 다양한 방법으로 데이터를 시각화 할 수 있다.

 

대표적으로 Matplotlib, Seaborn등의 라이브러리가 있으며, 보다 interactive한 시각화를 할 수 있는 Plotly도 있다.

 

하지만 이런건 보통 그래프나, 뭐 시각화 개체 등을 표현할 때 사용하는 라이브러리들이다.

그런데 만약 지도 위에 뭔가 표시하고 싶다, 즉 지도를 보여주고 싶다면?

 

이럴 때 사용하는 것이 folium이라는 라이브러리다.

 

folium이란?

folium은 leaflet.js 기반으로 만들어진 Python 지도 시각화 라이브러리다. (공식 문서)

 

folium을 사용하면 interactive한 지도를 생성하고 마커를 추가하여 시각화하거나 원으로 범위를 표기하고 html 파일로 내보내기 등을 수행할 수 있다.

 

 

역시 백문이 불여일견이라. 직접 어떻게 사용하는지 보도록 하자.

단, 이번 포스팅은 folium에 대한 간단한 소개와, 그리 깊지 않은 기본 사용법만을 다룰 것이다.

 

기본 사용법을 알고 나면 사용하며 자연스레 깊은 사용법을 익히게 될 것이므로 일단 발을 담그는 것 부터 시작해 보자.

 

 

직접 사용해보자!

우선 설치하자. 아래 코드를 입력하면 된다. 단, google colab 환경이라면 이미 설치가 되어 있으므로 설치할 필요가 없다.

본인은 Google colab 환경에서 실행한다.

 

pip install folium

 

 

설치 후, 다른 라이브러리처럼 import해오면 된다.

 

 

이제, 주로 사용되는 3가지 메서드인 Map(), Marker(), Circle()과 커스텀에 쓰이는 Icon()에 대해 소개하고자 한다.

설명을 듣기 전에도 각각 무슨 역할을 하는 메서드들인지 짐작이 가능할 것이다. folium의 메서드들은 굉장히 직관적으로네이밍되어 있다.

 

 

1. Map()

folium의 핵심 메서드. 지도를 띄우는 데 사용한다.

 

기본 사용법은 이렇다.

folium.Map(location = [위도, 경도], zoom_start, tiles)

 

  - location은 보고 싶은 지점의 위도와 경도다. 

  - zoom_start는 지도를 처음 시각화했을 때 어느 정도로 확대할 것인지를 정하는 파라미터다.
    기본값은 10이고, 0 ~ 18의 범위를 갖는다.

 - tiles는 출력되는 지도의 스타일을 정하는 파라미터다. 기본값은 OpenStreetMap이다. 

 

간단하게 서울역을 중심으로 지도를 출력해보자.

 

 

위 캡처의 location은 서울역의 위, 경도다. 이미지를 일부만 캡처해서 그렇지, 실제로는 훨씬 크게 지도가 뜬다.

zoom_start 값을 크게 하면 서울역이 좀 더 잘 보이는 지도가 되었겠지만 13쯤으로 하니 큰 규모로 뜬다.

 

하지만, folium의 특징은 위에서 설명했듯 interactive한 지도를 띄워준다는 것.

이 말인즉, 확대 축소가 자유롭다는 것이다. 보고 싶은 부분이 잘 안 보인다면, 확대하면 된다.

 

 

잠깐! 좀 뜬금없지만, Tip 2가지를 소개한다.

 

 

* Tip 1. 위도, 경도는 어떻게 압니까?

 => 구글에 빙 맵을 검색해보자. bing map, map bing 기타 등등... 오타 등은 구글이 알아서 잘 걸러주니 걱정말도록 하자. 

그리고, 다음 사진으로 설명을 대체한다.

물론 다른 방법으로 알아내도 당연히 전혀 상관 없다.

 

 

** Tip 2. 도움말이 필요해요!

 어떤 메서드든, 들어가야 할 파라미터를 잘 모르겠다거나 관련해서 도움말을 띄우는 방법이 2가지가 있다.

1. 메서드에 괄호 대신 물음표를 넣은 후 실행시켜 보자. 도움말을 띄워준다.

 

2. 혹은, help()의 괄호 안에 해당 메서드를 넣은 후 실행시켜보자. 도움말을 띄워준다.

 

3. 1번과 2번으로 뜨는 도움말은 동일한 내용이니, 취향껏 선택하면 된다.

 

 

다시 돌아와서, 이번엔 tile을 다르게 해서 지도의 스타일을 바꿔 보자. 기본값은 OpenStreetMap이라 했었는데, 추가로 어떤 스타일이 가능한가? 

 => 위의 Tip 2를 참고하자. Tip2에 띄워놓은 도움말은 Map() 도움말이다.

 

Mapbox Bright, Stamen Terrain, Cloudmade 등등 굉장히 많은 tile이 가능하다고 나온다.

 

하지만, 24.04.01 현재 여러 tile은 삭제되거나 무료 제공이 중지되어, 사용할 수 없는 것이 많다(링크 첨부).

 

대표적 예로 몇개월 전 까지만 해도 Stamen Terrain, Stamen Toner 등의 tile들을 사용할 수 있었고, 자주 사용하던 tile들이었지만 지금은 사용해보면 아래와 같이 아무것도 안 뜬다.

 

 

현재 사용 가능한 건 기본 tile과 CartoDB positron, CartoDB dart_matter 정도인 것 같다.그 외의 tile들은 막혔거나, API를 사용해야만 적용할 수 있는 것으로 보인다.

 

 

tile : CartoDB positron

 

tile : CartoDB dark_matter

 

 

 

 

2. Marker()

지도에 표시할 마커를 띄우는 데 사용하는 메서드다. 기본 사용법은 아래와 같다.

 

folium.Marker(location=[위도, 경도], tooltip='마커에 표시할 내용').add_to(map)

 

 - tooltip : 적어놓았지만, 마커에 표시할 문구를 설정할 수 있다. 

 - tooltip 외에 어떤 파라미터가 들어가는지 궁금하다면, 위의 Tip 2번을 참고하도록 하자.

 

자, 바로 들어가 보자.

 

 

 

노파심에 한번 더 말하지만, 지도는 Map()의 location을 중심으로 출력된다. 위 화면은 본인이 마커와 코드를 좁은 화면에 캡처하고자 drag로 옮겨놓은 것이다.

어쨌든 위와 같이, Marker()는 입력한 위, 경도에 마커를 띄운다. tooltip으로 마커 위에 마우스를 갖다 댔을 때 나오는 문구를 설정할 수 있다.

 

 

 

3. Circle()

지도에 동그라미를 그리는 메서드다. 지도의 반경을 표시하는 데에 아주 유용하다. 기본 사용법은 아래와 같다.

 

folium.Circle(location=[위도, 경도], radius, color, fill_color).add_to(map)

 

 - radius : 동그라미의 반경을 설정하는 파라미터다. 단위는 미터(m)다. folium은 미국에서 만들어진 게 아닌가 보다.

 - color : 당연하겠지만 동그라미의 색을 정하는 파라미터다.

 - fill_color : 동그라미 안을 채울 색을 정하는 파라미터다. 쓰지 않으면 그냥 동그라미만 표시된다.

   아래 캡처의 'red'처럼 직접 지정해줘도 되고, 구글에 color picker를 검색해서 나온 색의 코드를 넣어줘도 된다.

 - radius의 단위가 m인건 어떻게 알았나요?  =>  Radius of the circle, in meters. 라는 설명이 있다.
   => 그 설명이 어디에 있는데요?  =>  위의 Tip 2를 참고하자!

 

 

여기서 잠깐, 2번 Marker()와 3번 Circle()을 읽으신 분들이라면 folium으로 출력하는 지도를 어떻게 꾸며나가는지를 짐작할 수 있을 것이다.

 

마커든, 동그라미든, Map()으로 우선 기본 지도를 만든 후 그 위에 한겹한겹 쌓아나가듯( .add_to ) 코딩해주면 된다 !

마커를 n개 그리려면 Marker()를 n개 추가하면 되고, 동그라미를 m개 그리려면 Circle()을 m개 추가해주면 된다.

 

 

4. Icon()

지도에 표시되는 마커를 꾸미는 데 사용하는 메서드다. 기본 뼈대는 아래와 같다.

folium.Icon(icon, color, icon_color, ...)

 

 - icon : 마커 안에 표시될 icon을 지정해줄 수 있다. 기본값은 info-sign이라는 아이콘으로, icon 파라미터 생략 시 해당 아이콘이 들어가게 된다. 

 - color : 마커의 색을 설정하는 파라미터다.

 - icon_color : 아이콘의 색을 설정하는 파라미터다.

 

 - icon의 기본값이 info-sign이란 건 어떻게 알 수 있나요? str, default 'info-sign'라는 설명이 있다.
 - info-sign 말고 어떤 아이콘을 설정해줄 수 있나요? See Font-Awesome website to choose yours라는 설명이 있다.

 

font awesome 웹사이트 접속 화면.  Free icons에 들어가보자.
무료로 사용 가능한 아이콘이 굉장히 많다!

 

 

 - font awesome 웹사이트에서 확인한 아이콘이 제대로 표시되지 않아요! Warning을 참고해보자. prefix라는 파라미터에 fa(font awesome)을 추가해야 한다.

 - 이런건 어떻게 알 수 있나요?  => Tip 2를 참고하도록 하자!

Icon() 메서드에 대한 도움말.

 

 

그럼 사용은 어떻게 할까?

위에서 Marker()에 들어가는 파라미터를 설명할 때, 사실 빼먹은 것이 있는데 icon이란 파라미터다.

 

이젠 바로 감이 올 것이다.이 icon이라는 파라미터에, 위의 기본 뼈대(...)코드를 넣어주면 되는 것이다. 그럼 그대로 마커가 커스텀 되어 표시된다.

 

 

 

코드가 너무 길게 느껴진다면, folium.Icon(...)을 변수에 넣은 후 Marker()의 icon 파라미터에 해당 변수를 지정해주어도 된다.

 

 

 

여러 개의 마커를 모두 커스텀해주는것도 당연히 가능하다.

다만, 동일한 커스텀 내용을 담은 변수를 사용해서 여러개의 마커를 커스텀하려는 경우, 왜 그런지는 잘 모르겠으나 각각 다른 변수에 담아서 사용해야 한다. 그렇지 않으면 마커가 제대로 표시되지 않는다.

 

아래 캡처본들을 보자.

 

동일 커스텀을 하나의 변수에 담아 사용하는 경우

잘못 코딩한 것은 없는 것 같고, 에러도 나지 않았는데 마커들이 제대로 표시되지 않는다.

 

 

동일 커스텀을 서로 다른 변수에 담아서 사용하는 경우

이번엔 잘 표시된다.

 

 

 

위와 같이, 여러 마커를 커스텀 할 때는 각각 다른 변수를 사용하거나 아니면 그냥 Marker() 내에 바로 넣어서 사용하도록 하자.