본문 바로가기
파이썬/기타

파이썬 행정 구역 경계shp파일을 사용하여 리버스 지오코딩 하기

by 큰고양2 2023. 10. 23.

shp파일로 리버스 지오코딩을 하는 이유

주소를 알아내야 할 데이터 수가 적다면 사실 api를 활용하는 것이 좋다

하지만 api는 일일 10만건의 제한이 있고, 속도가 오래 걸린다는 단점이 있다

shp파일로 지오코딩을 하는 경우 필요한 단위 까지만 빠르게 확인 하고 데이터 수의 제한도 없기 때문에

데이터가 많은 경우 shp파일을 활용하는 것이 좋다

 

행정구역 경계 shp파일

http://data.nsdi.go.kr/dataset/20171206ds00001

 

(센서스경계)행정동경계 - 오픈마켓

모든 읍/면/동 경계에 대한 공간정보 및 속성정보

data.nsdi.go.kr

행정구역 경계 shp파일은 국가공간정보 포털에서 제공한다

만약 일부 지역 데이터만 필요하면 국가공간정보 포털을 사용하고 전체 데이터가 필요하면

http://www.gisdeveloper.co.kr/?p=2332

 

대한민국 최신 행정구역(SHP) 다운로드 – GIS Developer

 

www.gisdeveloper.co.kr

여기서 받아주면 된다

이 게시글에서는 하단 주소에서 읍면동 단위 파일을 사용할 예정이다

 

 

 

위경도 좌표를 지도 좌표로 변환하기

shp파일을 이용해서 리버스 지오코딩을 하려면 먼저 위경도 좌표를 해당하는 지도 좌표로 변경해야한다

이를 위해서는 먼저 지도의 좌표계를 알아야한다

shp파일과 같이 있는 .prj파일을 메모장으로 열면 확인이 가능하다

GRS80 UTM-K / EPSG:5179

ex

보고 이해하면 좋지만 사실 이 내용이 뭔지는 정확히 몰라도 된다

해당 파일은 prj 파일이 따로 있기 때문에 해당 파일을 다운 받아 shp 파일과 동일한 폴더에 shp 파일과 같은 이름으로 넣어주었다

 

import geopandas as gpd
import pyproj

#지도 파일 읽기
data = gpd.read_file('./행정단위/li.shp', encoding='CP949')


# 위경도 좌표
latitude, longitude = 36.367142461814105, 127.70616627315077

# Source 좌표 시스템 (WGS 84 위경도 좌표계) 정의
source = pyproj.Proj(init='epsg:4326')

# Target 좌표 시스템 ("PCS_ITRF2000_TM" 좌표계) 정의
target = pyproj.Proj(data.crs)

# 좌표 변환
transformed_x, transformed_y = pyproj.transform(source, target, longitude, latitude)

print(f"변환된 좌표 (X, Y): ({transformed_x}, {transformed_y})")

다음과 같은 코드를 사용해 손쉽게 위경도 좌표를 지도의 x,y좌표로 변환 할 수 있다

prj 파일을 통해 좌표계를 가져오기 때문에 shp파일이 있는 폴더에 꼭 같은 이름의 prj 파일이 있어야한다!!

 

좌표를 통해 위치 알아내기

from shapely.geometry import Point

# 변수 x, y에 검사할 좌표를 할당
x = 1018494.7795388248
y = 1818875.8801120466

# 입력 좌표를 Point 객체로 변환
point = Point(x, y)

# GeoPandas 데이터프레임에서 해당 좌표와 일치하는 행을 찾음
matching_rows = data[data['geometry'].contains(point)]

# 해당하는 행이 없을 경우 에러 처리
if matching_rows.empty:
    print("해당 좌표와 일치하는 위치를 찾을 수 없습니다.")
else:
    # LI_KOR_NM 정보를 추출
    li_kor_nm = matching_rows.iloc[0]['LI_KOR_NM']
    print(f"해당 좌표와 일치하는 위치: {li_kor_nm}")

다음 코드를 활용하면 손쉽게 shp 파일의 geometry에서 해당 좌표가 일치하는 곳을 찾아 해당 행의 정보를 불러올 수 있다

여기서 LI_KOR_NM은 리 정보가 들어있는 컬럼이다

실행하면 다음과 같은 결과가 나온다

주소를 제대로 확인하기 위해서는 시도,시군구,읍면동,리 단위의 shp파일들을 사용해

각각 shp 파일에서 좌표를 조회해야한다

물론 딱히 어렵지는 않기 때문에 위 코드를 적절히 활용한다면

10만건 이상의 많은 데이터를 처리할 때 유용하게 사용할 수 있을거라고 생각한다