본문 바로가기
개발일지/개인 프로젝트

프로젝트 두번째. 효율적인 여행을 위한 핀찍기

by 개발에정착하고싶다 2022. 8. 15.

취업할 수 있는 기본적인 수준이 달성될 11월 ~ 1월 즈음에 여행을 가기로 했다.

그러던 중, '여러 지역을 전투적으로 도는게 좋을까',

'한 지역, 한 지역을 제대로 조지면서 다닐까.'를 고민하게 되었다.

결국 둘다 하되, 가급적이면 한 지역을 제대로 조지는 쪽에 무게를 싣게 되었다.

 

프로젝트 시작 원인

1박 2일의 경우엔 크게 데이터화 할 필요도 없었지만, 4박이 넘어가니, 가야할 장소 목록이 50개 가량이 되었고,

그러다보니 땅 덩어리가 넓어서 왼쪽 갔다가 오른쪽 갔다가, 다시 왼쪽갔다가 그런짓의 비 효율적인 일이 비일비재 할 것이라고 직감했다.

왜냐하면 난 현지인도 아니고 이름도 똑같은 울산광역시이지만 울산이 상당히 넓었기 때문이다.

 

프로젝트 목표

돈, 시간에 있어서 효율적인 장소를 시각화하여 재밌게 여행해보자!

 



# 기본셋팅은 처음에 정리 잘해서 넣어주는게 좋은데
# 본 프로젝트의 목표는 딱히 정리가 아니기 때문에 신경은 안썼다.
# 하지만 다음 프로젝트부터는 목표와 관련없이 정리하는 것을 습관화 하도록 하자.

import pandas as pd

geo_path = './02. skorea_municipalities_geo_simple.json'
geo_str = json.load(open(geo_path, encoding='utf-8'))
# 분류를 나누어서 저장하기
# 타입, 이름, 주소, 위도, 경도

ulsan_raw = pd.read_excel('ulsan_raw.xlsx')
ulsan_raw.head()

'''
	타입	이름	주소	위도	경도
0	여행지	대왕암공원	울산광역시 동구 등대로 95	NaN	NaN
1	여행지	대왕암 출렁다리	울산광역시 동구 일산동 905	NaN	NaN
2	여행지	울기둥대	울산 동구 등대로 155	NaN	NaN
3	여행지	오영수 문학관	울산광역시 울주군 언양읍 헌양길 280-12	NaN	NaN
4	여행지	언양읍성	울산광역시 울주군 언양읍 동부리 306-1	NaN	NaN
'''

# 여행지, 이름, 주소까지는 일일이 맥의 메모장에 저장으로 1차 작업
# 1차 작업된 것을 엑셀에 넘겨주면서 2차 작업을 완료했다.
# 2차 작업시, 주소작업할때 0층, 00000 박물관 등의 이름은 삭제하고 저장해줬다.
# 그 이유는 스크래핑으로 기계적으로 하기에는 유사한 이름으로 같은게 많았다.
# 주소 부분도 불분명한 주소가 많았어서 구글, 네이버, 그 여행지를 관할하는 관광 사이트에서 주소를 따왔다.
import googlemaps

keys = '구글개인키 입력해주세요'
gmaps = googlemaps.Client(key = keys)

위도 = []
경도 = []

for i, s in ulsan_raw.iterrows():
    # print(i)
    address = s.주소
    
    # lat, lng
    tmp = gmaps.geocode(address, language='ko')
    lat = tmp[0].get('geometry')['location']['lat']
    lng = tmp[0].get('geometry')['location']['lng']
    
    위도.append(lat)
    경도.append(lng)
    
    
# 틀림 포인트가 상당했다.
# 1. iterrows가 아닌 enumate? 그거랑 len, 다 빼고 ulsan_raw로도 써봤는데 길이가 컬럼 기준으로
# 되기 때문에 길이가 4였다. 즉, 위도와 경도를 따내기에는 초기설정이 올바르지 않았다.
# 그래서 iterrows로 rows기준으로 변경하게 되었다.

# 2. 간결하게 하기 위해서 
# s.위도 = lat
# s.경도 = lng
# 라고도 했었는데, 이게 실행엔 문제가 없는데 실질적인 저장이 되지 않더라
# 그래서 반복문 밖에 위도, 경도 빈 리스트 만들어줬고, 반복문 내에도 append형식으로 변경해주었다.
# 우선 생략했지만 위도, 경도를 따로 잘 저장되었는지 확인해주었다.

ulsan_raw.위도= 위도
ulsan_raw.경도 = 경도
# save point

ulsan_raw.to_excel('ulsan.xlsx', index = False)


# 초기 가공 완료된 데이터로 본격적인 시작

ulsan = pd.read_excel('ulsan.xlsx')
for idx, rows in ulsan.iterrows():
    print(rows.타입)
    break
    
# 여행지
import folium

center= [35.540164, 129.3474133]
my_map = folium.Map(
    location = center,
    zoom_start = 10,
    tiles = 'StamenToner'
)

for idx, rows in ulsan.iterrows():
    
    # 타입 별 색상 설정
    if rows.타입 == '여행지':
        mk_color = 'blue'
        ic_color = 'lightblue'
    elif rows.타입 == '식사':
        mk_color = 'red'
        ic_color = 'lightred'
    elif rows.타입 == '카페':
        mk_color = 'purple'
        ic_color = 'lightpurple'
    elif rows.타입 == '숙소':
        mk_color = 'yellow'
        ic_color = 'lightyellow'
        
    # 지도 마커 생성
    folium.Marker(
        location = [rows['위도'], rows['경도']],
        popup = rows['이름'],
        tolltip = rows['이름'],
        icon = folium.Icon(
            color = mk_color,
            icon_color = ic_color,
            prefix = 'fa'
        )
    ).add_to(my_map)
my_map

 

# 처음으로 켰을때 나오는 화면

 

 

 

# 내가 확인하고자 하는 최소 확대화면



# 복기

 

이번 과제를 하면서 부족한 점이 정말 많았다.

 

1. 소화했다고 끝이 아니다.

 

분명 전에는 소화까지 완료했지만, 기억이 안나는게 너무 많았다. 때문에 전에 저장해놓았던 자료와 전에 참고하였던 타인의 유튜브 및 블로그도 보면서 다시금 하였다.

나의 코드, 그들의 행함에 있어서 뭘하는지 이해 다 되고 원리적으로도 다 알겠어서 활용은 ㅇㅋ

하지만 그걸 아예 안보고 하기엔 아직 너무 부족하다..

정말 하루라도 빨리 일할 수준되어서 일하고 싶다 그래서 완전히 체화시키고 싶다.

 

2. 상호를 키워드로 주소 얻어내기

 

상호를 키워드로하여 주소 얻어내는게 찾아도 정보가 없고 한계가 있더라.

추후에는 상호를 키워드로 하여서 변수를 감안하여 주소를 자동화로 따오는 것을 개발해내자.