[Python] 도로명 주소를 위경도로 변환하기
프로젝트를 하는 과정에서 주소가 아닌 위도와 경도가 필요해졌습니다.
오늘은 도로명 주소를 위도와 경도로 변환하는 방법에 대해 글을 작성해보겠습니다.
[공간정보 오픈플랫폼 오픈API 신청]
저는 공간정보 오픈플랫폼의 API를 이용하여 주소를 위경도 데이터로 변환할 예정입니다.
첫 번째로, 공간정보 오픈플랫폼에 회원가입한 뒤 API를 신청하여야 합니다. 링크는 아래와 같습니다.
공간정보 오픈플랫폼 오픈API
오픈 API 누구나 사용할 수 있는 지도 오픈플랫폼의 오픈 API 서비스는 국가 공간정보의 개방, 공유, 참여를 통해 공간정보의 자율적이고 창조적인 다양한 애플리케이션을 개발할 수 있도록 기술
www.vworld.kr
API 인증키를 발급받은 후 [지도검색 API 레퍼런스] - [Geocoder API 2.0 레퍼런스]에서 자세한 API 사용 방법을 확인하실 수 있습니다.
주소를 좌표로 변환할 수도 있고 좌표를 주소로 변환할 수도 있습니다. 저는 주소를 좌표로 변환하는 방법에 대해 글을 작성할 예정입니다. 참고로 일일 최대 요청건수는 40,000건이라고 합니다.
[API 호출 예시]
페이지에 사용 예제가 자세히 적혀있었습니다. Python 사용 예제도 별도로 기재되어 있었는데요. 레퍼런스를 참고하여, 필요한 코드를 작성해보도록 하겠습니다.
이 부분을 조금만 수정해서, 코드를 완성해보았습니다.
import requests
import json
apiurl = "http://api.vworld.kr/req/address?"
params = {
"service": "address",
"request": "getcoord",
"address": "부산광역시 연제구 중앙대로 1001 부산광역시청",
"format": "json",
"type": "road",
"key": "인증키"
}
response = requests.get(apiurl, params=params)
if response.status_code == 200:
print(json.dumps(response.json(), indent=4, ensure_ascii=False))
다음과 같이 결과가 출력되었습니다. 여기서 제가 필요한 부분은 위도와 경도를 의미하는 X와 Y좌표가 포함된 Result 부분입니다.
[IN]
result = response.json()
print('x : ', result['response']['result']['point']['x'])
print('y : ', result['response']['result']['point']['y'])
[OUT]
x : 129.075092136
y : 35.179819016
이러한 방식으로 위도와 경도를 추출할 수 있습니다.
[코딩]
출력 예시를 확인했으니, 본격적으로 제게 필요한 코드를 작성해보겠습니다.
저는 부산시의 빵집 주소 데이터를 가지고 있으며, 이를 지도에 시각화하기 위해 위도와 경도가 필요합니다. 데이터프레임에 적용하기 위한 함수를 코딩해보도록 하겠습니다.
def get_coordinates(address, key):
apiurl = "http://api.vworld.kr/req/address?"
params = {
"service": "address",
"request": "getcoord",
"address": address,
"format": "json",
"type": "road",
"key": key
}
response = requests.get(apiurl, params=params).json()
if response['response']['status'] == 'OK':
point = response['response']['result']['point']
x, y = point['x'], point['y']
else:
x, y = None, None
return x, y
다음과 같이 코딩을 하였습니다. 앞선 예제와 다른 부분은 if절입니다. 주소가 검색이 되지 않는 경우 오류가 발생하여, 결측치를 반환할 수 있도록 코딩을 하였습니다. 데이터의 개수가 많지 않기 때문에 오류가 발생하는 경우 주소를 직접 수정하여 변환하기로 하였습니다.
제가 가지고 있는 데이터는 다음과 같은 구조를 가지고 있습니다. 주소를 위경도 데이터로 변환하고 데이터프레임에 위도와 경도를 각각 추가해보도록 하겠습니다.
coordinates = df['주소'].apply(lambda x : get_coordinates(x, "인증키"))
df['X'] = [i[0] for i in coordinates]
df['Y'] = [i[1] for i in coordinates]
다음과 같이 데이터프레임에 위경도가 추가되었습니다.
오늘은 파이썬으로 도로명주소를 위경도 데이터로 변환하는 방법을 알아보았습니다. 다음에는 이 데이터를 어떻게 활용했는지도 포스팅할 수 있었으면 좋겠습니다,,,
그럼 글은 여기서 마치도록 하겠습니다. 읽어주셔서 감사합니다 :)