분석가 Step 1. 데이터 분석/Python

지오코딩(Geocoding), 역지오코딩(Geocoding-reverse) 편

뚱뿌 2023. 7. 7. 17:17
지오코딩(Geocoding)

원하는 주소를 x, y 좌표(위도, 경도)로 변환하자!

from geopy.geocoders import Nominatim

# Nominatim 객체 생성
geo_local = Nominatim(user_agent= 'South Korea', timeout=None)

# 위도/경도 반환 함수
def geocoding(address):
    try:
        geo = geo_local.geocode(address)
        x_y = [geo.latitude, geo.longitude]
        return x_y
    except:
        return [0, 0]

 

역지오코딩(Geocoding-reverse)

원하는 좌표를(x, y) 주소로 변환하자!

def geocoding_reverse(lat, lng):
    try:
        address = geo_local.reverse([lat, lng], exactly_one=True, language='ko')
        detail_address = address.address				# 상세주소
        zip_code = address.raw['address']['postcode']   # 우편번호
        x_y = [detail_address, zip_code]
        return x_y
    except:
        return [0, 0]

 

실제 주소정보가 포함된 데이터를 불러온 후 위도/경도로 변환하고,

상세주소와 우편번호까지 출력해보자!

 

공공데이터포털에서 제공하는 상가업소정보 2019년 데이터를 이용한다. 

해당 데이터에서는 도로명주소만 불러온다. 

import pandas as pd

df = pd.read_csv('data/상가업소정보_201912_01.csv', sep='|',
                usecols=['도로명주소'])
df_ex = df.head(10)
df_ex

불러온 도로명주소를 위도/경도 값으로 변환한 후

변환된 위도/경도 값을 이용하여 상세주소와 우편번호를 불러온다.

그리고, 데이터 프레임 형식으로 저장한 후 csv 파일 형식으로 데이터를 외부 파일로 저장한다!

result_df = pd.DataFrame(columns=['Address', 'Latitude', 'Longitude', 'detail_address', 'zip_code'])

for index, row in df_ex.iterrows():
    address = row['도로명주소']
    coordinates = geocoding(address) # 위도/경도 변환
    lat, lng = coordinates
    
    coordinates_reverse = geocoding_reverse(lat, lng)	# 상세주소/우편번호 변환
    detail_address, zip_code = coordinates_reverse
    
    result_df = pd.concat([result_df, pd.DataFrame({'Address': [address], 'Latitude': [lat], 'Longitude': [lng],
                                                   'detail_address': [detail_address], 'zip_code': [zip_code]})],
                          ignore_index=True)

print(result_df)

result_df.to_csv('geocoding_result.csv', index=False, encoding='euc-kr')

최종 결과