Алгоритм расчета ближайшего местоположения (из базы данных) на основе логарифма и широты

Что я хочу сделать, так это разработать алгоритм для расчета того, какие известные местоположения ближе всего к выбранному местоположению. Допустим, у меня есть 7 мест в базе данных, и когда пользователь выбирает одно, у него должна быть возможность увидеть, скажем, первые 3 ближайших места (из базы данных). В базе данных каждое место сохраняется с широтой и долготой.

Любая идея о том, как я могу это сделать?

Пример. Допустим, список содержит 100 местоположений велосипедных станций. Я нахожусь на станции 5 и хочу узнать, какие еще станции в списке находятся поблизости. Не расстояние, а их расположение.


person Sebi CN    schedule 13.05.2019    source источник
comment
А где твой код? Расстояние между двумя точками представляет собой простое уравнение, основанное на теореме Пифагора. Вы искали это в Google?   -  person derloopkat    schedule 13.05.2019
comment
Изучите алгоритм дерева k-d en.wikipedia.org/wiki/K-d_tree   -  person JOSEFtw    schedule 13.05.2019
comment
Я, конечно, гуглил, но я не ищу, как рассчитать расстояние, как я сказал в «вопросе», я хочу узнать их местоположение.   -  person Sebi CN    schedule 13.05.2019
comment
широта/долгота - это местоположение... так что оно у вас уже есть. И с расстоянием (как в моем ответе) вы можете вычислить ближайшие 3.   -  person MauriceNino    schedule 13.05.2019
comment
Также вы можете взглянуть на встроенные базы данных. Если я не ошибаюсь, SQL сервер имеет методы работы с пространственными данными.   -  person cyberpug2077    schedule 13.05.2019
comment
Возможно, у меня есть @cyberpug2077, но я предпочел некоторый код C# или javascript, а не sql, потому что я не настолько «квалифицирован» в работе с базами данных.   -  person Sebi CN    schedule 13.05.2019


Ответы (2)


Хороший вопрос. Предположим, у нас есть следующие три значения в БД:

var dataFromDb = [{
    "location": "First location",
    "lat": "1.28210155945393",
    "lng": "103.81722480263163",

}, {
    "location": "Second location",
    "lat": "1.2777380589964",
    "lng": "103.83749709165197",
    "location": "Stop 2"
}, {
    "location": "Third Location",
    "lat": "1.27832046633393",
    "lng": "103.83762574759974",
}];

Создайте функцию для расстояния между двумя местами:

function distanceBetweenTwoPlace(firstLat, firstLon, secondLat, secondLon, unit) {
        var firstRadlat = Math.PI * firstLat/180
        var secondRadlat = Math.PI * secondLat/180
        var theta = firstLon-secondLon;
        var radtheta = Math.PI * theta/180
        var distance = Math.sin(firstRadlat) * Math.sin(secondRadlat) + Math.cos(firstRadlat) * Math.cos(secondRadlat) * Math.cos(radtheta);
        if (distance > 1) {
            distance = 1;
        }
        distance = Math.acos(distance)
        distance = distance * 180/Math.PI
        distance = distance * 60 * 1.1515
        if (unit=="K") { distance = distance * 1.609344 }
        if (unit=="N") { distance = distance * 0.8684 }
        return distance
}

Определить текущее место:

var currentLat = 1.28210155945393;
var currentLng = 103.81722480263163;

Найти записи в пределах 1 км:

for (var i = 0; i < data.length; i++) {
    if (distance(currentLat, currentLng, data[i].lat, data[i].lng, "K") <= 1) {
        console.log(data[i].location);
    }
}
person Paresh Barad    schedule 13.05.2019
comment
Очень четко и красиво, я попробую и вернусь с ответом. Большое спасибо! - person Sebi CN; 13.05.2019

Вы можете просмотреть отличный пример того, как его рассчитать здесь.

С этого сайта:

var R = 6371e3; // metres
var φ1 = lat1.toRadians();
var φ2 = lat2.toRadians();
var Δφ = (lat2-lat1).toRadians();
var Δλ = (lon2-lon1).toRadians();

var a = Math.sin(Δφ/2) * Math.sin(Δφ/2) +
        Math.cos(φ1) * Math.cos(φ2) *
        Math.sin(Δλ/2) * Math.sin(Δλ/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));

var d = R * c; //<-- distance between lat1/lon1 and lat2/lon2
person MauriceNino    schedule 13.05.2019
comment
Это довольно красиво, я уже видел его, но я хочу найти фактическое местоположение «станции». Скажем те, кто ближе 1 км от меня. - person Sebi CN; 13.05.2019
comment
Да, и для этого вы должны рассчитать расстояние для каждого из них. Затем отсортируйте его и выберите первые три. - person MauriceNino; 13.05.2019
comment
Да, вы действительно правы, не подумал об этом. Я попробую сделать это, и я приду с ответом. Но еще один вопрос, я знаю, это звучит глупо, расстояние между двумя точками рассчитывается в метрах? - person Sebi CN; 13.05.2019
comment
На сайте указаны километры, поэтому я предполагаю, что это будет так. Но вы можете легко протестировать его, используя те же значения, что и на сайте, и проверить результат. Если это то же самое его километров. Если его значение в 1000 раз превышает его метры. - person MauriceNino; 13.05.2019
comment
Круто, очень помогло, попробую. Спасибо. - person Sebi CN; 13.05.2019