[Python][위치데이터] 주소↔위도 경도 간 변환(1) 카카오 openAPI를 통해 좌표를 주소로 변환하기
데이터 수집에 주로 활용하는 위치데이터는 크게
1. 일상적으로 사용하는 주소, 우편번호, 도로명주소 등 특정 장소나 지역을 지칭하는 분류데이터
2. WGS84 경위도, GRS80등 좌표계 데이터
두가지로 나눌 수 있는 듯 합니다.
데이터 수집을 하다보면 위치데이터를 활용하는 경우가 많은데 위치데이터의 앞서 언급한 두종류의 위치데이터 중
하나의 정보가 미제공 되거나 수집이 어려운 경우가 종종 있습니다.
이번에는 이러한 경우 각 파이썬을 활용해서 위치데이터를 변환할 때 사용했던 방법을 작성하려고 합니다.
import requests
import json
import pandas as pd
from tqdm import tqdm
# 카카오 URL접속을 위한 변수설정
url = "https://dapi.kakao.com/v2/local/geo/coord2regioncode.json?x=위도값&y=경도값" # 좌표 입력 확인
headers = {"Authorization": "개인코드 입력"} # KakaoAK 부분 개인 코드 발급 후 사용(https://developers.kakao.com/)
# JSON 표현식 불러오기
api_test = requests.get(url,headers=headers)
url_text = json.loads(api_test.text)
url_text
좌표정보를 통해 url_text를 불러오게 되면 이미지와 같이 해당 위치에 대한 시설물에 대한 정보들이 보여집니다.
저 같은 경우 좌표를 기반으로한 행정동과 법정동에 대한 정보가 필요하기 때문에 해당 텍스트만 추출하도록 하겠습니다.
[in]
print(url_text["documents"][1]["address_name"]) # 행정동
print(url_text["documents"][0]["address_name"]) # 법정동
[out]
서울특별시 강서구 화곡6동
서울특별시 강서구 화곡동
두개의 documents가 각각 행정동과 법정동 정보를 포함하고 있으며 adress_name을 확인했습니다.
방법을 알았으니 실제 데이터를 통해 사용하겠습니다.
서울 열린데이터 광장(https://data.seoul.go.kr/)에서 제공하는 서울시버스정류소좌표데이터를 사용하겠습니다.
위의 자료중 서울시버스정류소 좌표데이터를 받게 되면
CSV파일 형태로 아래 그림과 같이 정류소명, ARS-ID 각 X좌표와 Y좌표가 있습니다.
bus = pd.read_excel("C:\\Users\\insoo\\Downloads\\서울시버스정류소좌표데이터.xlsx")
저는 xlsx파일로 변경한 후 불러왔습니다.
a = []
# for문으로 리스트 돌리기
for z in tqdm(range(len(bus))):
bus_H = "https://dapi.kakao.com/v2/local/geo/coord2regioncode.json?x={0}&y={1}".format(bus["X좌표"][z], bus["Y좌표"][z]) # XY값 입력
headers = {"Authorization": "개인코드"} # 카카오 openAPI 코드 입력
api_test = requests.get(bus_H,headers=headers)
url_text = json.loads(api_test.text) # Json 파일 내에 정보 확인
a.append([bus["ARS-ID"][z],
url_text["documents"][1]["address_name"]])
좌표를 주소로 변환하여 담을 비어있는 리스트를 만든 후 for문을 통해 내용을 수집했습니다.
추후 원본데이터와 결합을 편하게 하기 위해 리스트에 각 버스의 ARS-ID도 함께 추가했습니다.
# 리스트 데이터 프레임으로 만들어서 merge함수 사용
a = pd.DataFrame(a)
a.columns = ["ARS-ID", "행정동"]
수집된 주소를 데이터프레임으로 변경 후 기존의 자료와 합쳤습니다.
이를 통해 folium이나 위치데이터를 사용하는 툴을 통해 활용할 수 있습니다.
전체 코드 내용
import requests
import json
import pandas as pd
from tqdm import tqdm
# XY좌표 있는 데이터 로드
bus = pd.read_excel("C:\\Users\\insoo\\Downloads\\서울시버스정류소좌표데이터.xlsx")
# 빈 리스트 생성 후 for문으로 리스트 돌리기
a = []
for z in tqdm(range(len(bus))):
bus_H = "https://dapi.kakao.com/v2/local/geo/coord2regioncode.json?x={0}&y={1}".format(bus["X좌표"][z], bus["Y좌표"][z]) # XY값 입력
headers = {"Authorization": "개인코드 입력"} # 카카오 openAPI 코드 입력
api_test = requests.get(bus_H,headers=headers)
url_text = json.loads(api_test.text) # Json 파일 내에 정보 확인
a.append([bus["ARS-ID"][z],
url_text["documents"][1]["address_name"]])
# 리스트 데이터 프레임으로 만들어서 merge함수 사용
a = pd.DataFrame(a)
a.columns = ["ARS-ID", "행정동"]
bus_hang = bus.merge(a, on="ARS-ID", how="outer")
bus_hang # 결과물 확인
다음에는 주소지를 통해 위도경도를 확인하는 방법과
GRS80값을 WGS84로 변경하는 방법을 알아보겠습니다.