我的数据库中的每个用户都有他们的纬度和经度存储在两个字段(lat,lon)中。
每个字段的格式为:
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'";
这个很好用,我用一个函数在输出阶段计算并显示用户之间的实际距离,但我想在查询阶段按距离递减或递增排序结果。
有没有办法做到这一点?
BETWEEN
并不总是足够准确,因为它查询的是一个正方形区域而不是从你的位置到半径的距离。 - lukeocodes