我数据库中的每个用户都将他们的纬度和经度存储在两个字段中(纬度,经度)
每个字段的格式为:
lon | -1.403976
lat | 53.428691
如果用户在 100 英里范围内搜索其他用户,我执行以下操作以计算适当的纬度/经度范围($lat 和 $lon 是当前用户值)
$R = 3960; // earth's 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'";
这很好用,我使用一个函数在输出阶段计算和显示用户之间的实际距离,但我希望能够通过在查询阶段减少或增加距离来对结果进行排序。
有没有办法做到这一点?