-
[MySQL] ST_Distance_Sphere 함수Database/데이터베이스 2024. 11. 11. 02:41반응형
ST_Distance_Sphere 함수란?
MySQL의 ST_Distance_Sphere 함수는 두 지점 간의 대권 거리(Greate Circle Distance) 를 계산하는데 사용됩니다.
이 함수는 지구를 완벽한 구(sphere)로 간주하고 두 지점의 위도와 경도를 기반으로 두 지점 사이의 거리를 미터(meter) 단위로 반환합니다.함수 정의
ST_Distance_Sphere(point1, point2)
- point1: 첫번째 지점의 위치(Point 객체, 위도와 경도를 포함)
- point2: 두번째 지점의 위치(Point 객체)
- 반환 값: 두 지점 간의 거리 (미터 단위)
특징
- 구형 지구 모델: ST_Distance_Sphere는 지구를 구(sphere)로 가정하고 계산하기 때문에 지표면의 실제 곡률을 반영하지 않음.
- 높은 정확도가 요구되는 경우에는 적합하지 않을 수 있음
- 단위: 반환 값은 미터(meter) 단위
- 간단한 계산: 이 함수는 계산이 간단하며 대부분의 위치 기반 서비스에서 충분히 정확하게 사용이 가능
예제
- 두 지점 간의 거리 계산
SELECT ST_Distance_Sphere( POINT(127.036421, 37.511948), -- 서울 강남구의 위도와 경도 POINT(126.978388, 37.566610) -- 서울 중구의 위도와 경도 ) AS distance;
결과: 63744.04 (약 63.7km)
- 특정 반경 내의 지점 조회
아래 쿼리는 특정 위치에서 반경 10km 이내의 지점들을 조회하는 예시
SELECT id, name, latitude, longitude FROM locations WHERE ST_Distance_Sphere( POINT(longitude, latitude), POINT(126.978388, 37.566610) -- 기준 위치 (서울 중구) ) <= 10000; -- 10km 이내
이 쿼리를 서울 중구를 기준으로 반경 10km 내에 있는 모든 지점을 조회
장점
- 빠른 계산: 지구를 단순한 구형 모델로 가정하기 때문에 계산이 빠르고 간단
- 간단한 사용법: Point 객체만 입력하면 자동으로 거리 계산을 해준다.
단점
- 정확도 제한: 지구의 곡률과 고도 차이를 반영하지 않으므로 매우 정확한 거리가 필요한 경우에는 부정확할 수 있음
- 구형 모델: 지구가 완벽한 구형이 아니기 때문에 ST_Distance_Sphere는 극지방이나 장거리 거리 계산에서는 오차가 발생할 수 있음
대안
보다 정확한 거리 계산이 필요하다면
ST_Distance
함수를 사용할 수 있습니다. 이 함수는 지구의 타원체(Ellipsoid) 모델을 사용해 보다 정확한 계산을 제공합니다.SELECT ST_Distance( POINT(127.036421, 37.511948), POINT(126.978388m 37.566610) );
ST_Distance는 EPSG:4326(WGS84) 타원체 모델을 사용하여 더 높은 정확도의 거리를 게산합니다.
결론
ST_Distance_Sphere는 대부분의 위치 기반 서비스에서 거리 계산을 간단하게 수행할 수 있는 편리한 함수입니다.
하지만 정확한 거리 계산이 필요한 경우에는 ST_Distance 같은 대안을 고려할 수 있습니다.Point 객체를 만드는 방법
GeomUtil 클래스는 위치 정보를 나타내는 Point 객체를 생성하기 위한 유틸리티 클래스 입니다.
이 클래스는 JTS (Java Topology Suite) 라이브러리를 사용하여 지오메트리 객체를 생성합니다.public class GeomUtil { // GeometryFactory 객체 생성 (PrecisionModel.FLOATING 사용) private static final GeometryFactory gf = new GeometryFactory(new PrecisionModel(PrecisionModel.FLOATING), 4326); // 위도(latitude)와 경도(longitude)를 받아서 Point 객체 생성 public static Point createPoint(double lat, double lon) { return gf.createPoint(new Coordinate(lat, lon)); } }
GeometryFactory
- JTS 라이브러리에서 제공하는 지오메트리 객체를 생성하는 팩토리 클래스
- 다양한 지오메트리 객체(Point, LineString, Polygon 등)를 생성할 수 있음
PrecisionModel.FLOATING
- 지오메트리 모델의 정밀도 모델을 지정
- FLOATING은 부동 소수점 모델을 사용하여 더 높은 정밀도의 계산을 수행할 수 있음
4327
- SRID(Spatial Reference System Identifier)를 나타냄
- 4326은 WGS 84 좌표계(SRID: 4326)로 전 세계적으로 사용하는 표준 위도/경도 좌표계
예제
public static void main(String[] args) { Point point = GeomUtil.createPoint(37.5665, 126.9780); // 서울의 위도/경도 System.out.println(point); // 출력 예시: POINT (37.5665 126.978) }
- 이 예제는 위도(37.5665), 경도(126.9780) 값을 입력으로 받아 서울의 위치를 나타내는 Point 객체를 생성
- 생성된 Point 객체는 이후 거리 계산, 위치 비교 등의 공간 연산에 사용할 수 있음
반응형'Database > 데이터베이스' 카테고리의 다른 글
[MySQL] 옵티마이저 (0) 2024.12.16 [MySQL] 스토어드 프로시저(Stored Procedure) (0) 2024.08.28 [데이터베이스] RDBMS vs NoSQL (0) 2022.10.09 자주 사용하는 SQL Query 2 (0) 2018.12.01 자주 사용하는 SQL Query 1 (0) 2018.11.09