반응형
먼저 보고 오셔야 하는 게시글
geopandas, folium을 통하여 지도 시각화하기(1)
결과물 먼저 아래 게시물들을 보고 오시면 좋을 것 같습니다! 코랩(colab)에 활용할 파일 업로드 하는 법 1. 코랩에 접속해주신 다음에 노트를 열어주시고요. 2. 왼쪽 탭에서 폴더 아이콘 클릭해주
datanaly.tistory.com
전체 코드
import geopandas as gpd
import pandas as pd
import folium
from folium.features import DivIcon
df_gu= gpd.read_file('/content/sig.json')
df_bdong = gpd.read_file('/content/emd.json')
cc = pd.read_table('/cc.csv', sep=',')
tt = pd.read_table('/tt.csv', sep=',')
result_df = pd.merge(df_gu, df_bdong, left_on=df_gu['SIG_CD'], right_on=df_bdong['EMD_CD'].str[:5], how='left')
gdf_test = result_df[result_df['SIG_KOR_NM'].isin(['광진구'])].reset_index(drop=True)
m = folium.Map(location=[37.54672073122991, 127.08580934446613], zoom_start=13.5)
# 시각화 할 경계선 색상 지정
colors = ['red', 'blue', 'green', 'purple', 'orange', 'darkred', 'darkblue']
# FeatureGroup 사전 생성
layer_dict = {}
# 각 경계선을 지도에 추가
for idx, row in gdf_test.iterrows():
dong_name = row['EMD_KOR_NM']
polygon_wkt = row['geometry_y']
if dong_name in layer_dict:
layer = layer_dict[dong_name]
else:
# 해당 구이름에 대한 FeatureGroup가 없으면 새로 생성
layer = folium.FeatureGroup(name=dong_name,show=True)
layer_dict[dong_name] = layer
layer.add_to(m)
color = colors[len(layer_dict) % len(colors)]
t1 = folium.GeoJson(polygon_wkt,
style_function=lambda feature, color=color: {
'fillColor': color, #채우기 색상
'fillOpacity': 0.5, #채우기 투명도
'color': color, # 테두리 색상
'weight': 2, #테두리 두께
'opacity': 1 # 테두리 투명도
},
tooltip=f'법정동: {dong_name}')
t1.add_to(layer)
for n in cc.index:
lat1, lon1 = cc.loc[n, 'latitude1'], cc.loc[n, 'longitude1']
price1 = cc.loc[n, 'price1']
dong = cc.loc[n, 'dong'] # 이름 데이터
# 이름과 가격을 표시하는 DivIcon 추가, 스타일 변경
folium.Marker(
[lat1, lon1],
icon=DivIcon(
icon_size=(90, 50),
icon_anchor=(25, 25),
html=f'''
<div style="font-size: 10pt; font-weight: bold; color: white;
background: red; padding: 5px; border-radius: 5px;
text-align: center;">
{dong}<br>{price1}
</div>
''',
)
).add_to(m)
for n in tt.index:
lat2, lon2 = tt.loc[n, 'llatitude2'], tt.loc[n, 'longitude2']
price2 = tt.loc[n, 'price2']
name = tt.loc[n, 'name'] # 이름 데이터
# 이름과 가격을 표시하는 DivIcon 추가, 스타일 변경
folium.Marker(
[lat2, lon2],
icon=DivIcon(
icon_size=(110, 50),
icon_anchor=(50, 25),
html=f'''
<div style="font-size: 10pt; font-weight: bold; color: white;
background: navy; padding: 5px; border-radius: 5px;
text-align: center;">
{name}<br>{price2}
</div>
''',
)
).add_to(m)
# folium.LayerControl 추가한 뒤, 지도 표시
folium.LayerControl(collapsed=False).add_to(m)
folium.LatLngPopup().add_to(m)
# html파일로 저장
m.save("법정동시각화_231210.html")
m
시작!
두 데이터 프레임 합치기
result_df = pd.merge(
df_gu, df_bdong,
left_on=df_gu['SIG_CD'],
right_on=df_bdong['EMD_CD'].str[:5],
how='left'
)
# pd.merge(a,b) -> a,b 두 데이터 프레임을 합치는 메서드
# pd.merge(df_gu, df_bdong) -> df_gu, df_bdong 두 데이터 프레임을 합치겠다!
# left_on = df_gu['SIG_CD'] -> 왼쪽 데이터 프레임에서 맞추는 기준은 df_gu['SIG_CD'] 컬럼으로 하겠다.
# right_on=df_bdong['EMD_CD'].str[:5]
# -> 오른쪽 데이터 프레임에서 맞추는 기준은 df_bdong['EMD_CD'] 컬럼열들의 0~4번째 글자들로 하겠다.
# how='left' -> left인 df_gu의 'SIG_CD' 컬럼열 기준으로 합치겠다!
# 위 데이터 프레임을 result_df라고 하겠다!
result_df.head()
# result_df의 상위 5열을 출력하겠다!
출력 결과
.merge()의 자세한 설명
[Python] 데이터프레임 합치기 :: pd.merge()
pd.merge는 공통의 열을 기준으로 두 데이터프레임을 합쳐준다. sql에서 join과 같은 역할이다. import pandas as pd # 기준열 이름이 같을 때 pd.merge(left, right, on = '기준열', how = '조인방식') # 기준열 이름
mizykk.tistory.com
원하는 데이터만 가져오기
gdf_test = result_df[result_df['SIG_KOR_NM'].isin(['광진구'])].reset_index(drop=True)
# gdf_test = result_df[조건] -> 조건에 맞춘 데이터 프레임 result_df을 gdf_test라고 할거야.
# result_df['SIG_KOR_NM'].isin(['광진구']) -> SIG_KOR_NM 컬럼열에서 광진구인 컬럼만 보여줘.
# .reset_index(drop=True) -> 인덱스를 새로 부여하고 기존의 인덱스를 삭제할거야!(drop=True)
gdf_test
# gdf_test를 출력해보자!
출력 결과
지도 만들기
m = folium.Map(location=[37.54672073122991, 127.08580934446613], zoom_start=13.5)
# m = folium.Map() -> 맵을 생성하겠다.
# location=[37.54672073122991, 127.08580934446613] -> 위도 = 37.54672073122991, 경도 = 127.08580934446613
# zoom_start -> 시작시 확대 정도(최대 값 18)
colors = ['red', 'blue', 'green', 'purple', 'orange', 'darkred', 'darkblue']
# 리스트 형태로 시각화 할 경계선 색상 그룹을 만들어서 colors라고 하겠다.
layer_dict = {}
# 동 기준으로 나눌 레이어그룹을 딕셔너리로 생성하고 layer_dict이라고 하겠다.
m
# m이라는 지도를 출력하겠다.
출력 결과
각 경계선을 지도에 추가
for idx, row in gdf_test.iterrows():
# for 인덱스, 컬럼, in 데이터프레임.iterrows() -> 데이터프레임의 반복문 형태 중 하나
# .iterrows() 행의 인덱스와 해당 행의 데이터를 반환
dong_name = row['EMD_KOR_NM']
# EMD_KOR_NM 열의 데이터를 dong_name라고 할거야.
polygon_wkt = row['geometry_y']
# geometry_y 열의 데이터를 polygon_wkt라고 할거야.
if dong_name in layer_dict:
# dong_name이 layer_dict 안에 존재한다면
layer = layer_dict[dong_name]
# layer는 layer_dict의 dong_name 데이터다.
else:
# dong_name이 layer_dict 안에 존재하지 않는다면
layer = folium.FeatureGroup(name=dong_name, show=True)
# 만약 dong_name이 layer_dict에 없다면, name이 dong_name인 새로운 folium.FeatureGroup 객체를 생성합니다.
# FeatureGroup은 지도 위에 그룹화된 요소들을 나타냅니다.
layer_dict[dong_name] = layer
layer.add_to(m)
# 생성된 FeatureGroup을 layer_dict에 저장하고, 지도 객체 m에 추가합니다.
# 이렇게 함으로써 나중에 지도 위에 해당 FeatureGroup을 표시할 수 있습니다.
다음 글에서 이어서 진행하겠습니다.
다음 글!
geopandas, folium을 통하여 지도 시각화하기(3)
먼저 보고 오셔야 하는 게시글 geopandas, folium을 통하여 지도 시각화하기(1) 결과물 먼저 아래 게시물들을 보고 오시면 좋을 것 같습니다! 코랩(colab)에 활용할 파일 업로드 하는 법 1. 코랩에 접속
datanaly.tistory.com
반응형
'Today i learned & Week i learned > 프로젝트 관련' 카테고리의 다른 글
geopandas, folium을 통하여 지도 시각화하기(3) (0) | 2023.12.24 |
---|---|
geopandas, folium을 통하여 지도 시각화하기(1) (0) | 2023.12.23 |
SHP파일 GeoJSON 파일로 변경하는법 (1) | 2023.12.22 |
folium(포리움), DivIcon 활용하여 지도에 데이터,텍스트 표시 (0) | 2023.12.21 |