본문 바로가기
Study/Python

[Python] 시각화 3. Geocoding

by p-jiho 2023. 12. 18.

마지막 시각화는 Geocoding이다.

일단 지오코딩을 사용하기 위해서는 경계도면 데이터가 있어야한다.

서울 법정동 데이터를 찾아서 사용하였다.

http://data.nsdi.go.kr/dataset/15145

 

행정구역_읍면동(법정동) - 오픈마켓

법정동(읍면동단위) 경계도면

data.nsdi.go.kr

위 링크에 들어가보면 서울 뿐만 아니라 다른 지역들의 경계도면 데이터가 들어있다.

zip 폴더를 다운로드해서 SHP 파일을 사용하였다.

 

import geopandas as gpd
# !pip install geopy
seoul_file = "LSMD_ADM_SECT_UMD_서울/LSMD_ADM_SECT_UMD_11_202309.shp"
seoul = gpd.read_file(seoul_file, encoding='euckr')
seoul = seoul.to_crs(epsg = 4326)

 

지오코딩 패키지를 불러오고, 경계도면 데이터를 받아오는 코드이다.

위 코드를 실행하면 데이터프레임으로 보기 좋게 데이터가 나온다.

 

import requests

station = ["강남역", "서울역", "고속터미널역"]
address = []
for i in station:
    url = "https://dapi.kakao.com/v2/local/search/keyword.json?query=" + i
    headers = {"Authorization" : "KakaoAK Kakao API Key"}
    places = requests.get(url, headers = headers).json()["documents"][0]
    address_name = places["address_name"]
    address.append(address_name)
location = gpd.tools.geocode(address, provider='googlev3', api_key="구글맵API Key")
location

 

저번 글과 같이 카카오API를 사용한다.

카카오 API 사용하는 방법은 저번 글 중 시각화 2. Folium 부분을 보면 나와있다.

Kakao API를 이용해 좌표를 얻기 위해 사용한 것은 아니고 정확한 주소를 얻기 위해 사용하였다.

좌표는 geopandas를 이용해 얻었다.

여기서 또 구글맵 API Key가 필요하다.

https://console.cloud.google.com/google/maps-apis/credentials?project=example-327009

 

Google 클라우드 플랫폼

로그인 Google 클라우드 플랫폼으로 이동

accounts.google.com

위 링크로 들어가서 좌측을 보면 API 및 서비스가 있다.

들어가보면 내가 사용할 수 있는 여러 서비스들이 있는데 검색창에 Geocoding을 검색한다.

검색결과 중 Geocoding API에 들어가서 API를 사용할 수 있도록 "사용설정"을 눌러주면 된다.

그리고 다시 좌측에서 "키 및 사용자 인증 정보"에 들어가면 Maps API Key가 있다.

오른쪽 키 표시를 눌러보면 API Key가 뜬다. 복사해서 코드 중 구글맵 API Key 부분에 넣어주면 된다.

 

이제 지도에 좌표를 찍어볼 것이다.

ax = seoul.plot(figsize=(10, 10), color="#E2E2E2", edgecolor="k")
location.plot(ax=ax, color='r')
ax.set_axis_off()

 

위 코드를 실행하면 좌표를 찍을 수 있다.

seoul.plot의 파라미터 중 color을 이용해 지도의 배경색을 지정할 수 있다.

그리고 location.plot 파라미터를 이용해 좌표를 찍는다. 좌표 또한 color을 이용해 색을 지정할 수 있다.

 

위 코드들을 전부 실행하면 나오는 결과물이다.

좌표를 찍는건 개인적으론 Folium이 나은 것 같다. 다만 지오코딩이 좀 더 깔끔하게 좌표를 볼 수 있다.

색 조합을 내 마음대로 했는데 색을 좀 더 잘 조합한다면 보기 좋은 지도를 그릴 수 있을 것 같다.

 

내가 지오코딩을 꼭 써야했던 이유는 저 좌표를 찍는 것이 아니라 지역에 따라 데이터를 좀 더 보기 좋게 나타내고 싶었기 때문이다.

Folium은 깔끔하게 나타내주는 것이 아니라 원형의 크기로 표현되어서 실제 지도에 표현한다는 점이 장점이지만 지역에 따른 데이터의 차이를 보기는 쉽지 않았다.

지오코딩은 지역에 따라 선으로 깔끔하게 나뉘어 데이터를 표현할 수 있다.

ax = seoul.plot(figsize=(10, 10), column = "s", edgecolor="k") # colormap = 'Blacks'
ax.set_axis_off()

 

seoul 데이터에 s라는 열을 추가해 값을 마음대로 넣어보자.

column은 나타내고 싶은 데이터를 말한다. 즉, s가 1, 2, 3 , ... 으로 되어있다면

어느 지역은 1만큼 색이 진하고 어느 지역은 2만큼 색이 진하게 되는 것이다.

 내가 실제 데이터를 가지고 시각화했던 것 중 하나이다.

색이 진한 곳은 상대적으로 값이 큰 지역, 색이 연한 곳은 상대적으로 값이 작은 지역이다.

위 코드를 실행하면 이런식으로 결과를 볼 수 있다.

colormap이라는 파라미터를 수정하여 색을 다르게 할 수도 있다.

seoul["s"] = list(range(len(seoul)))
ax = seoul.plot(figsize=(10, 10), colormap = "Blues", column = "s", edgecolor="k") # colormap = 'Blacks'
ax.set_axis_off()

 

파란색으로 설정하고 그림을 그려봤다.

이렇게 결과가 나온다. 빨간색으로 하고 싶으면 Reds로 설정할 수 있다.

여러가지 마음에 드는 색으로 설정이 가능하다.

 

지오코딩으로 표현할 수 있는 시각화 형식은 더 많다.

https://geopandas.org/en/stable/index.html

 

GeoPandas 0.dev+untagged — GeoPandas 0+untagged.50.g9a9f097.dirty documentation

GeoPandas 0.dev+untagged GeoPandas is an open source project to make working with geospatial data in python easier. GeoPandas extends the datatypes used by pandas to allow spatial operations on geometric types. Geometric operations are performed by shapely

geopandas.org

위 링크에 들어가면 글에서 보여준 코드 이외에 여러가지 코드를 사용할 수 있다.

이 글의 코드를 실행하며 간단한 코드 사용법을 익히고나서 위 링크의 여러 시각화 방법들을 사용하면 더 쉽게 그리고 다양하게 지도 시각화를 할 수 있을 것이다.

'Study > Python' 카테고리의 다른 글

[서울시 기온 예측 해커톤] Neuralprophet  (1) 2024.01.05
[Python] 시각화 2. Folium  (1) 2023.12.17
[Python] 시각화 1. Pyechart  (0) 2023.11.07
[Python] PyCharm에서 main.py  (1) 2023.10.22