0-1 googlemaps
gmaps_key = '구글키'
gmaps = googlemaps.Client(key=gmaps_key)
tmp = gmaps.geocode('서울중부경찰서', language = 'ko')
print(tmp[0].get("formatted_address"))
tmp_loc = tmp[0].get('geometry')
print('위도 ==>', tmp_loc['location']['lat'])
print('경도 ==>', tmp_loc['location']['lng'])
googlemaps.Client(key=): GoogleMapsAPI와 통신할 수 있는 Client 객체를 생성한다. 이 때 key에는 내 구글맵스 키를 입력한다.
client객체.geocode('문자열', language='ko'): 지정한 문자열의 주소에 대한 지오코딩 쿼리를 실행하고, 결과를 지정한 언어로 반환한다. 여기서는 한국어.
반환한 값은 주어진 주소에 대한 상세 정보를 포함하는 Json형식.

dict.get(key): 딕셔너리 자료형의 키에 해당하는 값을 갖고 오는 것. 특별한 메서드가 아니라.
- 여기서 Json자료형이 리스트 안에 딱 1개 들어 있기 때문에, get을 쓰기 위해 tmp[0]으로 접근한다.
formatted_address는 주소가 들어 있다.
geometry에는 여러가지 값이 있지만, 위도, 경도 정보가 들어 있다.
tmp[0].get('geometry')['location']['lat']으로 하면 위도, 마지막에 ['lng']으로 하면 경도를 들고 온다.

0-2 folium
- Python에서 인터랙티브한 지도 생성하는 라이브러리. leaflet.js 기반, 파이썬 데이터 구조를 사용해 지리데이터 시각화, 다양한 지도 스타일과 상호작용 기능 구현.
folium.Map(location=[위도, 경도], zoom_start=13, tiles='OpenStreetMap'): 위도 경도를 숫자로 입력하면, 그 부분을 중심으로 지도 객체(Map)를 만든다.
- 매개변수
zoom_start=는 확대 비율이다. 크면 클수록 더 줌 한다.
tiles=: 지도의 스타일을 지정한다. OpenStreetMap은 OpenStreetmap에서 제공하는 기본 스타일 지도. 이 외에도 cartodbpositron, Stamen Terrain', 'Stamen Toner', 'Stamen Watercolor', 'CartoDB positron', 'CartoDB dark_matter'등이 있다.
json.load(open(geo_path, encoding='utf-8')): Json 모듈은 파이썬 표준 라이브러리로, JavaScriptObjectNotation 형식 데이터를 파싱하는 도구다.
json.load 함수는 json 형식 파일을 읽어서, 그 내용을 python 객체로 변환한다.
import json
geo_path = '../data/02. skorea_municipalities_geo_simple.json'
geo_str = json.load(open(geo_path, encoding='utf-8'))
- 여기서 geo_path는 대한민국 지자체 경계 정보를 담은 json파일의 경로.
- open함수로 geo_path에 지정된 경로 파일을 UTF-8 인코딩으로 연다.
folium.Choropleth(): 지리적 데이터와 실제 데이터값을 연결, 각 지역의 데이터값에 따라 다른 색상의 영역을 생성한다. 즉, 지도 위의 히트맵.ㄹ
- 매개변수
geo_data=: 지리적 경계 정의하는 데이터
data=: 각 지역별로 표시하려는 실제 데이터.
columns: data 매개변수에서 사용할 데이터플레임 지정. 첫 번째 컬럼은 지역의 이름 또는 ID, 두 번째 컬럼은 해당 지역의 데이터값.
fill_color: 채우는데 사용할 지도 색상 팔레트.
key_on: geo_data에서 지역의 경계를 정의하는 키와, data 매개변수에서 제공하는 데이터를 연결하는데 사용하는 속성. 보통 GeoJSON의 특성 내 속성에 대한 경로를 문자열로 지정. GeoJSON의 각 특성 ID가 지역 데이터와 연결되어 있으면, feature.id와 같이 사용.
이 json데이터 보면 id: 강동구 이런 식으로 되어 있다. 이걸 일치시키면 된다.
folium.add_to(): folium 라이브러리의 메서드로, folium의 요소(choropleth, marker, layer) 등을 다른 folium 객체에 추가한다. 주로, folium.Map 객체에 여러 시각적 요소 추가.
map = folium.Map(location=[37.5502, 126.982], zoom_start=11,
tiles='Stamen Toner')
folium.Choropleth(geo_data = geo_str,
data = crime_anal_norm['살인'],
columns = [crime_anal_norm.index, crime_anal_norm['살인']],
fill_color = 'YlGnBu',
key_on = 'feature.id').add_to(map)

folium.Marker(위도, 경도): 지정한 위도, 경도에 마커를 찍는다.
folium.CircleMarker(location=[위도, 경도], radius=, color=, fill_color, fill=True): 원형 마커를 추가.
- 매개변수
radius=: 원의 반지름. 여기에 변수의 크기를 넣으면, 변수 따라 달라진다.
color=: 원의 윤곽선 지정
fill: 원의 내부를 색상으로 채울지.
fill_color: fill=True일 때, 원의 내부를 어떤 색상으로 채울지.
popup=: 해당 원을 클릭하면 이게 뜨도록 만든다.
MarkerCluster() 객체는 지도 위에 표시된 여러 마커들을 클러스터링해서 관리하는 기능이다. 클러스터링된 마커란, 지리적으로 가깝게 위치한 여러 마커를 하나의 그룹으로 묶어서 표시한다.
- 매개변수
locations에 지정된 위도, 경도를 마커로 추가.
popup으로 각 마커에 팝업으로 표시될 텍스트로 이름들을 설정.
name은 이 클러스터 레이어의 이름.
overlay이 클러스터 레이어가 오버레이 레이어인지 나타냄. 즉, 기본 지도 레이어 위에 추가적으로 표시되는 레이어인지. True, False.
control: LayerControl 위젯으로 제어될 수 있는지. True면 LayerControl으로 클러스터 레이어 표시 여부 선택 가능.
folium.LayerControl(): 생성된 지도 객체에 레이어 컨트롤을 추가. 지도 상으 ㅣ다양한 레이어를 토글(켜고 끄기) 할 수 있게 하는 인터페이스. 아래 사진의 우측 상단.

Map.save('.html'): 생성된 folium 지도 객체를 html 파일로 저장. 현재 지도의 상태(추가된 모든 레이어와 설정 포함)을 외부 파일로 내보낼 수 있다.