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