728x90
반응형

 

위경도 기준 가까운 장소, 거리, 위치 정렬하기

 

1. SQL 쿼리

  • 지구의 반지름 6371km
  • ASIN(1) * 2 = PI(3.14)

 

SELECT 장소명
     , 6371 * ACOS(
        COS ( (ASIN(1) * 2) / 180 * 내위치 위도 35.xxx)
      * COS ( (ASIN(1) * 2) / 180 * 정렬하고자 하는 테이블의 등록된 위치의 위도 35.xxx)
      + SIN ( (ASIN(1) * 2) / 180 * 내위치 위도 35.xxx)
      * SIN ( (ASIN(1) * 2) / 180 * 정렬하고자 하는 테이블의 등록된 위치의 위도 35.xxx)
      * COS (((ASIN(1) * 2) / 180 * 내위치 경도 127.xxx) - ((ASIN(1) * 2) / 180 * 정렬하고자 하는 테이블의 등록된 위치의 경도 127.xxx))
      ) AS DISTANCE
   FROM 테이블명
 ORDER BY DISTANCE;

 

 

2. RADIANS 함수 사용 쿼리

  • RADIANS 함수 생성
  • 빗변의 길이가 1인 직각삼각형은 cos(세타) == sin(90-세타)
  • 2파이r은 원의 둘레의 공식에서 빗변의길이 == 2세타
  • 위도,경도로 가까운거리 = 원의둘레의 중 일부의길이
  • 세타*6371이 두개의 위도,경도가 주어졌을때 서로간의 길이 
  •  ACOS로 세타의값을 상수로 변경

 

CREATE OR REPLACE FUNCTION RADIANS(nDegrees IN NUMBER) RETURN NUMBER DETERMINISTIC IS

BEGIN
-- radians = degrees / (180 / pi)
-- RETURN nDegrees / (180 / ACOS(-1)); -- but 180/pi is a constant, so...
RETURN nDegrees / 57.29577951308232087679815481410517033235;
END RADIANS;

출처 : https://shiningknowledge.tistory.com/135

 

SELECT 장소명
 , 6371 * ACOS(
   COS(RADIANS(내위치 위도 35.xxx))
 * COS(RADIANS(정렬하고자 하는 테이블의 등록된 위치의 위도 35.xxx))
 + SIN(RADIANS(내위치 위도 35.xxx))
 * SIN(RADIANS(정렬하고자 하는 테이블의 등록된 위치의 위도 35.xxx))
 * COS(RADIANS(내위치 경도 127.xxx)-RADIANS(정렬하고자 하는 테이블의 등록된 위치의 경도 127.xxx))
 )
 FROM 테이블명
 ORDER BY DISTANCE;

 

3. ST_Distance

  • 두 개의 위경도 사이의 최소거리
  • 점과 점사이 거리
  • 반환 타입은 미터
  • ST_DistanceSphere(
      ST_GeomFromText('POINT(129.014525 35.13542)', 4326)
    , ST_GeomFromText('POINT(129.014525 36.24553)', 4326)
  • EPSG:4326, EPSG:3857 등 많이 사용하는 좌표체계, 생략가능

 

SELECT 장소명
  , ST_Distance(
    ST_GEOMFROMTEXT('POINT(' || 정렬하고자 하는 테이블의 등록된 위치의 경도 127.xxx || ' ' || 정렬하고자 하는 테이블의 등록된 위치의 위도 35.xxx || ')')
  , ST_GEOMFROMTEXT('POINT([내위치 경도 127.xxx] [내위치 위도 35.xxx])') 
  ) AS DISTANCE
  FROM 테이블명
  ORDER BY DISTANCE;

 

 

 

 

 

수정이 필요하거나 내용이 추가 될 부분은 댓글을 남겨주시면 반영하겠습니다.

Last modified date : 23.01.02

 

728x90
반응형

+ Recent posts