𝝅번째 알파카의 개발 낙서장

screen

OpenLayers를 여행하는 개발자를 위한 안내서 - 6. 공간정보의 DB화

projects

GIS

시리즈 톺아보기

OpenLayers를 여행하는 개발자를 위한 안내서

OpenLayers를 여행하는 개발자를 위한 안내서
count

공간정보 데이터 관리하기 🔗

데이터의 CRUD 소요가 있는 서비스는 DB를 사용한다. 서비스 운영에 필요한 데이터를 DB에 저장하고, 이를 적절히 관리, 조작함으로써 서비스의 기능을 제공한다.

GIS의 경우, 그 특성상 대용량 데이터를 자주 접하게 된다. 일례로, 전국의 건물 수는 몇백만을 우습게 상회하기 때문. 단순 row가 백만 단위인 것도 문제지만, 건물 정보의 특성 상 column의 갯수 또한 수십 개 정도다. 때문의 데이터의 용량이 매우 커진다.

때문에 공간정보 역시 DB에 저장하여 관리할 필요성이 생긴다. 하지만 문제는 공간정보는 DB에 저장하기 꽤나 까다롭다. 다른 데이터야 문자열이든 정수형이든 대충 삽입하면 되지만, 좌표값에서 문제가 발생한다. 점의 경우 로 비교적 간단하지만, 선과 면의 경우 좌표가 무수히 나올 수 있으므로 문제가 커진다.

그 뿐만 아니라, 별도로 언급하지 않은 복잡한 형태의 도형(도넛처럼 가운데가 빈 면 등)을 저장할때도 많은 문제가 생긴다. 때문에 적절한 툴을 활용하여 DB에 SHP를 삽입하는 것이 가장 효과적이다.



ogr2ogr로 MariaDB에 SHP 삽입하기 🔗

이 장에서는 DB에 SHP를 삽입하는 방법으로 ogr2ogr을 사용한다. 이 툴은 공간정보를 다루는 라이브러리로, QGIS를 설치하면 자동으로 같이 설치된다.

ogr2ogr만 따로 설치하는 것보다 QGIS 설치해서 딸려나오는 걸 사용하는 게 훨씬 편하므로, 여기선 이 방법을 통해 기술한다.

QGIS 3.16 기준으로 일반적인 설치 경로는 C:\Program Files\QGIS 3.16이다. 물론 버전에 따라 경로는 조금씩 차이가 발생할 수 있으니 참고만 할 것.

C:\Program Files\QGIS 3.16\bin에서 ogr2ogr을 찾을 수 있다. 해당 경로에서 cmd를 통해 ogr2ogr에 명령어를 날려 SHP를 삽입해보자.


BATCH

0ogr2ogr -f MySQL MySQL:{DB명}, host={DB 호스트}, user={DB 계정명}, password={DB 비밀번호} {SHP 경로} -nln {생성할 테이블 이름} -a_srs {SHP의 EPSG 코드} -lco engine=MYISAM

위 명령어를 입력하여 SHP를 MariaDB에 삽입할 수 있다. -nln 옵션을 지정하지 않을 경우, SHP의 이름을 그대로 따라간다.

삽입 시, SHP의 테이블 외에도 공간정보의 메타데이터를 관리하는 테이블이 2개 생성되며, 각각 아래와 같다.

  • geometry_columns: 각 레이어의 좌표 정보에 대한 메타데이터
  • spatial_ref_sys: 사용된 좌표계의 메타데이터

위 두 테이블은 개발자가 직접 사용할 일은 거의 없으니 그냥 이런 게 있다고 알고만 있으면 된다. 이 점을 모를 경우, 내가 의도한 테이블 외에 다른 테이블이 생김에 혼란을 일으킬 수 있기 때문.

🙋‍♂️ DB는 꼭 MariaDB가 아니여도 상관없어요!
이 문서에서는 MariaDB를 기준으로 설명했지만, 이건 어디까지나 내 서버에 MariaDB를 운용하고 있기 때문이지, 다른 이유가 있는 건 아니다.
GIS를 전문으로 취급하는 데이터베이스를 구축할 심산이라면, PostgreSQL이 훨씬 나은 선택지다. PostgreSQL은 GIS 관련 기능이 매우 강력하기 때문에, DB 자체적으로 많은 편의기능을 제공한다.
많은 GIS 툴에서 PostgreSQL과의 직접적인 Connection Pool을 기본으로 제공한다.


SHP 데이터를 입력하다보면, 잘못된 도형으로 인해 삽입이 되지 않는 현상을 종종 목격한다. 명령어 마지막에 --skipfailure 옵션을 붙여주면 오류가 난 행은 제외하고 삽입하니 참고할 것.

image

SHP를 MariaDB에 삽입한 예시. DBeaver로 데이터베이스를 확인하면 무려 OSM을 기반으로 데이터의 형태까지 보여준다. 하단의 메뉴에서 EPSG 코드를 설정할 수 있으니 참고할 것.