동료에게서 Shapefile을 받아 기본 지도에 겹쳐 보니 건물이 실제 위치에서 200미터 동쪽에 표시된다. .prj 파일에는 "GCS_WGS_1984"라고 되어 있지만 데이터는 실제로 GRS80 기반의 구 좌표계로 수집된 것이었다. 이런 불일치는 수 시간을 잡아먹고, 원인은 언제나 한 가지다: EPSG 코드 오류.
EPSG 코드는 좌표 참조 시스템(CRS)을 나타내는 숫자 약어다. EPSG:4326이라고 말하면 GIS 엔지니어라면 누구나 WGS 84를 의미한다는 걸 안다 — 모호함 없이, WKT 문자열을 파싱할 필요도 없이. 이를 올바르게 이해하는 것이 데이터 오정렬을 피하는 첫 번째 단계다.
EPSG 코드는 어디서 왔는가?
EPSG는 1985년에 설립된 유럽 석유 조사 그룹(European Petroleum Survey Group)의 약자다. 배경은 이렇다: 여러 석유 회사들이 같은 해역에서 해양 조사를 진행했지만, 각 회사가 서로 다른 좌표계를 사용했기 때문에 데이터를 합칠 수 없었다. Elf Aquitaine의 수석 측량사 Jean-Patrick Girbig가 Agip, BP, Deminex, Shell, Statoil, Total의 측지학자들을 모아 이 문제를 해결했다.
첫 번째 작업은 표준화된 CRS 데이터베이스를 만드는 것이었고, 1993년에 500개 이상의 정의를 담아 공개 배포되었다. 1995년, GeoTIFF v1.0 표준이 CRS 식별자로 EPSG 코드를 채택하면서 EPSG는 석유 산업을 벗어나 GIS 전반에 확산되었다.
2005년 EPSG 실무 그룹은 IOGP(국제 석유 가스 생산자 협회) 산하로 재편되었지만, EPSG 브랜드명은 그대로 남았다. 오늘날 EPSG 데이터셋(v12.053)에는 7,000개 이상의 CRS 정의, 2,500개의 투영 방법, 2,500개의 좌표 변환이 담겨 있다 — 총 20,000개 이상의 항목이다.
EPSG 코드란 정확히 무엇인가?
EPSG 코드는 4~5자리 숫자 식별자(범위 1024–32767)로, EPSG 데이터셋에서 CRS, 데이텀(datum), 타원체 또는 좌표 변환 방법을 고유하게 식별한다. 기술적 기반은 ISO 19111 표준이다.
표준 표기법
가장 일반적인 형식은 authority:code다:
EPSG:4326
OGC는 웹 서비스에서 자주 사용되는 URL 형식도 정의한다:
http://www.opengis.net/def/crs/EPSG/0/4326
EPSG 정의 안에 무엇이 있는가?
각 코드는 완전한 CRS 정의에 대응한다: 타원체 매개변수(장반경, 편평률), 데이텀, 좌표축 방향 및 순서, 측정 단위(도 또는 미터), 적용 지리 범위.
가장 흔한 함정은 축 순서다. EPSG:4326의 표준 정의는 위도가 먼저(lat, lng)이지만, 대부분의 GIS 소프트웨어는 실제로 경도를 먼저 전달한다(lng, lat). GeoJSON은 lng, lat를 사용하고, Leaflet의 L.latLng()는 lat, lng를 기대한다 — 혼동했을 때의 버그는 좌표가 명백히 뒤바뀐 것처럼 보이지 않고, 지도 위에 점들이 무작위로 흩어진 것처럼 나타난다.
가장 많이 사용되는 EPSG 코드
| EPSG 코드 | 이름 | 유형 | 단위 | 일반적인 용도 |
|---|---|---|---|---|
| 4326 | WGS 84 | 지리 | 도 | GPS, 글로벌 데이터 교환 |
| 3857 | Web Mercator | 투영 | 미터 | 웹 지도 (Google Maps, OSM) |
| 4737 | Korea 2000 (KGD2002) | 지리 | 도 | 한국 국가 표준 |
| 5179 | Korea 2000 / Unified CS | 투영 | 미터 | 한국 UTM-K (통합 투영) |
| 5174 | Korean 1985 / Modified Central Belt | 투영 | 미터 | 구 TM 중부 원점 (레거시) |
| 4269 | NAD83 | 지리 | 도 | 미국, 캐나다 |
| 32601–32660 | UTM 북반구 각 구역 | 투영 | 미터 | 국지 고정밀 측량 |
| 32701–32760 | UTM 남반구 각 구역 | 투영 | 미터 | 국지 고정밀 측량 |
EPSG:4326 vs EPSG:3857 — 모두가 혼동하는 두 코드
EPSG:4326 (WGS 84)는 위도/경도 도수로 위치를 나타내는 지리 CRS다. GPS 원시 출력값이 WGS 84다. 데이터 저장 및 교환의 표준이다.
EPSG:3857 (Web Mercator)는 지구를 미터 단위의 평면에 투영하는 투영 CRS다. Google Maps가 2005년 출시 때 이 투영법을 채택했고, 사실상 모든 웹 지도가 뒤를 따랐다.
EPSG는 처음에 3857 등록을 거부했다. 반론은 이것이었다: 타원체 데이텀에 구면 공식을 적용하는 것은 수학적으로 부정확하다. Google은 그래도 출시했고, 2009년 EPSG가 결국 코드를 등록했을 때 지구의 모든 웹 지도가 이미 이것을 사용하고 있었다. 널리 사용되고 있지만, 3857은 정확한 면적이나 거리 측정에는 적합하지 않다 — 표준 메르카토르와 비교해 약 0.33%의 축척 오차가 있다.
기본 규칙: 저장에는 4326, 표시에는 3857. KunYu의 좌표 변환기가 두 시스템 간 변환을 지원한다.
올바른 EPSG 코드 찾기
시나리오 1: CRS 이름을 알고 있는 경우
이름을 알고 있다면(예: "WGS 84" 또는 "Korea 2000"), EPSG 검색 도구에서 직접 검색한다. 코드, 이름, 지역으로 8,000개 이상의 EPSG 정의를 검색할 수 있다.
시나리오 2: 위치는 알지만 CRS를 모르는 경우
특정 지역에 적합한 투영 CRS가 필요할 때는 EPSG Finder 도구를 사용한다 — 지도에서 클릭하거나 범위를 그리면, 해당 지역을 적용 범위로 포함하는 모든 EPSG 코드가 나열된다.
시나리오 3: CRS 정보 없이 데이터를 받은 경우
데이터와 함께 제공된 메타데이터 파일을 확인한다. Shapefile에는 WKT 형식의 CRS 정의가 담긴 .prj 파일이 있다(텍스트 편집기로 열 수 있다). GeoTIFF는 보통 메타데이터에 EPSG 정보를 내장한다. GDAL 사용 시:
# GeoTIFF의 CRS 확인
gdalsrsinfo input.tif
# Shapefile의 .prj 파일 읽기
cat data.prj
GIS 소프트웨어에서 EPSG 코드 사용하기
QGIS: 프로젝트 속성 → CRS 패널에서 EPSG 코드로 CRS를 검색하고 전환할 수 있다. QGIS 기본값은 EPSG:4326이다.
GDAL/OGR: EPSG 코드로 대상 CRS를 직접 지정:
# Shapefile을 Korea 2000에서 WGS 84로 재투영
ogr2ogr -s_srs EPSG:4737 -t_srs EPSG:4326 output.shp input.shp
PROJ: 오픈 소스 좌표 변환 엔진. 데이터베이스(proj.db)에 EPSG, IGNF, ESRI CRS 정의가 통합되어 있다.
코드에서도 EPSG 코드는 동일하게 작동한다:
// Proj4js (JavaScript)
import proj4 from "proj4";
proj4.defs("EPSG:4490", "+proj=longlat +ellps=GRS80 +no_defs");
const result = proj4("EPSG:4326", "EPSG:4490", [116.4074, 39.9042]);
# pyproj (Python)
from pyproj import Transformer
transformer = Transformer.from_crs("EPSG:4326", "EPSG:3857", always_xy=True)
x, y = transformer.transform(126.9780, 37.5665)
자주 묻는 질문
EPSG:4326과 CRS:84의 차이는?
둘 다 WGS 84이지만 축 순서가 다르다. EPSG:4326의 표준 정의는 위도가 먼저(lat, lng)이고, CRS:84는 경도가 먼저(lng, lat)다. GeoJSON은 lng, lat를 사용하지만, Leaflet의 L.latLng()는 lat, lng를 기대한다 — 이를 혼동하는 것은 흔한 버그다.
데이터가 수십~수백 미터 어긋나는 이유는?
가장 일반적인 원인은 잘못된 EPSG 코드다. 한국에서는 구 TM 좌표계(예: EPSG:5174)와 Korea 2000 / UTM-K(EPSG:5179)를 혼동하면 수십 미터의 차이가 발생할 수 있다. WGS 84와 로컬 데이텀을 혼용하면 더 큰 편차가 생긴다.
EPSG 코드는 만료되는가?
업데이트되지만 삭제되거나 재할당되지는 않는다. IOGP 측지 소위원회가 EPSG 데이터셋을 주기적으로 업데이트한다. 폐기된 코드는 deprecated로 표시되고 대체 코드를 가리킨다.
한국의 EPSG 코드는 무엇을 써야 하나?
한국의 공식 측지 기준계는 Korea 2000 (KGD2002)(EPSG:4737, 지리)이다. 투영 좌표계로는 UTM-K(통합 좌표계, EPSG:5179)가 많이 쓰인다. 구 TM 좌표계(예: 중부원점 EPSG:5174)는 이전 데이터에 여전히 존재하며, 최신 데이터와 겹쳐 보면 수십 미터 차이가 날 수 있다. 국토지리정보원(NGII) 공식 데이터는 KGD2002 기준으로 제공된다.
90%의 경우를 커버하는 규칙
저장과 교환에는 4326, 웹 표시에는 3857. 헷갈릴 때는 EPSG Search로 이름 검색, EPSG Finder로 지도 위치 검색을 활용한다.