Как получить все данные по кругу? - PullRequest
0 голосов
/ 20 марта 2020

У меня есть таблица с именем столбца, широтой, долготой. Я хочу найти все данные внутри круга, упорядоченные по ближайшему расстоянию до центральной точки. Чтобы получить круг, у меня есть центральная точка (широта / долгота). скажем, широта и долгота -6.12579106 и 106.65699005, то данные, которые появятся, будут данными с именами A и B. Ниже моя таблица (таблица аварий)

name, latitude, longtitude
A, -6.13116749, 106.66625977
B, -6.10377274, 106.66703224
C, 3.5896654,   98.6738261

Я хочу найти данные по ближайшим расстояние в ГДЕ КЛЮЗ. как это сделать? Спасибо за помощь:)

SELECT * FROM accident
LEFT JOIN polres ON polres.id = accident.polres_id
LEFT JOIN polda ON polda.id = polres.polda_id
WHERE --(condition for find data by closest distance) 

1 Ответ

0 голосов
/ 20 марта 2020

Вы можете использовать следующую функцию для вычисления расстояния:

CREATE OR REPLACE FUNCTION calculate_distance(lat1 float, lon1 float, lat2 float, lon2 float, units varchar)
RETURNS float AS $dist$
    DECLARE
        dist float = 0;
        radlat1 float;
        radlat2 float;
        theta float;
        radtheta float;
    BEGIN
        IF lat1 = lat2 OR lon1 = lon2
            THEN RETURN dist;
        ELSE
            radlat1 = pi() * lat1 / 180;
            radlat2 = pi() * lat2 / 180;
            theta = lon1 - lon2;
            radtheta = pi() * theta / 180;
            dist = sin(radlat1) * sin(radlat2) + cos(radlat1) * cos(radlat2) * cos(radtheta);

            IF dist > 1 THEN dist = 1; END IF;

            dist = acos(dist);
            dist = dist * 180 / pi();
            dist = dist * 60 * 1.1515;

            IF units = 'K' THEN dist = dist * 1.609344; END IF;
            IF units = 'N' THEN dist = dist * 0.8684; END IF;

            RETURN dist;
        END IF;
    END;
$dist$ LANGUAGE plpgsql;

Для параметра units вы можете использовать следующие значения:

'M' is statute miles (default)                     
'K' is kilometers
'N' is nautical miles

И затем использовать выше работать следующим образом:

SELECT * from test where 
calculate_distance(latitude, longtitude, -6.12579106, 106.65699005, 'K') <3;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...