좌표계만 바꾸면 되는 줄 알았다... ST_SetSRID와 ST_Transform은 완전히 달랐다
PostgreSQL에서 공간 데이터를 다루다 보면 이런 쿼리를 자주 보게 된다.
ST_SetSRID(geom, 5179)
그리고 이런 것도 있다.
ST_Transform(geom, 5179)
둘 다 뒤에 EPSG 코드가 들어가다 보니 처음 봤을 때는 비슷한 기능이라고 생각했다.
특히 좌표계를 바꿔야 하는 상황에서 이름만 보면 SetSRID도 좌표계를 설정하는 함수니까 이걸 사용하면 되는 것처럼 보였다.
그런데 둘은 하는 일이 완전히 달랐다.
ST_SetSRID는 좌표값을 바꾸지 않는다
먼저 ST_SetSRID부터 보면 이름 그대로 geometry에 SRID를 설정하는 함수다.
예를 들어 좌표가 이렇게 있다고 해보자.
126.97, 37.56
여기에
ST_SetSRID(geom, 4326)
을 실행한다고 해서 좌표가 다른 숫자로 변환되는 건 아니다.
좌표값은 그대로 두고,
이 geometry는 EPSG:4326 좌표계입니다.
라는 정보를 지정하는 것이다.
처음에는 이 부분이 조금 헷갈렸다.
SRID를 설정한다 = 좌표계를 변환한다
라고 생각하기 쉬웠는데 실제로는 그렇지 않았다.

실제 좌표를 변환하는 건 ST_Transform
반대로 ST_Transform은 좌표값 자체를 다른 좌표계에 맞게 변환한다.
예를 들어 EPSG:4326 좌표를 국내에서 사용하는 EPSG:5179로 바꾸려면 이런 식이다.
SELECT ST_Transform(geom, 5179)
FROM tb_sample;
단, 여기에는 전제가 있다.
PostGIS가 현재 geometry가 어떤 좌표계인지 알고 있어야 한다.
예를 들어 geometry의 SRID가 이미 4326으로 설정되어 있다면:
EPSG:4326
126.xxx, 37.xxx
↓
ST_Transform
↓
EPSG:5179
9xxxxx, 19xxxxx
처럼 실제 좌표값이 변한다.
이게 ST_SetSRID와 가장 큰 차이였다.
ST_SetSRID
→ 좌표값 그대로
→ 이 데이터가 어떤 좌표계인지 지정
ST_Transform
→ 좌표값 변경
→ 다른 좌표계로 실제 변환
이렇게 놓고 보니까 훨씬 이해하기 쉬웠다.

그러면 ST_SetSRID는 언제 사용할까?
예를 들어 geometry에 좌표값은 들어 있는데 SRID가 지정되지 않은 경우가 있다.
확인해보니:
SELECT ST_SRID(geom)
FROM tb_sample
LIMIT 1;
결과가 0으로 나온다고 해보자.
그런데 원본 데이터의 좌표계가 EPSG:4326이라는 걸 확실하게 알고 있다면 이때는
ST_SetSRID(geom, 4326)
으로 좌표계 정보를 지정할 수 있다.
그리고 5179로 변환해야 한다면 그다음에 ST_Transform을 사용한다.
ST_Transform(
ST_SetSRID(geom, 4326),
5179
)
처음 보면 함수가 두 개나 들어가서 복잡해 보이는데 의미를 알고 보면 단순하다.
ST_SetSRID
"이 좌표는 4326이야"
↓
ST_Transform
"그럼 5179 좌표로 변환해줘"
이 순서다.
이미 SRID가 있는데 SetSRID로 덮어쓰면?
이 부분이 오히려 중요했다.
4326 좌표를 5179로 바꾸고 싶다고 해서
ST_SetSRID(geom, 5179)
를 실행하면 안 된다.
이렇게 한다고 4326 좌표가 5179 좌표로 변환되는 게 아니다.
예를 들어 기존 좌표가
126.97, 37.56
이라면 숫자는 그대로인데 PostGIS에게
이 숫자는 EPSG:5179 좌표야.
라고 알려주는 셈이다.
당연히 실제 위치를 해석할 때 문제가 생길 수 있다.
그래서 좌표계 관련 작업을 하기 전에는 먼저 SRID부터 확인하는 습관을 들이는 게 좋았다.
SELECT ST_SRID(geom)
FROM tb_sample
LIMIT 1;

이제는 이렇게 구분하면 될 것 같다
처음에는 SetSRID, Transform 둘 다 EPSG 코드가 들어가니까 비슷한 함수인 줄 알았다.
그런데 실제로는 역할이 명확하게 다르다.
ST_SetSRID는 좌표계 정보를 지정하고, ST_Transform은 좌표값을 실제로 변환한다.
그래서 앞으로 좌표가 이상하게 나올 때 무작정 변환부터 하기보다는
SELECT ST_SRID(geom)
FROM tb_sample
LIMIT 1;
부터 확인해봐야겠다.
지난번에 EPSG 코드를 정리하면서도 느꼈지만 공간정보는 좌표 숫자만 보는 것보다 그 숫자가 어떤 좌표계를 기준으로 만들어졌는지를 확인하는 게 먼저인 것 같다.