[Module] googlemaps, folium, json

고보·2024년 2월 20일

0-1 googlemaps

#구글맵스 클라이언트 객체 생성
gmaps_key = '구글키'
gmaps = googlemaps.Client(key=gmaps_key)

#검색
tmp = gmaps.geocode('서울중부경찰서', language = 'ko')

#formatted_address값 
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', #PuRd, 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 파일로 저장. 현재 지도의 상태(추가된 모든 레이어와 설정 포함)을 외부 파일로 내보낼 수 있다.
profile
일본에서 일하는 게임 기획자. 시시해서 죽어버리지 않게, 재밌고 의미 있는 컨텐츠에 관심 있습니다. 그 도구로 데이터, AI도 찝적댑니다.

0개의 댓글