DB

[MySQL] (GIS5️⃣) ST_Distance로 거리 계산하는 방법과 주의사항

인생아 2025. 7. 18. 16:54
반응형

MySQL의 GIS 함수 중 ST_Distance()는 두 지리 좌표 간의 직선 거리를 계산할 수 있게 해준다.
하지만 예상과 달리 단위나 계산 방식이 실무와 다를 수 있어 주의가 필요하다.

📐 ST_Distance()란?

ST_Distance(A, B)는 두 지오메트리 객체 간의 거리(길이)를 계산한다.

예:

SELECT ST_Distance(
  ST_GeomFromText('POINT(126.9784 37.5665)', 4326),
  ST_GeomFromText('POINT(126.9820 37.5700)', 4326)
);

위 쿼리는 경도 126.9784, 위도 37.5665와
경도 126.9820, 위도 37.5700 사이의 거리를 계산한다.

반응형

📏 결과 단위 주의 (미터 아님)

많은 개발자들이 실수하는 부분이 바로 단위이다.
SRID = 4326인 경우, 결과는 미터 단위가 아니라 각도(도 단위) 로 계산된다.

예:

-- 위 결과는 약 0.0045도
-- 이를 미터로 환산하려면 후처리 필요

경도/위도를 실제 거리로 변환하려면 haversine formula를 직접 구현하거나
MySQL 8.0.22 이상에서 지원하는 ST_Distance_Sphere()를 사용하는 것이 좋다.

🌍 ST_Distance_Sphere() 사용 예

SELECT ST_Distance_Sphere(
  ST_GeomFromText('POINT(126.9784 37.5665)', 4326),
  ST_GeomFromText('POINT(126.9820 37.5700)', 4326)
);

✅ 위 쿼리는 미터 단위로 두 점 간 거리 반환
✅ 실제 지도 반경 검색, 거리 필터링 등 실무용 쿼리에 적합

결과 예시:

약 482.8 (단위: 미터)

🧪 실습 예제: 매장 간 거리 계산

매장 테이블

CREATE TABLE stores (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(100),
  location POINT NOT NULL,
  SPATIAL INDEX(location)
);
INSERT INTO stores (name, location) VALUES
('지점A', ST_GeomFromText('POINT(126.9784 37.5665)', 4326)),
('지점B', ST_GeomFromText('POINT(126.9820 37.5700)', 4326));
반응형

거리 비교 쿼리

SELECT 
  s1.name AS store1,
  s2.name AS store2,
  ST_Distance_Sphere(s1.location, s2.location) AS distance_m
FROM stores s1, stores s2
WHERE s1.id < s2.id;

✅ 지점 간 거리(m) 결과를 확인할 수 있다
✅ WHERE s1.id < s2.id는 중복 계산 제거용

❗ 실무 주의사항 요약

  • ST_Distance()는 도 단위 거리 → 실무에 부적절할 수 있음
  • ST_Distance_Sphere()는 지구 곡률 반영된 미터 단위 결과 제공
  • MySQL 8.0.22 이상에서만 사용 가능
  • 대량 좌표 계산 시 성능 이슈 발생 가능 (필요 시 전처리 또는 캐싱 고려)

✅ 정리 요약

함수 단위 특징
ST_Distance 도(degree) 정확한 거리 아님, SRID 영향 받음
ST_Distance_Sphere 미터(m) 실무 반경 필터링에 적합

거리 기반 검색, 반경 내 매장 찾기, 배달 구역 판별 등에 활용되는 중요한 기능이니
단위를 착각해서 오작동하는 일이 없도록 주의하자.

📘 공식 문서 참고

https://dev.mysql.com/doc/refman/8.0/en/gis-distance-functions.html

반응형