Creative Code

마커클러스터, 데이터기반 지도 구분하기 본문

코딩 study/python

마커클러스터, 데이터기반 지도 구분하기

빛하루 2023. 10. 29. 18:25
import pandas as pd
import folium
from folium.plugins import MarkerCluster

# cp949 인코딩으로 CSV 파일에서 데이터를 불러옵니다.
df = pd.read_csv('data/jeju.csv', encoding='cp949')

# 지도에 마커를 표시하는 함수 정의
def display(loc, map):
    if loc[0] != '결과없음':
        folium.Marker(loc[0], tooltip=loc[1]).add_to(map)

# (33.3616666, 126.5291666)를 중심으로 하는 지도를 생성하고 줌 레벨을 10으로 설정합니다.
map = folium.Map((33.3616666, 126.5291666), zoom_start=10)

# 시각화를 위한 마커 클러스터 생성
cluster = MarkerCluster().add_to(map)

# DataFrame의 각 행에 'display' 함수를 적용하여 지도에 마커를 추가합니다.
df[['위치', '읍면동']].apply(display, map=cluster, axis=1)

# 지도를 출력합니다.
print(map)

# 새로운 지도 생성 (주의: 이 줄에 오탈자가 있습니다. 'folium.Map'이어야 합니다)
map = folium.Map((33.3616666, 126.5291666), zoom_start=10)

# 시각화를 위한 마커 클러스터 생성
cluster = MarkerCluster().add_to(map)

# DataFrame 행을 반복하며 지도에 마커를 추가합니다.
for index, row in df.iterrows():
    if row['위치'] != '결과없음':
        folium.Marker(row['위치'], tooltip=row['읍면동']).add_to(cluster)

# 지도를 출력합니다.
print(map)

# 정규 표현식을 사용하여 '일반현황' 열에서 인구수 데이터를 추출합니다.
import re
df['인구수'] = df['일반현황'].apply(lambda x: int(re.findall('[0-9]{4,}', x)[-1]))

# DataFrame의 처음 몇 행을 출력합니다.
print(df.head())

# '지역' 열의 값들을 교체하여 '키' 열을 생성합니다.
df['키'] = df['지역'].replace(['제주시', '서귀포시'], ['Jeju', 'Seogwipo'])

# '키' 열로 DataFrame을 그룹화하고 '인구수'의 합계를 계산합니다.
df1 = df.groupby('키')['인구수'].sum().reset_index()

# 그룹화된 DataFrame을 출력합니다.
print(df1)

# 'json' 라이브러리를 불러옵니다.
import json

# 새 지도 생성
map = folium.Map((33.3616666, 126.52916660), zoom_start=10)

# 제주 지역의 지리 데이터를 포함하는 geojson 파일을 로드합니다.
jsonfile = open('data/jeju-municipalities-geo.json', 'r')
jsondata = json.load(jsonfile)

# 'df1' 데이터를 기반으로 Choropleth 지도를 생성하고 지도에 추가합니다.
folium.Choropleth(
    geo_data=jsondata,
    data=df1,
    key_on='feature.id',
    bins=5,
    columns=['키', '인구수'],
    legend_name='제주 인구수'
).add_to(map)

# 지도를 출력합니다.
print(map)

# 새 지도 생성
map = folium.Map((33.3616666, 126.5291666), zoom_start=10)

# 제주의 지리 데이터가 있는 geojson 파일을 로드합니다.
jsonfile = open('data/jeju.json', 'r')
jsondata = json.load(jsonfile)

# 'df' 데이터를 기반으로 Choropleth 지도를 생성하고 지도에 추가합니다.
folium.Choropleth(
    geo_data=jsondata,
    data=df,
    key_on='feature.id',
    bins=5,
    columns=['읍면동', '인구수'],
    legend_name='제주 인구수'
).add_to(map)

# 새 지도 생성
map = folium.Map((33.3616666, 126.5291666), zoom_start=10)

# 지리 데이터가 있는 geojson 파일을 로드합니다 (주의: 이 줄에 오탈자가 있습니다. 'jeju_geojson.json'이어야 합니다)
jsonfile = open('jeju_geojson.json', 'r')
jsondata = json.load(jsonfile)

# 'df' 데이터를 기반으로 Choropleth 지도를 생성하고 지도에 추가합니다.
cho = folium.Choropleth(
    geo_data=jsondata,
    data=df,
    key_on='feature.id',
    bins=5,
    columns=['읍면동', '인구수'],
    legend_name='제주 인구수'
).add_to(map)

# 지도에 툴팁과 팝업을 추가합니다.
cho.geojson.add_child(folium.features.GeoJsonTooltip(['adm_nm'], ['위치'], labels=True))
cho.geojson.add_child(folium.features.GeoJsonPopup(['adm_nm'], ['위치'], labels=True))

# 코드 끝입니다.