🖥️ IT, 컴퓨터/🐍 Python
[Python] 브이월드 API 이용해 지오코딩하기 ★★★★
김 홍시
2024. 5. 26. 01:34
반응형
0. 이전 지오코딩 글
이전 지오코딩 관련 글은 아래 참고.
내가 시도해본 여러 지오코딩 방법 중 가장 간편한 것 같아서 업로드해본다.
1. 브이월드 API 인증키 발급
https://www.vworld.kr/dev/v4dv_apikey_s001.do
위에 접속하여
인증키 발급 메뉴 들어와 동의 클릭
입력 후 인증키 받기 클릭
인증키 관리 메뉴에서 인증키복사
2. 지오코딩 API 코드 복사
https://www.vworld.kr/dev/v4dv_geocoderguide2_s001.do
에 들어와서
Python 부분 복사한다
아래는 참고용
3. 지오코딩 API 키 활용한 Python 코드 입력
1) 기본 Python 코드
import requests
apiurl = "https://api.vworld.kr/req/address?"
params = {
"service": "address",
"request": "getcoord",
"crs": "epsg:4326",
"address": "판교로 242",
"format": "json",
"type": "road",
"key": "[인증키]"
}
response = requests.get(apiurl, params=params)
if response.status_code == 200:
print(response.json())
- [인증키]를 지우고 자신의 인증키를 붙여넣는다."~~~" 의 형태가 되어야 함
- crs에는 좌표계를, address에는 도로명주소를 입력
그러면 아래와 같이 결과가 json 형태로 출력됨
2-1) 표로 정리하는 추가 Python 코드
import pandas as pd
data = response.json()
# Extracting data for table
service_info = data['response']['service']
input_info = data['response']['input']
refined_info = data['response']['refined']
refined_structure = refined_info['structure']
result_info = data['response']['result']
point_info = result_info['point']
# Creating DataFrame
df = pd.DataFrame([
['Service Name', service_info['name']],
['Service Version', service_info['version']],
['Operation', service_info['operation']],
['Time', service_info['time']],
['Status', data['response']['status']],
['Input Type', input_info['type']],
['Input Address', input_info['address']],
['Refined Text', refined_info['text']],
['Country', refined_structure['level0']],
['Province', refined_structure['level1']],
['City', refined_structure['level2']],
['District', refined_structure['level3']],
['Road Name', refined_structure['level4L']],
['Road Code', refined_structure['level4LC']],
['Neighborhood', refined_structure['level4A']],
['Neighborhood Code', refined_structure['level4AC']],
['Building Number', refined_structure['level5']],
['Detail', refined_structure['detail']],
['CRS', result_info['crs']],
['Longitude', point_info['x']],
['Latitude', point_info['y']]
], columns=['Key', 'Value'])
# Displaying DataFrame
print(df)
위의 코드를 이용하면 아래와 같이 보기 좋은 표가 나온다.
2-2) x/y좌표만 얻는 Python 코드
import pandas as pd
data = response.json()
# Extracting data for table
result_info = data['response']['result']
point_info = result_info['point']
# Creating DataFrame
df_xy = pd.DataFrame([
['Longitude', point_info['x']],
['Latitude', point_info['y']]
], columns=['Key', 'Value'])
# Displaying DataFrame
print(df_xy)
혹은 X/Y좌표만 얻고싶다면 위의 코드를 입력한다.
2-3) csv 표를 넣어서 X/Y 좌표 나오게 하는 Python 코드
수정해야 하는 부분 : 표_경로 / APIkey/'주소'의 열이름 확인
import requests
import pandas as pd
# Load the CSV file
file_path = "표_경로.csv"
data = pd.read_csv(file_path, encoding='utf-8')
# Function to get coordinates for a given address
def get_coordinates(address):
apiurl = "https://api.vworld.kr/req/address?"
params = {
"service": "address",
"request": "getcoord",
"crs": "epsg:4326",
"address": address,
"format": "json",
"type": "road",
"key": "APIkey"
}
response = requests.get(apiurl, params=params)
if response.status_code == 200:
data = response.json()
if data['response']['status'] == 'OK':
point_info = data['response']['result']['point']
return point_info['x'], point_info['y']
return None, None
# Apply the function to the '주소' column and store the results
data[['Longitude', 'Latitude']] = data['주소'].apply(lambda addr: pd.Series(get_coordinates(addr)))
# Display the updated dataframe
data.head()
# Save the updated dataframe to a new CSV file
data.to_csv('지오코딩_결과.csv', index=False, encoding='utf-8-sig')
import 요청 import pandas as pd # CSV 파일 로드 file_path = "표_경로.csv" data = pd.read_csv(file_path, 인코딩='utf-8') # 주어진 주소에 대한 좌표를 가져오는 함수 def get_coordinates(address) : apiurl = "https://api.vworld.kr/req/address?" params = { "service": "address", "request": "getcoord", "crs": "epsg:4326", "address": 주소, "format": "json", "type": "road" , "key": "APIkey" } response = request.get(apiurl, params=params) if response.status_code == 200: data = response.json() if data['response']['status'] == 'OK': point_info = data['response']['result']['point'] return point_info['x'], point_info['y'] return None, None # '주소' 열에 함수를 적용합니다. 그리고 결과를 저장합니다 data[['Longitude', 'Latitude']] = data['주소'].apply(lambda addr: pd.Series(get_coordinates(addr))) # 업데이트된 데이터프레임을 표시합니다 data.head() # 업데이트된 데이터프레임을 새 CSV 파일로 저장합니다. data.to_csv('지오코딩_결과.csv', index=False, 인코딩='utf-8-sig')
반응형