호쌤
호쌤 Just For Fun

[Python 데이터 시각화] folium 지도 시각화

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[Python 데이터 시각화] folium 지도 시각화≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

[Python 데이터 시각화] folium 지도 시각화

파이썬에서 지도를 활용할 수 있도록 하는 패키지는 여러가지가 있지만, 그 중에서 가장 손쉽게 사용할 수 있는 패키지는 folium 입니다. 이 포스팅에서는 folium을 활용하여 지도위에 데이터를 시각화 하는 과정을 소개합니다.

#01. 필요한 모듈 참조

먼저 아래의 명령어를 사용하여 필요한 패키지를 설치한다.

pip install –upgrade folium

아래와 같이 패키지를 불러온다.

1
2
3
import folium
from pandas import DataFrame   # 데이터 분석 패키지
from pandas import ExcelFile   # 엑셀파일 가져오기

#02. 지도 표현하기

1) 지도 객체 생성

지도의 중심이 되는 위도와 경도를 설정

1
2
3
# zoom_start: 배율 1~22
map_osm = folium.Map(location=[37.566647,126.978426], zoom_start=17)
map_osm

map01

2) 지도객체에 마커 추가

일반 마커

아이콘 색상값 종류

‘lightgreen’, ‘darkgreen’, ‘darkblue’, ‘cadetblue’, ‘orange’, ‘lightred’, ‘darkred’, ‘green’, ‘blue’, ‘black’, ‘lightblue’, ‘white’, ‘lightgray’, ‘red’, ‘pink’, ‘beige’, ‘gray’, ‘purple’, ‘darkpurple’

1
2
3
4
5
6
7
8
9
10
# 새로운 지도 객체 생성
map_osm1 = folium.Map(location=[37.566647,126.978426], zoom_start=17)

# 마커 객체 생성
marker1 = folium.Marker([37.566647,126.978426], 
                        popup='서울특별시청', 
                        icon=folium.Icon(color='red'))

marker1.add_to(map_osm1)  # 마커 객체를 지도에 추가함
map_osm1                  # 지도 표시하기

map02

사용자 지정 아이콘, HTML 팝업

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 새로운 지도 객체 생성
map_osm2 = folium.Map(location=[37.502549, 127.024867], zoom_start=17)

# HTML을 사용한 팝업
popup_html = folium.Popup("<font color='green' style='white-space: nowrap'><b>이젠아카데미컴퓨터학원</b></font>", parse_html=False)

# 사용자 지정 아이콘 이미지 사용
icon_img = folium.features.CustomIcon('http://itpaper.co.kr/demo/py/ho.png', icon_size=(50, 50))

# 마커 객체 생성
marker2 = folium.Marker([37.502549, 127.024867], 
                        popup=popup_html,
                        icon=icon_img)

marker2.add_to(map_osm2) # 마커 객체를 지도에 추가함
map_osm2                 # 지도 표시하기

map03

원형 마커(범위지정)

1
2
3
4
5
6
7
8
9
10
11
12
13
# 새로운 지도 객체 생성
map_osm3 = folium.Map(location=[37.502549, 127.024867], zoom_start=17)

# 원형마커 
marker3 = folium.CircleMarker([37.502549, 127.024867], 
                              radius=100,                 # 범위
                              color='#3186cc',            # 선 색상
                              fill_color='#3186cc',       # 면 색상
                              popup='이젠아카데미컴퓨터학원')

marker3.add_to(map_osm3)

map_osm3

map04

3) 파일로 저장하기

1
map_osm3.save('map_osm3.html') #파일이 저장될 위치

#02. 다른 형태의 지도

1) 평면도

1
2
3
# zoom_start: 배율 1~22
map_osm = folium.Map(location=[37.566647,126.978426], zoom_start=17, tiles='Stamen Toner')
map_osm

map05

2) 지형도

1
2
3
# zoom_start: 배율 1~22
map_osm = folium.Map(location=[37.566647,126.978426], zoom_start=10, tiles='Stamen Terrain')
map_osm

map06

#03. 서울의 초등학교 위치

1) 데이터 수집

1
2
3
4
# 엑셀 파일을 원격으로 내려받아 데이터프레임으로 변환 (다소 시간이 소요된다.)
xlsx = ExcelFile("http://itpaper.co.kr/demo/py/school2019.xlsx")
df = xlsx.parse(xlsx.sheet_names[0])
df
▶ 출력결과
학교ID 학교명 학교급구분 설립일자 설립형태 본교분교구분 운영상태 소재지지번주소 소재지도로명주소 시도교육청코드 시도교육청명 교육지원청코드 교육지원청명 생성일자 변경일자 위도 경도 데이터기준일자 제공기관코드 제공기관명
0 B000001838 서울휘경초등학교 초등학교 1959-10-10 공립 본교 운영 서울특별시 동대문구 휘경동 302-2 서울특별시 동대문구 망우로6길 48 7010000 서울특별시교육청 7021000 서울특별시동부교육지원청 2013-11-29 2019-09-10 37.585736 127.058122 2019-09-16 7001220 한국교원대학교
1 B000001839 서울동답초등학교 초등학교 1984-05-23 공립 본교 운영 서울특별시 동대문구 답십리동 2-24 서울특별시 동대문구 답십리로60길 12 7010000 서울특별시교육청 7021000 서울특별시동부교육지원청 2013-11-29 2019-09-10 37.571817 127.064205 2019-09-16 7001220 한국교원대학교
2 B000001840 서울답십리초등학교 초등학교 1962-11-29 공립 본교 운영 서울특별시 동대문구 답십리동 274 서울특별시 동대문구 전농로3길 23 7010000 서울특별시교육청 7021000 서울특별시동부교육지원청 2013-11-29 2019-09-10 37.569003 127.055423 2019-09-16 7001220 한국교원대학교
3 B000001841 서울신답초등학교 초등학교 1972-05-09 공립 본교 운영 서울특별시 동대문구 답십리동 463-13 서울특별시 동대문구 천호대로 177 7010000 서울특별시교육청 7021000 서울특별시동부교육지원청 2013-11-29 2019-09-10 37.573001 127.043399 2019-09-16 7001220 한국교원대학교
4 B000001842 서울용두초등학교 초등학교 1948-11-01 공립 본교 운영 서울특별시 동대문구 용두동 237-1 서울특별시 동대문구 천호대로13길 43 7010000 서울특별시교육청 7021000 서울특별시동부교육지원청 2013-11-29 2019-09-10 37.575743 127.028885 2019-09-16 7001220 한국교원대학교
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
11868 B000027396 평택새빛초등학교 초등학교 2019-09-01 공립 본교 운영 경기도 평택시 칠원동 산36-34 경기도 평택시 신촌2로 33(칠원동) 7530000 경기도교육청 7631000 경기도평택교육지원청 2013-11-29 2019-09-10 37.024922 127.105114 2019-09-16 7001220 한국교원대학교
11869 B000027418 마장초등학교 초등학교 1920-12-04 공립 본교 운영 경기도 이천시 마장면 오천리 19-1 경기도 이천시 마장면 오천로 130 7530000 경기도교육청 7741000 경기도이천교육지원청 2013-11-29 2019-09-10 37.246497 127.358475 2019-09-16 7001220 한국교원대학교
11870 B000027505 인천중산초등학교 초등학교 2019-03-01 공립 본교 운영 인천광역시 중구 중산동 1887-3 인천광역시 중구 두미포로 100 7310000 인천광역시교육청 7321000 인천광역시남부교육지원청 2013-11-29 2019-09-10 37.494695 126.565599 2019-09-16 7001220 한국교원대학교
11871 B000027506 인천중산중학교 중학교 2019-03-01 공립 본교 운영 인천광역시 중구 중산동 1914-2 인천광역시 중구 두미포로 189 7310000 인천광역시교육청 7321000 인천광역시남부교육지원청 2013-11-29 2019-09-10 37.498222 126.571277 2019-09-16 7001220 한국교원대학교
11872 B000027509 해누리중학교 중학교 2019-03-01 공립 본교 운영 서울특별시 송파구 가락동 479 서울특별시 송파구 송파대로37길 95 7010000 서울특별시교육청 7071000 서울특별시강동송파교육지원청 2013-11-29 2019-09-10 37.497612 127.102533 2019-09-16 7001220 한국교원대학교

11873 rows × 20 columns

#02. 데이터 전처리

1) 사용할 필드만 추출

1
2
df2 = df.filter(['학교명', '학교급구분', '소재지도로명주소', '위도', '경도'])
df2
▶ 출력결과
학교명 학교급구분 소재지도로명주소 위도 경도
0 서울휘경초등학교 초등학교 서울특별시 동대문구 망우로6길 48 37.585736 127.058122
1 서울동답초등학교 초등학교 서울특별시 동대문구 답십리로60길 12 37.571817 127.064205
2 서울답십리초등학교 초등학교 서울특별시 동대문구 전농로3길 23 37.569003 127.055423
3 서울신답초등학교 초등학교 서울특별시 동대문구 천호대로 177 37.573001 127.043399
4 서울용두초등학교 초등학교 서울특별시 동대문구 천호대로13길 43 37.575743 127.028885
... ... ... ... ... ...
11868 평택새빛초등학교 초등학교 경기도 평택시 신촌2로 33(칠원동) 37.024922 127.105114
11869 마장초등학교 초등학교 경기도 이천시 마장면 오천로 130 37.246497 127.358475
11870 인천중산초등학교 초등학교 인천광역시 중구 두미포로 100 37.494695 126.565599
11871 인천중산중학교 중학교 인천광역시 중구 두미포로 189 37.498222 126.571277
11872 해누리중학교 중학교 서울특별시 송파구 송파대로37길 95 37.497612 127.102533

11873 rows × 5 columns

2) 서울시의 초등학교만 추출

  1. 학교급구분 필드 값이 초등학교
  2. 소재지도로명주소서울 이라는 단어가 포함된 경우
    1
    2
    
     # LIKE 연산
     컬럼이름.str.contains('검색어')
    
1
2
df3 = df2.query("학교급구분 == '초등학교' and 소재지도로명주소.str.contains('서울특별시')")
df3
▶ 출력결과
학교명 학교급구분 소재지도로명주소 위도 경도
0 서울휘경초등학교 초등학교 서울특별시 동대문구 망우로6길 48 37.585736 127.058122
1 서울동답초등학교 초등학교 서울특별시 동대문구 답십리로60길 12 37.571817 127.064205
2 서울답십리초등학교 초등학교 서울특별시 동대문구 전농로3길 23 37.569003 127.055423
3 서울신답초등학교 초등학교 서울특별시 동대문구 천호대로 177 37.573001 127.043399
4 서울용두초등학교 초등학교 서울특별시 동대문구 천호대로13길 43 37.575743 127.028885
... ... ... ... ... ...
11684 서울위례별초등학교 초등학교 서울특별시 송파구 위례광장로 243 37.479086 127.145042
11702 서울하늘숲초등학교 초등학교 서울특별시 구로구 오리로 1106 37.484688 126.842417
11731 서울언남초등학교 초등학교 서울특별시 서초구 헌릉로8길 42 37.453919 127.061343
11772 서울항동초등학교 초등학교 서울특별시 구로구 연동로 178 37.476731 126.823983
11798 서울숭신초등학교 초등학교 서울특별시 성동구 마장로 161 37.567704 127.027767

603 rows × 5 columns

#03. 데이터 시각화

#01) 지도객체 생성

1
2
3
# zoom_start: 배율 1~22
map_osm = folium.Map(location=[37.566651, 126.978428], zoom_start=12)
map_osm

map07

02) 데이터프레임의 행 수만큼 반복하면서 마커 생성

1
2
3
4
5
6
7
8
9
10
11
12
for i in df3.index:
    # 행 우선 접근 방식으로 값 추출하기
    name = df3.loc[i, '학교명']
    lat = df3.loc[i, '위도']
    lng = df3.loc[i, '경도']
    
    # 추출한 정보를 지도에 표시
    marker = folium.Marker([lat,lng], popup=name)
    marker.add_to(map_osm)

map_osm.save('서울의_초등학교_분포.html')
map_osm

map08

Rating:

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[Python 데이터 시각화] folium 지도 시각화≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

comments powered by Disqus