Каждый пользователь в моей базе данных имеет свою широту и долготу, хранящиеся в двух полях (lat, lon)
Формат каждого поля:
lon | -1.403976
lat | 53.428691
Если пользователь ищет других пользователей, скажем 100 миль, я выполняю следующее, чтобы вычислить соответствующий диапазон lat/lon ($ lat и $lon - текущие значения пользователей)
$R = 3960; // earth mean radius
$rad = '100';
// first-cut bounding box (in degrees)
$maxLat = $lat + rad2deg($rad/$R);
$minLat = $lat - rad2deg($rad/$R);
// compensate for degrees longitude getting smaller with increasing latitude
$maxLon = $lon + rad2deg($rad/$R/cos(deg2rad($lat)));
$minLon = $lon - rad2deg($rad/$R/cos(deg2rad($lat)));
$maxLat=number_format((float)$maxLat, 6, '.', '');
$minLat=number_format((float)$minLat, 6, '.', '');
$maxLon=number_format((float)$maxLon, 6, '.', '');
$minLon=number_format((float)$minLon, 6, '.', '');
Затем я могу выполнить запрос, например:
$query = "SELECT * FROM table WHERE lon BETWEEN '$minLon' AND '$maxLon' AND lat BETWEEN '$minLat' AND '$maxLat'";
Это прекрасно работает, и я использую функцию для вычисления и отображения фактического расстояния между пользователями на выходном этапе, но я хотел бы иметь возможность сортировать результаты, уменьшая или увеличивая расстояние на этапе запроса.
Есть ли способ сделать это?