본문 바로가기
수업(국비지원)/Python

[Python] 지도를 이용한 시각화1

by byeolsub 2023. 4. 25.

📌

### 지도 시각화
# folium 모듈 사용하기
# pip install folium <=콘솔 or Anaconda Prompt에 입력하여 설치.  
import folium
seoul_map = folium.Map(location=[37.55,126.98],zoom_start=12) 
seoul_map.save("seoul.html") #copy_ex

# 지도의 표현방법 지정 가능 
# tiles="stamentoner" : 길에 대한 정보들만 출력.
'''
tiles : 지도 표시되는 형식 설정.
     openstreetmap : 기본값
     cartodbdark_matter
     cartodbpositron
     cartodbpositrononlylabels
     stamentonerbackground
     stamentonerlabels
     stamenterrain, Stamen Terrain
     stamenwatercolor
     stamentoner, Stamen Toner
'''
seoul_map2 = folium.Map(location=[37.55,126.98],zoom_start=12,
                        tiles="stamentoner") 
seoul_map2.save("seoul2.html") # html파일 생성.


📌

# 지도 생성하기 
seoul_map = folium.Map(location=[37.55,126.98],zoom_start=12) 
'''
반복문 이용 : 마커를 표시하는것이 한두개가 아니니까
 # folium.Marker : 지도에 표시하기
 # [lat,lng] : 위도, 경도. 마크 위치를 위도경도로 설정.(순서 중요)
 # popup=name : 마커를 클릭시 표시되는 내용. 
 # tooltip=name : 마커 내부에 마우스커서가 들어온 경우 표시되는 내용
 # add_to(seoul_map) : seoul_map지도에 추가
 # df.index : 대학명
 # df.위도, df.경도 : 대학의 위도, 경도 정보 
 
'''
# zip : 목록을 하나씩 연결하여 튜플객체의 리스트로 생성 
# zip(리스트1, 리스트2) : 리스트1의 요소한개, 리스트2의 요소 한개를 튜플로 만들어서 
#                        하나의 리스트로 합쳐주는 함수
for name,lat,lng in zip(df.index, df.위도, df.경도):
    # name : 대학명
    # lat : 대학의 위도 정보
    # lng : 대학의 경도 정보
    folium.Marker([lat,lng],popup=name,tooltip=name).add_to(seoul_map)
seoul_map.save("seoul3.html")

##################
# zip 예제
lista = ['a','b','c']
list1 = [1,2,3]
list2 = ['가','나','다']

# 결과 -> ('a', 1, '가') ('b', 2, '나') ('c', 3, '다')
listall = zip(lista, list1, list2)
for d in listall :
    print(d)

# 원형 마커 추가하기
# CircleMarker : 마커의 모양을 설정 할 수 있음.
df = pd.read_excel("data/서울지역 대학교 위치.xlsx",index_col=0)
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],
                        popup = name,
                        tooltip = name,
                        radius=10, # 반지름의 크기
                        color='brown', # 원둘레 색상
                        fill=True, # 원내부 채울지, 비워둘지
                        fill_color='coral', # 원내부 색상
                        fill_opacity=0.7 # 원내부의 투명도 
                        ).add_to(seoul_map)
seoul_map.save("seoul4.html")

# 마커 내부의 아이콘 설정하기
# icon=['home','flag','bookmark','star']
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,
                        icon=folium.Icon(color='red',icon='home')
                        ).add_to(seoul_map)
seoul_map.save("seoul5.html")


# Library.csv 파일을 읽어서 도서관 정보를 지도에 표시하기

#1 파일을 읽어 지도정보(조건명 찾기)
df = pd.read_csv("data/Library.csv")
df.info()
df.head()
# => 필요한 정보 : 경도 위도 시설명?

#2 도서관 명 
df.시설명.head()

#3 지도 만들기
library_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,
                  icon=folium.Icon(color='green',icon='bookmark')
                  ).add_to(library_map)
library_map.save("library1.html") #html 파일 생성.

#1 지도 정보 컬럼명
#2 도서관명
#3 도서관 마커 표시

# 시설 구분별로 색상 설정하기

'''

'''
df = pd.read_csv("data/Library.csv")
df.info()
library_map = folium.Map(location=[37.55,126.98],zoom_start=12)
for name,lat,lng,kbn in zip(df.시설명, df.위도, df.경도,df.시설구분):
    if kbn == '구립도서관' or kbn == '국립도서관' :
        color = 'green'
    elif kbn == '사립도서관' :
        color = 'red'
    else :
        color = 'blue'
    folium.Marker([lat,lng],popup=name,tooltip=kbn,
                  icon=folium.Icon(color=color,icon='bookmark')
                  ).add_to(library_map)
library_map.save("library2.html")

# MarkerCluster 기능 : 지도확대 정도에 따라 마커 표시방법을 달리해준다.
#                      그룹화 기능
from folium.plugins import MarkerCluster
library_map = folium.Map(location=[37.55,126.98],zoom_start=12)
mc = MarkerCluster() # MarkerCluster 객체 생성
# DataFrame.iterrows() : 반복문에서 레코드의 인덱스와 레코드값을 리턴
# _ : 인덱스 값. _이름의 변수병 사용한 이유는 인덱스를 사용하지 않기때문에.
#     (상징적으로 설정한것일 뿐이다)
# row : 한개의 레코드값
for _, row in df.iterrows() :
    mc.add_child( # mc 객체에 추가
        # folium.Marker 객체 생성, import했기 때문에 folium 생략 가능.
        folium.Marker(location=[row['위도'],row['경도']],
                      popup=row['시설구분'],
                      tooltip=row['시설명']))
library_map.add_child(mc) # 클러스터를 지도에 추가
library_map.save("library3.html")