위경도 기준 가까운 장소, 거리, 위치 정렬하기
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
출처 : 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
'알고리즘' 카테고리의 다른 글
| [알고리즘] 쉘정렬 (Shell Sort) Java Example (0) | 2019.06.23 | 
|---|---|
| [알고리즘] 버블정렬 (Bubble Sort) Java Example (0) | 2019.06.23 | 
| [알고리즘] 삽입정렬 (Insertion Sort) Java Example (0) | 2019.06.16 | 
| [알고리즘] 선택정렬 (Selection Sort) Java Example (0) | 2019.06.16 | 
| [알고리즘] 퀵정렬 (Quick Sort) Java Example (0) | 2019.06.16 |