데이터베이스/Postgresql

[Postgresql] ST_Transform과 ST_SetSRID 함수 차이점

모찌바라기 2023. 12. 22. 13:07
728x90
반응형

 

 

 

 

지금까지 자주 쓰기는 했는데 정리를 안해놔서 이번 기회에 정리해봄

 

 

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함수를 사용하도록 하자.

 

 

 

728x90
반응형