[Python/Exam Code]
파이썬 Folium 모듈을 이용해 GUI 지도 사용하기

2020. 3. 30. 04:43


Folium이란 무엇인가?

Folium은 지리정보 시각화 모듈이다. 좌표값을 지도로 시각화하며, 외부 API를 사용하는 것보다 빠르고 훨씬 직관적으로 지도 데이터를 사용할 수 있는 것이 장점이다.

Folium을 이용해 특정 좌표에 포커징된 지도를 HTML 파일로 생성하는 방법

아래는 매우 단순한 Folium 예제이다.

import folium

m = folium.Map(
	location=[37.564214, 127.001699], tiles="OpenStreetMap", zoom_start=15)
    
m.save('map.html')

location 매개변수의 리스트에 위도, 경도를 차례로 저장하고 tiles 매개변수에는 지도의 디자인을 선택한다. zoom_start는 몇배율로 지도를 저장할 것인지를 입력하면 된다.

tiles 매개변수에 넣어 사용할 수 있는 맵 타일은 아래와 같다.

OpenStreetMap
Mapbox Bright (Limited levels of zoom for free tiles)
Mapbox Control Room (Limited levels of zoom for free tiles)
Stamen (Terrain, Toner, and Watercolor)
Cloudmade (Must pass API key)
Mapbox (Must pass API key)
CartoDB (positron and dark_matter)

위 타일중 Must pass API key 옵션이 있는것은 해당 타일 서비스 제공자로부터 API 키를 발급받아야 사용할 수 있다. 따라서 이 포스트에서는 OpenStreetMap을 사용할것이다. 따로 매개변수를 설정하지 않아도 OpenStreetMap 스타일이 적용된다.

위 코드를 실행시키면 같은 디렉터리에 map.html이 생성될것이다.
만약 HTML 파일을 직접적으로 생성하지 않고 Return받아 사용하고싶다면 "m.save("map.html")" 대신 "m.get_root().render()"를 사용하면 된다.

map.html

해당 HTML 파일을 크롬 브라우저로 열었을 때 모습이다. 위 코드에서 [37.564214, 127.001699] 이 위치는 Google Maps에 서울을 검색했을때 받을 수 있는 기본 좌표값이다.

특정 위치를 마킹하는 방법

Marker를 이용하면 지정한 좌표에 원하는 아이콘으로 강조할 수 있으며, POPUP을 이용해 해당 좌표를 클릭하였을 때 팝업되는 메세지를 설정할 수 있다.

import folium

m = folium.Map(location=[37.564214, 127.001699],
	tiles="OpenStreetMap",
    zoom_start=15)
    
folium.Marker(location=[37.564214, 127.001699],
    icon=folium.Icon(color='red', icon='star',
    popup="Center of seoul").add_to(m)
    
m.save('map.html')

map.html

Circle Marker를 이용하면 지정한 좌표에 원형 표시로 강조할 수 있으며, Marker와 마찬가지로 POPUP을 설정할 수 있다.

import folium

m = folium.Map(location=[37.564214, 127.001699],
	tiles="OpenStreetMap",
    zoom_start=15)
    
folium.CircleMarker(location=[37.564214, 127.001699],
	radius=100, # 원의 크기
    color="#000", # 테두리색
    fill_color="#fff", # 채우기색
    popup="Center of seoul").add_to(m)
    
m.save('map.html')

map.html

MarkerCluster를 이용하면 가까운 거리의 Marker들을 군집시켜 해당 건수를 표시해준다. 특정 Cluster를 클릭하면 해당 위치를 확대해 보여준다.

GeoJson을 이용하면 다각형을 표현할 수 있다. 구역별로 나누거나 경계선이나 경로를 표현하는데 사용할 수 있다.
아래 예제에서는 Json 데이터로 서울시 공공데이터인 행정구역 데이터를 사용한다.

아래 파일을 다운로드 받아 하단의 코드가 위치한 경로와 같은 디렉토리에 저장해야 정상적으로 작동한다.

seoul_municipalities_geo.json
1.56MB

import folium

m = folium.Map(
    location=[37.5838699,127.0565831],
    zoom_start=10
)

import json
with open('./seoul_municipalities_geo.json',mode='rt',encoding='utf-8') as f:
    geo = json.loads(f.read())
    f.close()

folium.GeoJson(
    geo,
    name='seoul_municipalities'
).add_to(m)

m.save('map.html')

map.html

HTML 파일로 만들지 않고 바로 GUI창으로 띄우기

위 방식들은 전부 HTML파일을 생성하고 사용자가 직접 해당 HTML파일을 실행시켜서 확인을 했어야 했다.
이 방식은 너무 불편하고 경우에 따라서는 목표하는 프로그램을 설계하는데 문제가 될 수도 있다.

HTML 파일 생성 없이 PyQt5 웹뷰어를 이용한 GUI로 지도 로드

아래 코드를 사용하면 위 사진과 같이 파이썬의 GUI 모듈인 PyQt5의 웹엔진을 이용하여 바로 실행시켜 사용할 수 있다.

import io
import sys
import folium
from PyQt5 import QtWidgets, QtWebEngineWidgets

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    m = folium.Map(
        location=[37.564214, 127.001699], tiles="OpenStreetMap", zoom_start=15
    )

    data = io.BytesIO()
    m.save(data, close_file=False)

    w = QtWebEngineWidgets.QWebEngineView()
    w.setHtml(data.getvalue().decode())
    w.resize(640, 480)
    w.show()

    sys.exit(app.exec_())
  • 프로필사진
    스토리버킷2020.03.30 10:11

    프로그래밍이란 건 보면 볼수록 신기합니다. 저는 프로그램을 전혀 모르는 수준인데요, 파이썬이 접근하기 쉬운가요?

    • 프로필사진
      root@ XXeros2020.03.31 02:22 신고

      파이썬은 다른 프로그래밍 언어보다 접근하기 쉽다고 생각합니다. "인간의 언어와 가장 밀접한 문법체계를 가진 프로그래밍 언어"가 슬로건이라서요

      접근하기 쉬울뿐이지 파이썬은 정말 강력한 도구와 모듈들을 탑재하고있기때문에 쉽고 빠르고 강력한 프로그래밍이 가능합니다.

      비전공자이시더라도 시작하시면 일상생활에서 필요했던 프로그램들을 만드시는데 도움이 될겁니다.

  • 프로필사진
    퇴(사)준(비)생2020.03.30 10:18 신고

    OpenStreetMap 도 괜찮아보이네요.
    맵 데이터는 상용화에도 괜찮은 수준일까요?

    • 프로필사진
      root@ XXeros2020.03.31 02:23 신고

      제가 코딩하면서 살펴봤을때는 19년도 이전에 제작된 맵입니다. 어느정도 상용화는 가능하나 정말 정확하고 세밀하여 오차가 거의 없어야하는 지도정보를 사용해야하는 서비스라면 조금 무리일수도 있을것같다는 생각이 듭니다.

  • 프로필사진
    파이썬 초보2020.06.22 15:30

    folium 라이브러리 사용해서 간단한 프로그램을 만들고 싶은데.. 도움을 요청해도 될까요??