Haversine formula를 사용하여 행별로 정렬

2154 단어 SQLPostgreSQL
longitude와latitude를 사용하여 어느 지점부터 위치 기반 정렬을 시작합니다.
거기서 사용할 수 있는 건요.
Haversine formula라는 공식입니다.
http://en.wikipedia.org/wiki/Haversine_formula

결국

에서 설명한 대로 해당 매개변수의 값을 수정합니다.(공식의 전개 등은 번거롭기 때문에 생략한다...)
하면, 만약, 만약...
select id,name,latitude,longitude from cities;
id
name
latitude
longitude

Kuala Lumpur
3.146685
101.686656

Singapore
1.283333
103.833333

Bangkok
13.787395
100.524502

Hong Kong
22.27833
114.15889

Jakarta
-6.193806
106.843314

Manila
14.603352
120.984682

Taipei
25.105495
121.557441
이 샘플 데이터를 사용하여 Kuala Lumpur에 가까운 점으로 정렬해 보십시오.
\set lat  3.046685
\set lng  100.686656

SELECT 
    id,name,latitude,longitude , 
    3956 * 2 * 
    ASIN(
        SQRT(
            POWER(SIN( (:lat - abs(cities.latitude)) * pi()/180 / 2), 2 ) + COS(:lat * pi()/180) * COS(cities.latitude * pi()/180) * POWER(SIN((:lng - cities.longitude) * pi()/180 / 2)
        , 2)
        )
    ) 
    AS distance 
    from cities order by distance;
id
name
latitude
longitude
distance

Kuala Lumpur
3.146685
101.686656
69.2892623017496

Singapore
1.283333
103.833333
248.908449383448

Jakarta
-6.193806
106.843314
476.126654090718

Bangkok
13.787395
100.524502
741.677180652493

Manila
14.603352
120.984682
1595.9777030627

Hong Kong
22.27833
114.15889
1605.53830449593

Taipei
25.105495
121.557441
2059.91627144258
결과는 이렇다.
* 성능 등을 고려하지 않음...

좋은 웹페이지 즐겨찾기