코딩 연습장/Python

Python/JSP/R 이용한 맛집 프로젝트 - 2 (Python 지도 시각화)

Do아 2021. 6. 19. 14:47
728x90

2021/04/14(수)

 

 

 

 

Python 크롤링 알고리즘 참고

https://cordingdoah.tistory.com/97

 

Python/R 이용한 맛집 프로젝트 - 1 (Python 크롤링)

2021/04/14(수) 프로젝트 이름 : Korean Food Finder (코리안 푸드 파인더) -->  코푸파 서울, 부산, 대전, 대구, 울산, 광주, 인천, 제주 지역의 한식, 중식, 일식, 양식별로 크롤링을 해오기로 했다 서울 -->.

cordingdoah.tistory.com

 

 

 

 

프로젝트 이름 : Korean Food Finder (코푸파)

 

 

전 게시물에서 만들었던 seoulkor.csv파일을 보면 이렇게 이름, 평점, 리뷰, 링크, 주소가 저장되어 있는 것을 확인할 수 있는다 이 csv파일에 주소를 이용해서 위도와 경도를 찾아서 csv파일을 생성 할것임

 

 

 

 

<csv에서 위도경도 찾아내기>

#크롤링해온 음식점 위도 경도값 저장하기
#서울

import googlemaps
import pandas as pd
df_list=pd.read_csv(filename+'.csv',encoding='utf-8')



# 구글맵 키
gmaps_key = "" #구글 API키값 필요
gmaps = googlemaps.Client(key = gmaps_key)

# 빈 리스트 생성(위도, 경도)
place_lat = []
place_lng = []

# 위경도 최대최소값
#우리나라 위도 경도값
max_lat = 38.0
min_lat = 33.0
max_lng = 132.0
min_lng = 126.0


#place
#df_list는 csv배열로 변경 해주기

for place in df_list["Addr"]:
    tmp = gmaps.geocode(place, language = "ko")
    
    # 구글맵 검색 될 경우
    if tmp:
        tmp_loc = tmp[0].get("geometry")
        tmp_lat = tmp_loc["location"]["lat"]
        tmp_lng = tmp_loc["location"]["lng"]
        
        #우리나라 위도 경도 값안에 들어있지 않는 경우
        if(tmp_lat > max_lat or tmp_lat < min_lat or tmp_lng > max_lng or tmp_lng < min_lng):
            place_lat.append("0")
            place_lng.append("0")
            
        #우리나라 위도 경도 값 안에 들어있는 경우
        else:
            place_lat.append(tmp_lat) # 위도 추가
            place_lng.append(tmp_lng) # 경도 추가
    # 검색 안 될 경우 0으로 입력
    else:
        place_lat.append("0")
        place_lng.append("0")
        
print("위경도 추가 완료")

# list -> dataframe, 열 이름 변경 
df_list2 = pd.DataFrame(place_lat)
df_list2 = df_list2.rename(columns = {0: "lat"})
df_list3 = pd.DataFrame(place_lng)
df_list3 = df_list3.rename(columns = {0: "lng"})

# dataframe 3개 합치기
df = pd.concat([df_list, df_list2, df_list3], axis = 1)
# 위경도 0인 행 삭제
df = df.query("lat != '0'")

df.to_csv(filename+"location.csv", encoding = "utf-8-sig")

df.tail()

1. df_list변수안에 pd를 사용해서 seoulkor.csv을 열어서 읽어온다

2. 구글 api키 필요! 구매하던가 카드 등록하고 무료 체험판을 사용할 수 있음

3. 구글 api키 사용해서 구글맵을 가져온다

4. 위도 경도를 저장할 빈 리스트를 생성

5. 우리나라의 최대최소 위도 경도값을 변수의 지정

6. 저장한 주소값을 사용해서 위도 경도를 찾아 준다

7. 주소로 찾은 위도 경도의 범위가 우리나라 안에 있는 값인지 확인

8. 우리나라 밖에 있는 경우엔 위도 경도에 0을 주고 범위안에 있으면 추가

9. 구글맵에 검색되지 않을 경우에도 값을 0으로 준다

10. 완성되면 위경도 추가를 띄운다

11. 각각의 만들어진 위도 경도의 값들을 dataframe을 사용하여 위도 경도 열을 추가

12. 위경도 열과 seoulkor.csv을 합쳐준다

13. 위경도가 0인 행은 삭제 시킨다

14. 만들어진 데이터를 파일이름 + location.csv이름으로 저장 ex) seoulkorlocation.csv

15. 생성된 파일의 끝 5개만 출력 ( 확인용)

 

 

--> 결과화면

 


 

 

 

<생성된 seoulkorlocation.csv파일을 가지고 지도 html을 생성해보기>

#음식점 지도 만들기
import pandas as pd
import folium
import webbrowser
from folium.plugins import MarkerCluster

data_frame = pd.read_csv(filename+"location.csv",encoding='utf-8')

data_frame
map = folium.Map(location = [35.8797296,128.4964884], zoom_start =7)
marker_cluster = MarkerCluster().add_to(map)

for index,a in data_frame.iterrows():
    
    #평점 4점 이상 빨강
    if float(a["Score"]) >=4:
        score_color = "red"
    
    #평점 3점이상 오렌지
    elif float(a["Score"]) >=3:
        score_color = "orange"
    
    #3점 미만
    else:
        score_color = "lightgreen"
    
    print_popup= "<h5><strong>"+str(a["Name"])+"</strong></h5>"+" 평점 : "+ str(a["Score"])+" <br> 리뷰수 : "+str(a["Review"])+ "<br> 주소 : "+str(a["Addr"])+ "<br>"+'<a href="'+ str(a["Link"]) + '" target="_self">'+str(a["Link"])+'</a>' 
    
    folium.Marker(location = [a["lat"], a["lng"]],
    popup =print_popup, icon=folium.Icon(color=score_color)).add_to(marker_cluster)

map
map.save(filename +'.html')

#웹에 띄워줌
webbrowser.open(filename +'.html') 
print_popup

1. 생성된 파일을 읽어온다

2. 맵 변수에 folium을 사용하여 우리나라 위도 경도값을 입력하고 확대를 얼마나 시킬것인지 정해줌

3. markercluster를 이용해서 맵을 추가

4. 파일의 데이터를 읽어와 평점이 4점 이상이면 빨강, 3점 이상이면 오렌지, 3점 미만이면 초록을 변수에 넣어줌

5. marker의 popup을 사용해서 아이콘을 띄우고 그 아이콘의 색상을 평점에 맞게 띄워줌 링크는 클릭시 링크로 이동할 수 있도록 구현

6. 맵을 파일이름.html로 저장

7. webbrowser.open을 사용해 바로 창에 띄워줌

 

 

--> 결과화면

 

 

이렇게 화면이 뜨고 마우스 휠을 사용하거나 공을 클릭 시 아이콘을 볼 수 있음

 

 

아이콘을 클릭하면 해당 가게의 정보가 뜨는것을 볼 수 있음

 

 

링크 클릭 시 해당 가게 링크로 이동

 


 

 

 

여러개의 파일을 합쳐서 지역별로 만드는 것은 다음 게시물에서 설명

728x90