본문 바로가기

프로젝트/고민

전국 법정동 데이터 저장과 공간 데이터

글 쓰기에 앞서

최근 모두의 텃밭 프로젝트를 하던 중 공간 데이터를 마주치게 됐다.

 

프로젝트의 기능 중 많은 부분이 위치 정보를 기반으로 제공하는 기능이 많다.

예를 들어 현재 위치를 기반으로 주변 텃밭, 우리 동네의 작물 판매 정보, 커뮤니티 기능이 이에 해당하게 된다.

따라서 이를 위해서는 현재 위치가 어떤 동네에 포함되어 있는지 빠르게 검색할 수 있어야 하기 때문에 대한민국의 법정동 데이터를 db에 구축해 놓을 필요가 있었다.

 

공간 데이터 타입

dbms로 MySQL을 사용했기 때문에 MySQL에서 지원하는 공간 데이터 타입을 알아야 한다.

 

위와 같은 공간 데이터 중 우리 프로젝트에서는 법정동(예를 들어 서울 특별시 종로구 통인동과 같음)에 해당 주소의 중심 좌표(Point), Multipolygon 데이터를 저장해 놓는다.

 

Point란 위 그림에서 쉽게 알 수 있듯이 좌표 한 개의 값이다.

Multipolygon이란 여러 개의 point를 선분으로 이어 생성 된 사각형이 여러개 있는 데이터 구조이다.

 

쿼리에서는 링크 에 나와있는 함수를 이용해서 검색에 활용할 예정이다.

 

또한 R-Index를 적용할 예정인데, 이는 다음의 링크에 잘 나와 있으니 참고하면 좋을 것 같다.

 

데이터 구축

법정동 데이터 얻기

먼저 전국의 법정동 데이터를 다음의 링크에서 얻어온 뒤 변경된 부분만 새롭게 변경하도록 하자. 2023년 기준으로 변경된 부분은 아래와 같다.

강원도 -> 강원특별자치도,

경상북도 군위군 -> 대구 군위,

경기도 광주시 -> 7개의 동 추가

 

Multipolygon 데이터 얻기

 

그 다음 해당 법정동의 Multipolygon을 얻기 위해서 링크 를 통해 shp 파일을 다운로드 받는다.

 

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

 

www.gisdeveloper.co.kr

 

QGIS에서 불러오기

여기서 벡터 레이어 추가 한 뒤 아래의 사진과 같이 앞선 사이트에서 받은 shp 파일을 읽는다. 인코딩을 EUC-KR로 해야 한글이 깨지지 않는다.

 

 

레이어 좌표계 설정

 

나의 경우 최근에 5179 좌표계를 사용했지만 검색이 안된다면 아래 Projected 디렉토리 내에서 찾을 수 있을 것이다.

 

GeoJson 파일로 변환하기

 

 

오른쪽 지구본 모양의 버튼을 클릭하고 좌표계를 변경한다.

 

4166 좌표계를 선택한다.

 

이렇게 한 후 파일 이름을 작성하고 저장하면 대한민국 법정동의 geonjson 파일이 생성된다.

 

 

Java 코드를 통해 파싱하기

먼저 다음의 라이브러리를 추가한다.

 

repositories {
        maven { url "https://repo.osgeo.org/repository/release/" }
        mavenCentral()
    }
implementation 'org.geotools:gt-geojson:30.0'

 

데이터를 저장하기 전 필수적으로 SRID를 4326으로 설정해야 한다.

 

공간 데이터를 설명하며 빼놓을 수 없는 개념 중 하나인, SRID(Spatial Reference Identifier)는 데이터의 좌표계를 구분할 수 있는 식별 코드이다.
가장 흔하게 사용되는 값은 4326으로 위도(Latitude)와 경도(Longitude)를 사용하여 위치를 표현하는 WGS84 좌표계를 의미한다.

 

public class GeometryUtil {

    private GeometryUtil() {
        throw new RuntimeException("유틸클래스 생성자를 통해서 객체를 생성할 수 없습니다.");
    }

    private static final GeometryFactory factory = new GeometryFactory(new PrecisionModel(), 4326);

    public static Point createPoint(double latitude, double longitude) {
        return factory.createPoint(new Coordinate(longitude, latitude));
    }
 }

 

 

중심좌표는 위 코드를 통해 저장하고 Multipolygon 데이터는 앞서  읽어온 뒤 SRID를 4326으로 설정해줬다.

 

MultiPolygon multiPolygon = (MultiPolygon) feature.getDefaultGeometry();
multiPolygon.setSRID(4326);

 

전체 코드

 

R-Index, MBR, 사용 방법 등은 테코블에 너무 잘 나와 있어서 위 내용에는 포함하지 않았지만, R-Index를 사용하기 전 꼭 읽어보면 좋을 것 같다.