1. 각각의 데이터들을 따로 시각화
투명도 없이 진하게 표시됨
2. 기온,강수량,대기오염도,유동인구 겹쳐서 시각화
투명도 있게 표시됨
# =============================================================================
# =============================================================================
# # 멀캠 최종 프로젝트 GUI
# =============================================================================
# =============================================================================
# < GUI 만들기 >
import tkinter as tk
from tkinter import ttk
# 인스턴스 만들기
win = tk.Tk()
# 타이틀 정하기
win.title("멀티캠퍼스 최종 프로젝트")
# 창 사이즈
win.geometry("640x480")
# 사이즈 조절 가능 여부 설정 (세로, 가로)
win.resizable(True, True) # (세로 고정, 가로 조절 가능)
# =============================================================================
# tab 만들기
# =============================================================================
tabControl = ttk.Notebook(win) # Create Tab Control
tab1 = ttk.Frame(tabControl) # Create a tab
tabControl.add(tab1, text='주말 야외 데이트 지역 추천')
tabControl.pack(expand=1, fill="both") # Pack to make visible
# =============================================================================
# 첫 번째 탭 만들기
# =============================================================================
# < label frame 만들기 >
# tab 1에 라벨 프레임 (weight) 만들기
weight = ttk.LabelFrame(tab1, text='가중치를 정하세요', labelanchor = 'n')
weight.pack(side = 'top', pady=10)
# tab 1에 라벨 프레임 (month) 만들기
month = ttk.LabelFrame(tab1, text='원하는 월을 선택하세요', labelanchor = 'n')
month.pack(side = 'top', pady=10)
# tab 1에 라벨 프레임 (srch) 만들기
srch = ttk.LabelFrame(tab1, text='버튼을 클릭하세요', labelanchor = 'n')
srch.pack(side = 'top', pady=10)
# 라벨 추가 (라벨 프레임 안에)
## weight 안에 추가
label = ttk.Label(weight, text = "기온")
label.grid(row = 0 , column = 0)
label2 = ttk.Label(weight, text = "강수량")
label2.grid(row = 1 , column = 0)
label3 = ttk.Label(weight, text = "대기오염도")
label3.grid(row = 2 , column = 0)
label4 = ttk.Label(weight, text = "유동인구")
label4.grid(row = 3 , column = 0)
## month 안에 추가
label5 = ttk.Label(month, text = "월 선택")
label5.grid(row = 0, column = 0)
# 라디오 버튼 (가중치)
## 기온 가중치
RadioVariety=tk.IntVar()
radio1=tk.Radiobutton(weight, text="상", value=3, variable=RadioVariety)
radio1.grid(row = 0 , column = 1)
radio2=tk.Radiobutton(weight, text="중", value=2, variable=RadioVariety)
radio2.grid(row = 0 , column = 2)
radio3=tk.Radiobutton(weight, text="하", value=1, variable=RadioVariety)
radio3.grid(row = 0 , column = 3)
## 강수량 가중치
RadioVariety2=tk.IntVar()
radio5=tk.Radiobutton(weight, text="상", value=3, variable=RadioVariety2)
radio5.grid(row = 1 , column = 1)
radio6=tk.Radiobutton(weight, text="중", value=2, variable=RadioVariety2)
radio6.grid(row = 1 , column = 2)
radio7=tk.Radiobutton(weight, text="하", value=1, variable=RadioVariety2)
radio7.grid(row = 1 , column = 3)
## 대기오염도 가중치
RadioVariety3=tk.IntVar()
radio9=tk.Radiobutton(weight, text="상", value=3, variable=RadioVariety3)
radio9.grid(row = 2 , column = 1)
radio10=tk.Radiobutton(weight, text="중", value=2, variable=RadioVariety3)
radio10.grid(row = 2 , column = 2)
radio11=tk.Radiobutton(weight, text="하", value=1, variable=RadioVariety3)
radio11.grid(row = 2 , column = 3)
## 유동인구 가중치
RadioVariety4=tk.IntVar()
radio13=tk.Radiobutton(weight, text="상", value=3, variable=RadioVariety4)
radio13.grid(row = 3 , column = 1)
radio14=tk.Radiobutton(weight, text="중", value=2, variable=RadioVariety4)
radio14.grid(row = 3 , column = 2)
radio15=tk.Radiobutton(weight, text="하", value=1, variable=RadioVariety4)
radio15.grid(row = 3 , column = 3)
# 콤보박스
values=[str(i)+"월" for i in range(1, 13)]
combobox=tk.ttk.Combobox(month, height=15, values=values)
combobox.grid(row = 0, column = 1)
combobox.set("목록 선택")
# 버튼 함수 정의
def datecourse() :
# 1. 파일 불러오기
import pandas as pd
# 기온
temp_norm = pd.read_csv("C:/Users/USER/Desktop/python/mulcam_final_project/정규화/temp_norm.csv",encoding='euc-kr')
temp_norm.index
temp_norm = temp_norm.set_index("district")
# 강수량
rain_norm = pd.read_csv("C:/Users/USER/Desktop/python/mulcam_final_project/정규화/rain_norm.csv",encoding='euc-kr')
rain_norm.index
rain_norm = rain_norm.set_index("district")
# 대기오염도
dust_norm = pd.read_csv("C:/Users/USER/Desktop/python/mulcam_final_project/정규화/dust_norm.csv",encoding='euc-kr')
dust_norm.index
dust_norm = dust_norm.set_index("district")
# 유동인구
flt_pp_norm = pd.read_csv("C:/Users/USER/Desktop/python/mulcam_final_project/정규화/flt_pp_norm.csv",encoding='euc-kr')
flt_pp_norm.index
flt_pp_norm = flt_pp_norm.set_index("district")
# 공원 위치
park_loc = pd.read_csv('C:/Users/USER/Desktop/python/mulcam_final_project/전처리/공원/서울시 주요 공원현황_3.csv',encoding='euc-kr')
# 맛집 위치
rest_loc = pd.read_csv('C:/Users/USER/Desktop/python/mulcam_final_project/전처리/맛집/restaurant.csv',encoding='euc-kr')
# 2. 서울시 구별 경계선 데이터 불러오기
import json
geo_path = 'C:/Users/USER/Desktop/python/P_4week/02.skorea_municipalities_geo_simple.json'
geo_str = json.load(open(geo_path, encoding='utf-8'))
# 3. 가중치 부여
temp_norm = temp_norm*int(RadioVariety.get())
rain_norm = rain_norm*int(RadioVariety2.get())
dust_norm = dust_norm*int(RadioVariety3.get())
flt_pp_norm = flt_pp_norm*int(RadioVariety4.get())
# 4. 지도에 시각화 하기
import folium
total_map = folium.Map(location=[37.5502, 126.982], zoom_start=11,
tiles='Stamen Terrain')
# 기온
total_map.choropleth(geo_data = geo_str,
data = temp_norm[combobox.get()],
columns = [temp_norm.index, temp_norm[combobox.get()]],
fill_color = 'PuRd', #PuRd, YlGnBu
key_on = 'feature.id',
name = "기온")
# 강수량
total_map.choropleth(geo_data = geo_str,
data = rain_norm[combobox.get()],
columns = [rain_norm.index, rain_norm[combobox.get()]],
fill_color = 'PuRd', #PuRd, YlGnBu
key_on = 'feature.id',
name = "강수량")
# 대기오염도
total_map.choropleth(geo_data = geo_str,
data = dust_norm[combobox.get()],
columns = [dust_norm.index, dust_norm[combobox.get()]],
fill_color = 'PuRd', #PuRd, YlGnBu
key_on = 'feature.id',
name = "대기오염도")
# 유동인구
total_map.choropleth(geo_data = geo_str,
data = flt_pp_norm[combobox.get()],
columns = [flt_pp_norm.index, flt_pp_norm[combobox.get()]],
fill_color = 'PuRd', #PuRd, YlGnBu
key_on = 'feature.id',
name = "유동인구")
# 공원 MarkerCluster
from folium.plugins import MarkerCluster
p_lat = park_loc.lat.values
p_lng = park_loc.lng.values
p_locations = list(zip(p_lat,p_lng))
p_popups = list(park_loc.name.values)
p_icons = [folium.Icon(icon="tree", prefix="fa", color="green") for _ in range(len(p_locations))]
p_icon_create_function = """\
function(cluster) {
return L.divIcon({
html: '<b>' + cluster.getChildCount() + '</b>',
className: 'marker-cluster marker-cluster-small',
iconSize: new L.Point(30, 30)
});
}"""
p_marker_cluster = MarkerCluster(
locations=p_locations, popup=p_popups,
name='공원',
overlay=True,
control=True,
icon_create_function = p_icon_create_function,
icons = p_icons)
p_marker_cluster.add_to(total_map)
# 맛집 MarkerCluster
r_lat = rest_loc.lat.values
r_lng = rest_loc.lng.values
r_locations = list(zip(r_lat,r_lng))
r_popups = list(rest_loc.restaurant.values)
r_icons = [folium.Icon(icon="heart", prefix="fa", color="orange") for _ in range(len(r_locations))]
r_icon_create_function = """\
function(cluster) {
return L.divIcon({
html: '<b>' + cluster.getChildCount() + '</b>',
className: 'marker-cluster marker-cluster-large',
iconSize: new L.Point(30, 30)
});
}"""
r_marker_cluster = MarkerCluster(
locations=r_locations, popups=r_popups,
name='맛집',
overlay=True,
control=True,
icon_create_function = r_icon_create_function,
icons = r_icons)
r_marker_cluster.add_to(total_map)
folium.LayerControl().add_to(total_map)
save_path = "C:/Users/USER/Desktop/python/mulcam_final_project/시각화/GUI/datearea_" + str(combobox.get()) + ".html"
total_map.save(save_path)
# webbrowser 로 지도 띄우기
from selenium import webdriver
import time
url = 'file:///' + save_path
driver = webdriver.Chrome('D:/Temp/chromedriver_win32/chromedriver.exe') # 빈 브라우저 띄움
time.sleep(1)
driver.get(url)
# 버튼 추가
srchbutton = ttk.Button(srch,text="조건에 맞는 지역 찾기", width=20, command= datecourse)
srchbutton.grid(row=0, column = 0)
# =============================================================================
# 메뉴 만들기
# =============================================================================
# Creating a Menu Bar
from tkinter import Menu
from tkinter import messagebox as msg
menu_bar = Menu(win) # 취상위 메뉴 = menu_bar
win.config(menu=menu_bar) # 최상위 메뉴 만들기
# Add menu items
file_menu = Menu(menu_bar, tearoff=0) # 최상위 메뉴 아래에 file_menu 만들기
menu_bar.add_cascade(label="File", menu=file_menu) # file_menu를 "File" 이라는 이름으로 메뉴 만들기
# .add_cascade -> 메뉴를 수직으로 정렬
# Exit 함수 만들기
def _quit():
win.quit()
win.destroy()
exit()
file_menu.add_separator() # 메뉴 구분
file_menu.add_command(label="Exit", command=_quit) # file 메뉴에 "Exit" 탭 추가 + 명령함수 (_quit)
# Display a Message Box
def _msgBox():
msg.showinfo('Information', '멀티캠퍼스 최종 프로젝트 (author : 김수연,이혁수,김경주)\n\t\t만든년도 : 2020.')
# Add another Menu to the Menu Bar and an item
help_menu = Menu(menu_bar, tearoff=0) # 최상위 메뉴 아래에 help_menu 만들기
menu_bar.add_cascade(label="Help", menu=help_menu) # help_menu를 "Help"라는 이름으로 메뉴 만들기
help_menu.add_command(label="About", command=_msgBox) # display messagebox when clicked
# =============================================================================
# 실행 아이콘 만들기
# =============================================================================
# Change the main windows icon 아이콘 변경
win.iconbitmap('C:/Users/USER/Desktop/python/mulcam_final_project/시각화/park.ico') # ico 파일
# =============================================================================
# 실행
# =============================================================================
win.mainloop()
Python
복사