[산림 공간정보 실무] 임상도 데이터, Shapefile 대신 GeoPackage로 받아야 하는 이유

임상도 셰이프파일을 열었다가 속성 테이블 필드명이 반쪼가리로 잘려 있어 당황한 적이 있다면, 그건 QGIS 설정 문제가 아니다. Shapefile 자체의 구조적 한계 때문이다. 지난가을 현장 조사용으로 몇 개 시군 임상도를 한꺼번에 받아 병합하던 중에, 분명 다른 속성인데 필드명이 똑같이 보이는 레이어가 섞여 있어서 한참을 헤맨 적이 있다. 알고 보니 각각 원래 이름이 10자를 넘어가면서 앞부분만 남고 뒷부분이 잘려나간 탓이었다. 요즘도 산림공간정보를 다루는 현장에서는 여전히 shp 포맷이 기본값처럼 쓰이지만, 데이터량이 늘고 기관 간 공유가 잦아질수록 이 포맷의 한계가 발목을 잡는 경우를 자주 본다.

10자 필드명이 만드는 혼란

Shapefile의 속성 정보를 담는 DBF 파일은 필드명을 10자까지만 인식한다. 그보다 긴 이름을 쓰면 뒷부분이 잘려나가고, 비슷한 이름을 가진 필드 여러 개가 동일한 10자로 수렴해버리면 겹침이 생긴다. 예를 들어 식생 유형을 나타내는 속성을 길게 풀어쓴 이름으로 저장했다면, 저장 과정에서 앞 10자만 살아남고 나머지는 날아가 버리는 식이다. 여기에 더해 텍스트형 필드는 254자, 숫자형 필드는 20자리로 제한되고, 전체 필드 개수도 DBF 버전에 따라 128개에서 255개 사이로 묶인다. 속성 항목이 많은 산림 관련 데이터를 다루다 보면 이 한도에 생각보다 쉽게 걸린다.

파일이 여러 개로 쪼개지는 구조

게다가 Shapefile은 단일 파일이 아니다. shp, shx, dbf 세 개가 기본이고 좌표계 정보를 담은 prj, 인코딩을 알려주는 cpg까지 더해지면 보통 5~6개 파일이 세트로 묶여 다닌다. 메일로 보내거나 외장하드로 옮길 때 하나라도 빠지면 레이어가 깨지거나 속성 없이 도형만 뜨는 사고가 난다. 담당자가 바뀌고 몇 년 지난 데이터를 다시 꺼내 쓸 때 cpg 파일이 사라져 있는 경우도 적지 않다.

인코딩이 자꾸 깨지는 이유

dbf 파일은 내부적으로 자기 인코딩을 선언하지 않는다. 그래서 프로그램은 cpg 파일을 참고하거나, 그것도 없으면 내용을 보고 인코딩을 추측한다. 이 추측이 어긋나면 한글 속성값이 깨져서 알 수 없는 문자로 표시된다. 국내에서 오래된 공간데이터는 여전히 EUC-KR 계열로 저장된 경우가 섞여 있고, 최근 제작된 데이터는 UTF-8인 경우가 많다 보니, 서로 다른 시기에 만들어진 임상도 레이어를 한 프로젝트에 올리면 일부만 한글이 네모 칸으로 보이는 상황을 맞을 수 있다. QGIS에서 레이어 속성의 인코딩 옵션을 수동으로 바꿔가며 맞는 값을 찾아야 하는 경우가 실무에서는 흔하다.

GeoPackage로 넘어가면 달라지는 부분

GeoPackage는 OGC가 정한 개방형 표준이고, 내부적으로는 SQLite 컨테이너 하나에 벡터·속성·메타데이터를 전부 담는다. 파일 하나로 끝나기 때문에 공유할 때 빠뜨릴 파일이 없고, 필드명도 전체 길이를 그대로 쓸 수 있어 더 이상 앞부분만 남는 일이 없다. Shapefile이 컴포넌트 파일당 2GB 한도를 두는 것과 달리 GeoPackage는 실질적인 크기 제약이 거의 없고, 공간 인덱스도 R-tree 구조로 기본 내장되어 있어 넓은 지역 임상도처럼 폴리곤이 많은 레이어에서도 조회가 한결 가볍다. 서로 다른 지오메트리 타입이나 여러 레이어를 같은 파일 안에 함께 넣을 수 있다는 점도 임상도, 임도망, 조사구 포인트를 한 세트로 관리할 때 꽤 유용하다.

실제 전환 작업에서 챙겨야 할 것들

QGIS의 벡터 변환 기능이나 GDAL의 ogr2ogr 명령으로 변환 자체는 금방 끝난다. 다만 몇 가지는 변환 전에 미리 손봐야 나중에 고생을 덜 한다. 원본 좌표계가 prj 파일에 제대로 박혀 있는지부터 확인하고, 변환할 때 소스 인코딩을 자동 추정에 맡기지 말고 직접 지정하는 편이 안전하다. 추정이 틀리면 변환은 성공했는데 한글만 깨진 결과물을 받게 된다. 필드명이 겹쳐 보이는 레이어는 변환 전에 원래 전체 이름이 무엇이었는지 매핑표를 하나 만들어 두면, 나중에 속성 의미를 다시 추적할 때 큰 도움이 된다.

변환이 끝난 뒤에는 레이어 개수와 피처 수가 원본과 일치하는지, 속성 필드가 하나라도 빠지지 않았는지 꼭 다시 열어서 확인해야 한다. 간혹 지오메트리 유효성 검사를 거치면서 일부 폴리곤이 누락되는 경우가 있는데, 변환 직후 바로 확인하지 않으면 한참 뒤에야 그 사실을 알게 된다.

현장에서 쓰는 체크리스트

변환 작업을 할 때마다 아래 항목을 순서대로 짚어보면 실수를 줄일 수 있다.

  • 원본 shp의 prj 파일 유무와 좌표계(EPSG 코드)를 먼저 확인한다
  • 여러 기관에서 받은 레이어를 섞어 쓸 때는 인코딩을 레이어별로 따로 점검한다
  • 10자로 겹쳐 보이는 필드는 원래 이름 매핑표를 만들어 기록해 둔다
  • 변환 후 레이어 수, 피처 수, 필드 수를 원본과 대조한다
  • 타 부서나 외부 기관에 shp로 넘겨야 할 가능성이 있으면 원본도 따로 보관한다

당장 쓰던 포맷을 바꾸는 일이 번거롭게 느껴질 수는 있다. 하지만 임상도처럼 몇 년에 걸쳐 갱신되고 여러 사람 손을 거치는 데이터는, 파일 하나에 다 담기고 인코딩 문제에서 자유로운 형식으로 관리하는 쪽이 장기적으로는 손이 덜 간다. 다음에 임상도 데이터를 새로 받을 일이 있다면, 받는 쪽에서 미리 GeoPackage 포맷을 요청해보는 것도 방법이다.