위경도 기준 가까운 장소, 거리, 위치 정렬하기
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