[Postgresql] ST_Transform과 ST_SetSRID 함수 차이점
지금까지 자주 쓰기는 했는데 정리를 안해놔서 이번 기회에 정리해봄
ST_Transform과 ST_SetSRID란?
ST_Transform과 ST_SetSRID은 둘다 좌표계를 변경할 때 사용하는 PostGIS에서 제공해주는 내장함수이다.
그럼 왜 PostGIS에서 굳이 함수를 2개로 나눈걸까? 똑같은 기능을 제공하는데? 라고 생각할 수도 있는데
이 두녀석은 엄청 큰 차이점이 있다...
ST_Transform과 ST_SetSRID의 차이점
ST_SetSRID
이 함수는 어떤 방식으로든 기하학 좌표를 변환하지 않습니다. 단지 기하학이 있다고 가정되는 공간 참조 시스템을 정의하는 메타 데이터를 설정합니다. |
ST_Transform
좌표가 다른 공간 참조 시스템으로 변환된 새 도형을 반환합니다. 대상 공간 참조는 to_srid유효한 SRID 정수 매개변수로 식별될 수 있습니다. (즉, 테이블에 존재해야 함 spatial_ref_sys). to_proj또는 PROJ.4 문자열로 정의된 공간 참조를 및/또는 에 사용할 수 from_proj 있지만 이러한 방법은 최적화되지 않습니다. 대상 공간 참조 시스템이 SRID 대신 PROJ.4 문자열로 표현되는 경우 출력 기하학의 SRID는 0으로 설정됩니다. |
위와 같이 PostGIS 공식문서에서는 정의하고 있다.
저걸 풀어서 설명하면 아래와 같다.
ST_Transform은 SRID와 해당 SRID에 맞게 geometry의 좌표값 또한 변경해주는 반면
ST_SetSRID는 SRID값만 변경 해준다.
이것만 알면 이 둘의 차이점은 끝이다.
샘플
샘플 geojson
SELECT st_asewkt(st_geomfromgeojson('{"type":"Polygon","coordinates":[[[277160.5751035553,393517.815561494],[277351.45375585364,393517.815561494],[277351.45375585364,393708.69421379233],[277160.5751035553,393708.69421379233],[277160.5751035553,393517.815561494]]],"crs":{"type":"name","properties":{"name":"EPSG:5186"}}}'));
ST_Transform적용한 geojson (5186->5174)
SELECT st_asewkt(ST_TRANSFORM(st_geomfromgeojson('{"type":"Polygon","coordinates":[[[277160.5751035553,393517.815561494],[277351.45375585364,393517.815561494],[277351.45375585364,393708.69421379233],[277160.5751035553,393708.69421379233],[277160.5751035553,393517.815561494]]],"crs":{"type":"name","properties":{"name":"EPSG:5186"}}}'),5174)) as geom_info;
ST_SetSRID적용한 geojson (5186->5174)
SELECT st_asewkt(ST_SETSRID(st_geomfromgeojson('{"type":"Polygon","coordinates":[[[277160.5751035553,393517.815561494],[277351.45375585364,393517.815561494],[277351.45375585364,393708.69421379233],[277160.5751035553,393708.69421379233],[277160.5751035553,393517.815561494]]],"crs":{"type":"name","properties":{"name":"EPSG:5186"}}}'),5174)) as geom_info;
결과
샘플: SRID=5186;POLYGON((277160.575103555 393517.815561494,277351.453755854 393517.815561494,277351.453755854 393708.694213792,277160.575103555 393708.694213792,277160.575103555 393517.815561494))
ST_Transform적용: SRID=5174;POLYGON((277089.003463648 293210.211338443,277279.883331859 293210.208327433,277279.886343282 293401.088206235,277089.006474762 293401.09121748,277089.003463648 293210.211338443))
ST_SetSRID적용: SRID=5174;POLYGON((277160.575103555 393517.815561494,277351.453755854 393517.815561494,277351.453755854 393708.694213792,277160.575103555 393708.694213792,277160.575103555 393517.815561494))
결과를 보면 우선 ST_Transform과 ST_SetSRID의 결과값이 SRID가 5186에서 5174로 정상적으로 변경이 되었다.
하지만 샘플과 ST_SetSRID함수를 적용한 결과값은 한치의 오차도 없이 geom값이 똑같은 걸 볼 수 있다.
즉 ST_SetSRID함수는 기존 geometry값은 변경하지 않는다는 것을 알 수 있다.
하지만 ST_Transform함수를 적용한 geometry는 샘플과 값이 달라진 것을 확인할 수 있다.
즉 5186좌표계에서 5174좌표계에 맞도록 geometry값이 변경이 된다는 것을 알 수 있다.
결론
SRID값만 변경시에는 ST_SetSRID를, SRID값과 실제 도형값을 변경할때는 ST_Transform함수를 사용하도록 하자.