팀 프로젝트 중 앱에서 페이징된 스크롤을 통해 앱 기준 위경도부터 가까운 순으로 동 이름을 표시해야했다. 위치는 WGS84 좌표로 필요했다. Geocoder, 데이터 포털 open API 등등 알아봤는데 적합한 방법을 찾지 못했다. 그래서 주소 DB를 구축하자는 결론이 섰다. 이것저것 구글링을 통해 알아본 결과 정부에서 운영하는 주소 사이트(https://www.juso.go.kr)가 있다는 걸 알게되었다. 이 사이트에서 제공하는 데이터를 토대로 주소 DB를 구성하면 좋겠다고 생각했다.
필자가 필요한 것은 법정동 이름과 위경도 위치이므로 정부에서 운영하는 주소 사이트에서 '위치정보요약DB'를 사용하기로 했다. 이 위치정보요약 DB는 " 위치기반 서비스 제공자들이 공간정보를 간편하게 구축ㆍ활용할 수 있도록 도로명주소와 주출입구의 좌표정보(X,Y좌표)를 결합한 주출입구 기반 요약DB를 제공합니다. " 라고한다. 실제 DB 내용을 보니 우리나라 시와 도명으로 분류되어 주출입구에 대한 정보들과 GRS80 UTM-K 기준 XY좌표를 제공하고 있었다. 이 DB 안에 있는 '시도명', '시군구명', '읍면동명'의 필드들을 합쳐서 주소 필드를 만들고, proj4 모듈을 사용해서 GRS80 UTM-K 좌표를 WGS84 좌표로 변환하여 위도, 경도 필드 만들면 좋을 것 같다고 생각했다. 해당 주출입구들의 동을 기준으로 위경도 평균을 구하면 각 동의 중점이 위경도로 구해지는 점을 이용해서 DB를 구축하고자 했다.
아래는 해당 작업의 순서다.
1. https://www.juso.go.kr/addrlink/addressBuildDevNew.do?menu=geodata 에서 전체자료를 다운받는다.
2. 해당 DB의 정보인 활동가이드를 다운받아 DB의 필드들을 확인하고 MySQL에 Schema 생성 후 import한다. 이 테이블은 임시로 사용할 것이다.
3. import한 데이터 중 XY좌표가 0으로 되어있는 값들도 있어서 DELETE 절로 일괄삭제 한다.
DELETE FROM [table_name] WHERE X좌표=0.000000 OR Y좌표=0.000000;
4. 그리고 2번에서 생성한 임시 테이블에서 가공 후 사용할 테이블을 만들어준다.
5. nodejs의 proj4, mysql2 모듈을 사용해서 3번을 통해 import한 값들을 가져온다. 그리고 '시도명', '시군구명', '읍면동명'의 필드들을 합쳐서 address 필드에, proj4 모듈을 사용해서 WGS84 좌표로 변환한 것을 latitude, longitude필드에 INSERT한다.
(*참고 : 세종특별자치시는 '시군구명'이 없다. 그래서 아래의 소스 중 19번째 concat함수를 concat(시도명, " ", 읍면동명) 이렇게 수정하고 사용해야한다.)
그러면 아래와 같이 로그를 통해 확인하면서 값이 변환되는 걸 확인할 수 있다.
정확도 테스트를 위해 Google 지도를 사용했다.
이 데이터에 대해서 Google 지도에 표시해보면 아래와 같다.
빨간 테두리는 강원도 강릉시 강동면으로 검색한 결과고, 빨간 마커는 위경도 37.707460 128.983182로 검색한 위치다. 두 캡처 사진을 포토샵으로 스케일 조정하며 겹치고 살짝 투명하게한 다음 빨간마커 부분을 클리핑 마스크로 뚫어주면 위와 같은 사진이 된다.
이렇게 우리나라 동 주소 DB를 만들고 나니 재밌는 것을 알았다.
위도 기준으로 오름차순 내림차순 정렬 했더니, 우리나라의 법정동 중, 중심 위경도 기준 가장 남쪽은 제주 서귀포시 법환동이고, 가장 북쪽은 강원도 고성군 현내면이었다.