[공간데이터분석] google map API를 이용하여 많은 주소의 위도, 경도 구하기

young·2022년 9월 24일
3

공간데이터분석

목록 보기
1/3
post-thumbnail

geocoding(지오코딩)이란?

geocoding은 주소를 위도, 경도의 좌표로 변환하여 코딩해주는 것을 의미한다.

  • 파이썬에서 지오코딩을 해주는 방법은 여러가지가 있지만 대표적으로 geopy 모듈의 Nominatim API가 유명하다.
  • Nominatim은 무료이지만 속도가 느리기 때문에, 대량의 주소를 좌표 변환하고 싶은 경우 Nominatim보다 구글 맵이나 다른 API를 이용할 것을 추천한다.

이 글은 대량의 주소 데이터 좌표 변환을 위해 google maps 모듈을 사용하여 지오코딩을 진행하였다.


구글맵을 이용한 대량의 주소 지오코딩 프로세스

  1. 구글맵 API 키 발급 및 키 확인
  2. 구글맵 라이브러리 설치 및 임포트
  3. 주소 데이터 임포트
  4. geocode 함수와 반복문을 사용하여 주소의 좌표 리스트 생성
  5. 중복값, 변환 실패한 데이터 찾기

*모든 코드는 멋진 팀원분이 짜주신 코드와 [pandas] 위도 경도 좌표 구하기를 참고하였다.

1. 구글맵 API 키 발급 및 키 확인

구글맵 지오코딩 API 키 발급

구글맵 API를 가져오기 위하여 가장 먼저 API 키 발급이 필요하다.
아래 링크를 참고하여 지오코딩 API 키를 발급하였다.
구글 지오코딩 API 키 발급 받는 방법

참고로 신용카드 등록이 필수이며, 90일의 무료 체험판 제공 뒤 유료로 전환된다 (매월 200달러의 크레딧 제공).

발급한 API 키 가져오기

  1. 메뉴 - API 및 서비스 - 사용자 인증 정보를 누른다.

  1. geocoding API로 제한한 API 키에서 키 표시를 눌러 API 키를 확인하고 복사한다.

2. 구글맵 라이브러리 설치 및 임포트

!pip install -U googlemaps

#구글맵 api 로드
import googlemaps
from datetime import datetime
my_key = "자신의_구글맵_API_키값" #구글맵 API 키값
maps = googlemaps.Client(key=my_key)  # 구글맵 api 가져오기

파이썬을 열어서 구글맵 라이브러리를 설치하고 geocoding API 키 값을 가져와 임포트한다.

3. 주소 데이터 임포트

import pandas as pd

df = pd.read_excel('data_name.xlsx')

# 이용 데이터에서 상세 주소가 분리되어 있어
# 시도, 시군구, 읍면동, 상세주소 컬럼을 합쳐서 주소 데이터 생성
df['주소'] = df['시도']+" "+df['시군구']+" "+df['읍면동']+" "+df['상세주소']
df

# 필요한 데이터만 추출
address=df['주소']
print(address.head())

주소 데이터 출력 예시

4. geocode 함수와 반복문을 사용하여 주소의 좌표 리스트 생성

import time #구동 시간을 측정하기 위하여 time 모듈 임포트


lat = []  #위도
lng = []  #경도

i=0

t1 = time.time() #지오코딩 코드 처리 전 시각

for address in df['주소']:   
    i = i + 1
    try:
        geo_location = maps.geocode(address)[0].get('geometry')
        lat.append(geo_location['location']['lat'])
        lng.append(geo_location['location']['lng'])
        
# 좌표를 가져오지 못한 경우 에러 출력
    except:
        lat.append('')
        lng.append('')
        print("%d번 인덱스 에러"%(i))


print(time.time() - t1) #지오코딩 총 구동 시간

except문 사용 이유

다른 방법으로 지오코딩을 시도했을 때, API 요청과 좌표 변환이 실패하여 위도, 경도가 0으로 저장된 경우가 2000건이 넘는 참사가 일어났다.
이를 방지하기 위하여 참고 블로그에서 사용한 except문을 이용하였다.

google map API의 처리 속도

분석에 이용한 데이터는 총 9551행의 데이터로, 타 지도 API를 이용한 경우 요청 제한에 걸리거나 오랜 시간을 소요했다.
그러나 구글맵은 타 API와 다르게 빠른 처리 속도를 보였다.

  • 9500개의 주소를 변환하는데 약 1240초, 즉 25분정도의 시간이 소요되었다.

# 변환한 위도, 경도를 데이터프레임으로 만들어 출력하기
df2=pd.DataFrame({'건물명':df['건물명'], '주소':df['주소'],'위도':lat,'경도':lng})

df2

# 변환한 데이터를 엑셀로 내보내기
df2.to_excel('구글_주소_위도_경도.xlsx')

지오코딩이 완료된 데이터 예시

5. 중복값, 변환 실패한 데이터 찾기

분석에서 사용한 데이터는 소규모가 아닌 9000건의 대량 데이터이므로, 변환이 실패했거나 주소를 잘못 변환했을 가능성이 존재한다.
완벽한 좌표 변환 리스트를 얻기 위해 중복값과 위도, 경도값을 얻지 못한 데이터가 있는지 확인하였다.

# 데이터 확인
df2.info()

# #위도에서 0값 존재 확인
df2[df2.위도==0]['주소']

#경도에서 0값 존재 확인
df2[df2.경도==0]['주소']

#위도, 경도에서 중복값 확인
sum((df2.duplicated(['위도'])==True) & (df2.duplicated(['경도'])==True))
#원 데이터 보존을 위해 데이터 프레임 생성
df3 = df2

# 위도, 경도가 모두 중복되는 값을 True로 표시하는 열 생성
df3['중복여부'] = (df2.duplicated(['위도'])==True) & (df2.duplicated(['경도'])==True)

# 위도와 경도가 모두 중복되는 값들만 출력 
df3.loc[(df3['중복여부']==True)]

위도, 경도가 중복된 값 출력 예시

  • 이 분석에서는 9551개의 데이터 중 요청에 실패하여 위도, 경도가 0으로 코딩된 데이터는 없었으며, 246개의 데이터가 중복값으로 출력되어 지오코딩된 데이터 확인이 필요했다.

데이터 확인 코드를 짜기 위해 참고한 참고 링크

data frame 조건에 맞는 값 불러오기 (불린 인덱싱)
불린 배열을 이용한 인덱싱
데이터프레임 중복 제거 : drop_duplicates

profile
한 걸음씩 쌓아가는 데이터 분석

0개의 댓글