代替計算兩個城市之間的距離計算爲100英里的邊界框,那麼你有4個浮點變量插入到你的數據庫 - 浮動比較是比數據庫中距離計算快了很多。下行是你在角落裏多走一點距離。
PHP函數來計算邊框
function getBoundingBox($lat_degrees,$lon_degrees,$distance_in_miles)
{
$radius = 3963.1; // of earth in miles
// bearings
$due_north = 0;
$due_south = 180;
$due_east = 90;
$due_west = 270;
// convert latitude and longitude into radians
$lat_r = deg2rad($lat_degrees);
$lon_r = deg2rad($lon_degrees);
// find the northmost, southmost, eastmost and westmost corners $distance_in_miles away
// original formula from
// http://www.movable-type.co.uk/scripts/latlong.html
$northmost = asin(sin($lat_r) * cos($distance_in_miles/$radius) + cos($lat_r) * sin ($distance_in_miles/$radius) * cos($due_north));
$southmost = asin(sin($lat_r) * cos($distance_in_miles/$radius) + cos($lat_r) * sin ($distance_in_miles/$radius) * cos($due_south));
$eastmost = $lon_r + atan2(sin($due_east)*sin($distance_in_miles/$radius)*cos($lat_r),cos($distance_in_miles/$radius)-sin($lat_r)*sin($lat_r));
$westmost = $lon_r + atan2(sin($due_west)*sin($distance_in_miles/$radius)*cos($lat_r),cos($distance_in_miles/$radius)-sin($lat_r)*sin($lat_r));
$northmost = rad2deg($northmost);
$southmost = rad2deg($southmost);
$eastmost = rad2deg($eastmost);
$westmost = rad2deg($westmost);
//return 2 points NW corner and SE corner
return array($northmost,$westmost,$southmost,$eastmost);
}
那麼你的SQL是
SELECT * FROM table WHERE latitude <= $northmost AND longitude >= $westmost AND latitude >= $southmost AND longitude <= $eastmost
是......這個。雖然是第二個「再計算」的步驟是有點棘手:D這絕對是一個壞主意,(每次添加一個你所要做'N'計算/'inserts'時間)存儲市惠城區的距離。數據庫類型(RDBMS或NoSQL)沒有區別。 – Rudu
如果我沒有在數據庫存儲,然後我將如何得到這樣的:給我100英里聖荷西內的所有城市? –
檢查GREAT CIRCLE DISTANCE公式或HAVERSINE DISTANCE。 – Randy