Лучший способ вычислить расстояние от входа до записей базы данных - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть API (PHP), который будет принимать долготу, широту и расстояние.

У меня также есть таблица shops, в которой есть записи местоположений

id, longitude, latitude

Теперь,Мой API будет принимать входные данные longitude, latitude и distance

Моя цель - найти в базе данных ближайший магазин к входным данным latitude и longitude и distance, которые являются областью поиска,скажем, в пределах distance = 20km

У меня уже есть функция, которая будет определять расстояние между двумя точками:

private function computeDistance($lat1, $lng1, $lat2, $lng2, $radius = 6378137)
{
    static $x = M_PI / 180;
    $lat1 *= $x; $lng1 *= $x;
    $lat2 *= $x; $lng2 *= $x;
    $distance = 2 * asin(sqrt(pow(sin(($lat1 - $lat2) / 2), 2) + cos($lat1) * cos($lat2) * pow(sin(($lng1 - $lng2) / 2), 2)));
    $meters = $distance * $radius;
    return $meters * (1 / 1000); // Return Kilometers
}

Теперь, каков наилучший подход для этого?Мой первоначальный план состоит в том, чтобы получить все записи в базе данных, а затем перейти к ним, сравнить входной параметр в API и проверить его расстояние, если оно находится внутри параметра distance, и вставить его в массив.

Есть либолее эффективный способ сделать это?

Ответы [ 2 ]

0 голосов
/ 12 апреля 2019

Я также недавно изучал это, и этот , кажется, лучший ответ, который я нашел до сих пор. Кроме того, здесь это тот, который использует PHP и Doctrine.

В обоих случаях они выполняют вычисления на стороне базы данных (не уверен, насколько эффективен запрос), что, вероятно, будет более эффективным, если у вас много записей, которые вы ищете.

0 голосов
/ 12 апреля 2019

Я зависит от того, сколько у вас магазинов.Если у вас есть 100, вы можете легко вытащить их в память и разобраться в них.

Когда вам нужно ограничить его, вы можете выбрать магазины в прямоугольнике на основе широты и долготы.select * from shops where lat between arglat - 10 and arglat + 10 and lng between arglng - 10 and arglng + 10

...