map_sejong.py
원본 내용을 읽기 전용으로 표시합니다.
# 세종 전체 업종 구조 + 상권 유형 지도# sejong_analysis.py 에서는 세종지도() 함수만 가져다 씀 ^^import jsonimport osimport numpy as npimport foliumfrom common import *def 세종지도(now, CATS, dong, comp, cell, prof, BEST_K):# 세종 전체 지도 (과제 요구사항: 지역별 업종 구조와 상권 유형을 지도에 시각화)log("\n" + "=" * 70)log("4. 지도 시각화 ①: 세종 전역 (output/map1_세종_업종구조_상권유형.html)")log("=" * 70)geo = json.load(open(os.path.join(데이터폴더, "sejong_admdong.geojson"), encoding="utf-8"))최다업종 = comp.idxmax(axis=1) # 동마다 제일 많은 업종# 지도에 마우스 올리면 나오는 정보 넣기for f in geo["features"]:동이름 = f["properties"]["adm_nm"].split()[-1]f["properties"]["동"] = 동이름if 동이름 in dong.index:f["properties"]["업소수"] = int(dong.loc[동이름, "업소수"])f["properties"]["최다업종"] = f"{최다업종[동이름]} ({comp.loc[동이름, 최다업종[동이름]]:.0%})"f["properties"]["소멸률"] = f"{dong.loc[동이름, '소멸률']:.1%}"f["properties"]["체인비율"] = f"{dong.loc[동이름, '체인비율']:.1%}"구성 = []for c in CATS[:5]:구성.append(f"{c} {comp.loc[동이름, c]:.0%}")f["properties"]["업종구성"] = " / ".join(구성)m1 = 지도만들기([36.53, 127.27], 11)# 행정동별 업소 수 색칠ch = folium.Choropleth(geo_data=geo, data=dong.reset_index(), columns=["행정동명", "업소수"],key_on="feature.properties.동", fill_color="Blues", fill_opacity=0.6, line_opacity=0.6,legend_name="행정동별 업소 수", name="행정동별 업소 수(단계구분도)",).add_to(m1)folium.GeoJsonTooltip(fields=["동", "업소수", "최다업종", "업종구성", "소멸률", "체인비율"],aliases=["행정동", "업소 수", "최다 업종", "상위5 업종 구성", "1년 소멸률", "체인 비율"]).add_to(ch.geojson)# 격자별 상권 유형 (네모 칸)격자레이어 = folium.FeatureGroup(name="격자별 상권 유형(K-Means)", show=True)dlat = GRID_M / 110540dlon = GRID_M / (111320 * np.cos(np.radians(LAT0)))for (gx, gy), r in cell.iterrows():lat0 = LAT0 + gy * dlatlon0 = LON0 + gx * dlontop3 = r[CATS].sort_values(ascending=False).head(3)글 = f"<b>{r['유형명']}</b><br>{r['대표동']} / 업소 {int(r['업소수'])}개<br>"for k, v in top3.items():글 += f"{k} {v:.0%}<br>"글 += f"1층비율 {r['1층비율']:.0%}, 체인 {r['체인비율']:.0%}"folium.Rectangle([[lat0, lon0], [lat0 + dlat, lon0 + dlon]], color="white", weight=1,fill=True, fill_color=COLORS[int(r["군집"]) % 8], fill_opacity=0.75,tooltip=글).add_to(격자레이어)격자레이어.add_to(m1)# 업종별 업소 위치 (처음엔 꺼놓음)for i in range(8):c = CATS[i]레이어 = folium.FeatureGroup(name=f"업소 위치: {c}", show=False)업종업소 = now[now["상권업종대분류명"] == c]for _, r in 업종업소.iterrows():folium.CircleMarker([r["위도"], r["경도"]], radius=2, color=COLORS[i], fill=True,fill_opacity=0.7, weight=0).add_to(레이어)레이어.add_to(m1)# 범례 (html로 직접 넣음)범례 = "<div style='position:fixed;bottom:30px;left:10px;z-index:9999;background:white;padding:8px 10px;" \"border:1px solid #ccc;font-size:12px;border-radius:4px'><b>격자 상권 유형</b>"for c in range(BEST_K):범례 += f"<div><span style='display:inline-block;width:12px;height:12px;background:{COLORS[c % 8]};" \f"margin-right:6px'></span>{prof.loc[c, '유형명']}</div>"범례 += "</div>"m1.get_root().html.add_child(folium.Element(범례))folium.LayerControl(collapsed=False).add_to(m1)m1.save(os.path.join(결과폴더, "map1_세종_업종구조_상권유형.html"))log("저장 완료")if __name__ == "__main__":from sejong_area import 탐색분석, 상권유형군집now, prev, CATS = 데이터준비()dong, comp = 탐색분석(now, prev, CATS)cell, prof, BEST_K = 상권유형군집(now, prev, CATS)세종지도(now, CATS, dong, comp, cell, prof, BEST_K)
파일 확인 정보
SHA-256: c08d6e44d2766ff47dcbc0101a015585bbabe9ee977458c2a4bb21f3477c6fc6