본문 바로가기

GIS/Coordinate

EPSG:4326, 3857, 5179... 숫자만 봐도 헷갈려서 정리해봤다

지도 관련 작업을 하다 보면 좌표를 정말 많이 보게 된다.

처음에는 좌표라고 하면 그냥 이런 값만 생각했다.

127.123456
37.123456
 

경도, 위도.

딱 봐도 익숙하다.

그런데 DB에서 공간정보를 조회하다 보면 갑자기 이런 숫자가 나온다.

953xxx
1952xxx
 

또 JavaScript에서 지도를 확인하다 보면 이런 값도 보인다.

1415xxxx
45xxxxx
 

처음에는 좀 헷갈렸다.

똑같은 위치를 나타내는 좌표인데 왜 숫자가 이렇게 다르지?

그러다 옆에 붙어 있는 걸 보면 또 이런 게 있다.

EPSG:4326
EPSG:3857
EPSG:5179
 

4326은 많이 본 것 같고, 3857도 지도에서 자주 봤는데 5179까지 나오니까 슬슬 헷갈리기 시작했다.

그래서 이번에 지도에서 자주 보게 되는 세 가지 좌표계를 한번 정리해봤다.


일단 EPSG가 뭔데?

사실 처음에는 EPSG:4326을 그냥 좌표계 이름이라고 생각했다.

크게 틀린 건 아니지만, 정확히는 좌표참조체계를 구분하기 위한 코드라고 보면 된다.

지도에서는 같은 위치라도 어떤 좌표계를 사용하느냐에 따라 표현되는 숫자가 달라진다.

예를 들어 우리가 흔히 보는 GPS 좌표는 이런 식이다.

경도: 129.xxxxxx
위도: 35.xxxxxx
 

그런데 지도 화면이나 공간 DB에서는 같은 위치를 다른 좌표계로 변환해서 사용할 수도 있다.

그러다 보니

이 좌표가 어디인지?

 

만큼이나

이 좌표가 어떤 좌표계인지?

 

를 아는 게 중요했다.

좌표 숫자만 덜렁 받아놓고 좌표계를 모르면 생각보다 난감하다.


EPSG:4326은 제일 익숙했다

EPSG:4326은 WGS84 경위도 좌표계다.

GPS나 OpenAPI 데이터를 받아볼 때 흔히 볼 수 있는 형태다.

경도(X): 129.0756
위도(Y): 35.1796
 

숫자만 봐도 대충 감이 온다.

우리나라라면 보통 경도가 120도대 후반~130도대 초반, 위도가 30도대라는 걸 알고 있으니

129.xxx
35.xxx
 

정도의 값이 보이면

아, 이건 경위도 좌표인가?

 

하고 먼저 생각해볼 수 있다.

단위도 m가 아니라 도(degree)다.

이 부분이 뒤에 나오는 3857이나 5179와 가장 눈에 띄는 차이였다.


그런데 지도에서는 3857을 정말 많이 봤다

웹 지도를 보다 보면 EPSG:3857도 정말 자주 나온다.

OpenLayers 같은 지도 라이브러리를 사용할 때 특히 많이 보게 된다.

4326 좌표가 이런 느낌이라면,

129.0756
35.1796
 

3857로 변환된 값은 숫자부터 확 달라진다.

대략 이런 식으로 큰 숫자가 나온다.

1436xxxx
418xxxx
 

처음 보면

이게 좌표가 맞나?

 

싶다.

그런데 정상이다.

4326은 경도와 위도를 도 단위로 표현하지만, 3857은 웹 지도에서 사용하기 편하도록 투영한 좌표계라 값의 형태가 완전히 달라진다.

그래서 OpenLayers 코드를 보다 보면 이런 것도 자주 만난다.

 
ol.proj.transform(
    [lon, lat],
    'EPSG:4326',
    'EPSG:3857'
);
 

예전에는 그냥

좌표 변환하는 코드구나.

 

하고 넘어갔는데, 이제 보면 의미가 좀 더 명확하다.

경도/위도 좌표
EPSG:4326

        ↓ 변환

웹 지도에서 사용하는 좌표
EPSG:3857
 

이런 흐름이다.


그래서 좌표는 맞는데 지도에서 이상한 곳에 찍힐 수도 있다

좌표계가 중요한 이유가 여기서 나온다.

예를 들어 데이터가

129.0756, 35.1796
 

처럼 4326인데 지도에서는 이 값을 3857이라고 생각하고 사용하면 어떻게 될까?

숫자 자체는 좌표처럼 생겼으니까 코드에서 바로 오류가 나는 것도 아니다.

그런데 실제 지도에 찍어보면 전혀 엉뚱한 곳으로 가거나 아예 화면에서 찾을 수 없게 된다.

이런 경우 좌표값만 계속 쳐다보고 있으면

경도랑 위도를 반대로 넣었나?

DB 값이 잘못됐나?

데이터가 이상한가?

 

하면서 다른 곳부터 찾게 된다.

물론 X/Y 순서가 뒤집힌 경우도 있어서 그것도 확인해야 하지만, 좌표계가 서로 맞는지도 같이 봐야 한다.


그러면 5179는 또 뭘까?

내가 제일 헷갈렸던 건 EPSG:5179였다.

DB 테이블을 보다 보면 geometry 컬럼이 이런 식으로 정의된 경우가 있다.

 
geometry(Geometry, 5179)
 

4326과 3857은 그래도 웹 지도에서 자주 봤는데, 처음에는 5179가 왜 DB에 들어가 있는지 잘 몰랐다.

EPSG:5179는 Korea 2000 / Unified CS로, 국내 공간정보에서 사용하는 투영좌표계 중 하나다.

좌표도 이런 형태로 나온다.

X: 9xxxxx
Y: 18xxxxx
 

4326처럼

129.xxx
35.xxx
 

가 나오는 게 아니다.

이쯤 되니까 숫자만 보고도 어느 정도 구분이 되기 시작했다.

129.xxx / 35.xxx
→ 4326일 가능성이 높음

천만 / 수백만 단위
→ 3857인지 확인

수십만~백만 단위
→ 국내 투영좌표계인지 확인
 

다만 이건 어디까지나 빠르게 의심해보는 정도다.

숫자 크기만 보고 좌표계를 확정하면 안 된다.

결국 데이터에 지정된 SRID나 메타정보를 확인하는 게 정확하다.


DB에서는 SRID를 같이 봐야 했다

PostGIS를 사용하면 geometry에 SRID가 들어간다.

예를 들어 테이블 정의가

 
ag_geom geometry(Geometry, 5179)
 

로 되어 있다면 이 geometry 컬럼은 5179 좌표계를 사용하도록 정의되어 있다는 뜻이다.

실제 데이터의 SRID가 궁금하면 이런 식으로 확인할 수도 있다.

 
SELECT ST_SRID(ag_geom)
FROM 테이블명
LIMIT 1;
 

결과가

5179
 

라면 해당 geometry에 설정된 SRID가 5179라는 걸 확인할 수 있다.

여기서 하나 더 중요한 게 있었다.

SRID를 지정하는 것과 실제 좌표를 변환하는 것은 다르다.

처음에는 이 부분도 조금 헷갈렸다.

예를 들어 PostGIS에는 ST_SetSRID()와 ST_Transform()이 있다.

이름만 보면 둘 다 좌표계와 관련 있어 보인다.

그런데 역할이 다르다.

 
ST_SetSRID(geom, 4326)
 

은 쉽게 말하면

이 좌표는 4326이야.

 

라고 좌표계 정보를 지정하는 쪽에 가깝다.

반면

 
ST_Transform(geom, 5179)
 

은 실제 좌표값을 다른 좌표계에 맞게 변환한다.

이 둘을 같은 것으로 생각하면 문제가 생길 수 있다.


예를 들어 4326 데이터를 5179로 바꾸려면

원본 geometry가 실제로 4326 좌표라면 이런 식으로 변환할 수 있다.

 
ST_Transform(
    ST_SetSRID(geom, 4326),
    5179
)
 

흐름으로 보면 이렇다.

현재 좌표가 4326이라는 것을 지정
        ↓
ST_SetSRID()

4326 좌표
        ↓
ST_Transform()

5179 좌표
 

물론 이미 SRID가 정상적으로 들어가 있는 geometry라면 매번 ST_SetSRID()를 할 필요는 없다.

 
ST_Transform(ag_geom, 5179)
 

처럼 변환하면 된다.

중요한 건 원본 좌표가 실제로 어떤 좌표계인지 알고 변환해야 한다는 것이다.

숫자는 5179 좌표인데 그냥 ST_SetSRID(geom, 4326)을 해버린다고 그 좌표가 4326으로 변환되는 건 아니다.

이건 그냥 잘못된 이름표를 붙이는 것에 가깝다.


결국 세 개를 이렇게 기억하기로 했다

처음에는 4326, 3857, 5179라는 숫자 자체를 외우려고 했다.

그렇게 하니까 계속 헷갈렸다.

지금은 그냥 어디에서 자주 만나는지를 기준으로 기억하고 있다.

EPSG내가 기억하는 방식
4326 경도·위도. API나 GPS 데이터에서 많이 봄
3857 웹 지도. OpenLayers 같은 지도 화면에서 자주 봄
5179 국내 공간정보. DB나 GIS 데이터에서 만날 수 있음

그리고 좌표값을 봤는데 위치가 이상하면 이제는 데이터부터 의심하지 않는다.

먼저

"이거 좌표계 뭐지?"

부터 확인한다.

지도 작업을 처음 할 때는 좌표 숫자 자체가 맞는지가 제일 중요하다고 생각했는데, 실제로 작업하다 보니 그 숫자가 어떤 기준으로 만들어진 좌표인지가 더 중요할 때가 많았다.

특히

127.xxx, 37.xxx
 

같은 좌표만 보다가

9xxxxx, 19xxxxx
 

같은 값을 처음 보면 전혀 다른 데이터처럼 느껴진다.

그런데 좌표계가 다를 뿐 같은 위치를 나타내고 있을 수도 있다.

요즘은 테이블에서 geometry(..., 5179) 같은 걸 봐도 예전처럼 그냥 지나치지는 않는다.

아, 이 좌표를 지도에 올릴 거면 지금 지도가 어떤 좌표계를 쓰는지도 같이 봐야겠구나.

정도는 먼저 생각하게 된 것 같다.