DB

[MySQL] (GIS6️⃣) 실무에서 자주 쓰는 공간 쿼리 예제 모음

인생아 2025. 7. 18. 17:57
반응형

MySQL의 GIS 기능은 좌표 기반 서비스를 개발할 때 강력한 도구다.
하지만 공식 문서만 보고는 실무에 바로 적용하기 어렵다.
이 글에서는 실제로 자주 쓰이는 공간 쿼리 예제를 정리했다.
POINT 기반 매장 검색, 반경 검색, 경계 포함 여부 판단 등 다양한 상황에 대응할 수 있다.

📍 1. 특정 위치에 가장 가까운 매장 찾기

SELECT name,
  ST_Distance_Sphere(location, ST_GeomFromText('POINT(126.98 37.56)', 4326)) AS distance_m
FROM stores
ORDER BY distance_m
LIMIT 1;

✅ 특정 위치에서 가장 가까운 매장을 찾는 실무에서 자주 사용됨
✅ ST_Distance_Sphere는 결과를 미터 단위로 반환

반응형

📍 2. 반경 1km 이내 매장 검색

SELECT name
FROM stores
WHERE ST_Distance_Sphere(location, ST_GeomFromText('POINT(126.98 37.56)', 4326)) < 1000;

✅ 배달 가능 범위, 주변 탐색 등에서 필수
✅ 거리 단위는 미터 기준 (1000m = 1km)

📍 3. 특정 영역(POLYGON) 안에 있는 매장 찾기

SELECT name
FROM stores
WHERE ST_Contains(
  ST_GeomFromText('POLYGON((126.97 37.56, 126.99 37.56, 126.99 37.58, 126.97 37.58, 126.97 37.56))', 4326),
  location
);

✅ 행정 구역 또는 특정 지역 범위 내 매장 필터링

📍 4. 두 위치 간 거리 계산

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

✅ 지도상 두 지점 간 거리 출력 (결과는 미터 단위)

📍 5. 좌표에서 위도, 경도 분리 추출

SELECT name,
  ST_X(location) AS longitude,
  ST_Y(location) AS latitude
FROM stores;

✅ 좌표를 분리해서 가공하거나 API에 전달할 때 유용

반응형

📍 6. 다각형(POLYGON) 외부 좌표 필터링

SELECT name
FROM stores
WHERE NOT ST_Contains(
  ST_GeomFromText('POLYGON((126.97 37.56, 126.99 37.56, 126.99 37.58, 126.97 37.58, 126.97 37.56))', 4326),
  location
);

✅ 특정 지역을 제외한 외곽 매장 찾기

📍 7. 두 POLYGON이 겹치는지 확인

SELECT ST_Intersects(
  ST_GeomFromText('POLYGON((126.97 37.56, 126.98 37.56, 126.98 37.57, 126.97 37.57, 126.97 37.56))', 4326),
  ST_GeomFromText('POLYGON((126.975 37.565, 126.985 37.565, 126.985 37.575, 126.975 37.575, 126.975 37.565))', 4326)
) AS is_overlap;

✅ 구역 간 충돌 검증, 서비스 범위 중첩 확인 등에 사용됨

📍 8. 라인과 점이 교차하는지 확인 (ex: 도로와 지점 교차 여부)

SELECT ST_Intersects(
  ST_GeomFromText('LINESTRING(126.97 37.56, 126.99 37.58)', 4326),
  ST_GeomFromText('POINT(126.98 37.57)', 4326)
) AS is_cross;

✅ 특정 위치가 도로 경로에 포함되는지 판단할 때 유용

📍 실무 팁 정리

  • 검색 범위가 넓을수록 ST_Distance_Sphere 보다는 사전 필터 + 거리 계산 조합이 성능에 유리하다
  • 다량의 좌표 데이터를 조회할 땐 SPATIAL INDEX 필수
  • SRID를 정확히 지정하지 않으면 공간 연산이 실패하거나 성능이 저하됨
  • 좌표값은 항상 경도(가로), 위도(세로) 순서로 작성할 것

📘 공식 문서 참고

https://dev.mysql.com/doc/refman/8.0/en/gis-function-reference.html

반응형