ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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) 단위
    • 간단한 계산: 이 함수는 계산이 간단하며 대부분의 위치 기반 서비스에서 충분히 정확하게 사용이 가능

    예제

    1. 두 지점 간의 거리 계산
    SELECT ST_Distance_Sphere(
        POINT(127.036421, 37.511948), -- 서울 강남구의 위도와 경도
        POINT(126.978388, 37.566610)  -- 서울 중구의 위도와 경도
    ) AS distance;

    결과: 63744.04 (약 63.7km)

    1. 특정 반경 내의 지점 조회
      아래 쿼리는 특정 위치에서 반경 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 객체는 이후 거리 계산, 위치 비교 등의 공간 연산에 사용할 수 있음
    반응형
Designed by Tistory.