Today i learned & Week i learned/프로젝트 관련

geopandas, folium을 통하여 지도 시각화하기(2)

데분조 2023. 12. 23. 13:09
반응형

먼저 보고 오셔야 하는 게시글

 

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

 

반응형