본문 바로가기

Python

Python - 지도 시각화(folium)

### 지도 그리기

### folium 모듈 사용하기

#pip install folium <- 먼저 실행
import folium 

# 서울 지도 만들기
seoul_map = folium.Map(location=[37.55,126.98],zoom_start=12)

# 지도를 HTML 파일로 저장하기
seoul_map.save('seoul.html')

 

html 파일 생성



'''
tiles 속성 : 지도 스타일 설정
openstreetmap : 기본값
cartodbdark_matter
cartodbpositron
cartodbpositronlylabels
stamentonerbackground
starmentonerlabels
stamenterrain, Stamen Terrain
stamenwatercolor
stamentoner, Stamen Toner
'''

seoul_map2 = folium.Map(location=[37.55,126.98],zoom_start=12,titles='stamenwatercolor')
seoul_map2.save('seoul2.html')

### 파일에서 위도 경도를 읽어 지도에  표시하기 
import pandas as pd
import folium

서울지역 대학교 위치.xlsx
0.01MB


df = pd.read_excel('서울지역 대학교 위치.xlsx', index_col=0, engine='openpyxl')
print(df.head())
print(df.index)
seoul_map = folium.Map(location=[37.55,126.98],zoom_start=12)
for name, lat, lng in zip(df.index, df.위도, df.경도):
    folium.Marker([lat,lng], popup=name, tooltip=name).add_to(seoul_map)
seoul_map.save('seoul_colleges.html')

 

 

### 원형 마커 출력
### 지도 생성 
seoul_map = folium.Map(location=[37.55,126.98],zoom_start=12)

for name, lat, lng in zip(df.index, df.위도, df.경도):
    folium.CircleMarker([lat,lng], #위치 : 위도, 경도  
                  radius=10, #원의 반지름
                  color='brown', #원의 둘레 색상
                  fill=True, 
                  fill_color='coral',
                  fill_opacity=0.7,
                  popup=name
     ).add_to(seoul_map)
seoul_map.save('seoul_colleges2.html')

Library.csv
0.03MB

### Library.csv 파일을 읽어서 도서관 정보를 지도에 표시하기
import pandas as pd
import folium
from folium import Marker

library = pd.read_csv('Library.csv')
lib_map= folium.Map(location=[37.55,126.98],zoom_start=12)
for name, lat, lng, kbn in  zip(library["시설명"],library["위도"],\
                           library["경도"],library["시설구분"]):
        if kbn == '구립도서관' :
            color = 'green'
        else : 
            color = 'blue'
        Marker(location = [lat,lng], 
                  popup=kbn,
                  tooltip=name,
                  icon=folium.Icon(color=color,icon='bookmark')
                  ).add_to(lib_map)
lib_map.save('library.html')

### MarkerCluster 기능 : 지도의 확대에 따라 표시 방법
from folium.plugins import MarkerCluster
lib_map = folium.Map(location=[37.58, 127.0], zoom_start=11)

# Add points to the map
mc = MarkerCluster()

 

# _ 대신 a i를 넣어도 상관없다. 변수명 의미 없음 
# row : 한개의 레코드 값
for _, row in library.iterrows():
    mc.add_child(
        Marker(location = [row['위도'], row['경도']],
               popup=row['시설구분'],
               tooltip=row['시설명']
               )
        )
lib_map.add_child(mc)
lib_map.save('library2.html')

# 경기도 인구 데이터와 위치 정보를 가지고 지도 표시
import pandas as pd
import folium
import json

경기도인구데이터.xlsx
0.01MB
경기도행정구역경계.json
0.11MB


file_path = './경기도인구데이터.xlsx'
df = pd.read_excel(file_path,index_col='구분',engine='openpyxl')
df.columns = df.columns.map(str)
geo_path = './경기도행정구역경계.json'
#geo_data : 경기도의 시군의 경계부분을 좌표로 가지고 있는 데이터
print(type(geo_path))  
try : 
    geo_data = json.load(open(geo_path, encoding='utf-8'))
except : 
    geo_data = json.load(open(geo_path, encdoing='utf-8-sig'))
    
print(type(geo_data))
    
g_map = folium.Map(location=[37.5502,126.982],zoom_start=9)
year = '2017'    

# Choropleth 클래스로 단계 구분도 표시하기
# fill_color : 색상 파렛트 설정 
# 'BuGn','BuPu','GnBu','OrRd','PuBuGn',
# 'PuRd', 'RdPu', 'YlGn', 'YlGnBu', 'YlOrBr', 'YlOrRd'
folium.Choropleth(geo_data=geo_data, #지도 경계
    data = df[year], # 표시하려는 데이터
    columns = [df.index, df[year]], #열 지정
    fill_color='YlOrRd', fill_opacity=0.7, line_opacity=0.3,
    threshold_scale=[10000,100000,300000,500000,700000],
    key_on = 'feature.properties.name',
    ).add_to(g_map)
g_map.save('./gyonggi_population_' + year + '.html')