我有一个包含以下属性的MySQL表: STORE_NAME LAT LON
我有1500条记录。
我需要找到离用户最近的商店(基于IP)。
我已经使用第三方API计算了IP翻译部分。我知道如何计算2个坐标之间的距离。但是,我不知道如何返回最接近的商店名称。
我计算距离的功能
function distance($lat1, $lon1, $lat2, $lon2)
{
$minus = $lon1 - $lon2;
$dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1))*cos(deg2rad($lat2)) * cos(deg2rad($minus));
$dist = acos($dist);
$dist = rad2deg($dist);
$miles = $dist * 60 * 1.1515;
return $miles;
}
我可以找到用户与每家商店之间的距离。
注意:$ lat1和$ lat1是由第三方API服务获得的。
$store = mysql_query("SELECT * FROM store") or die(mysql_error());
while($row=mysql_fetch_assoc($store))
{
$lat2 = $row["lat"];
$lon2 = $row["lon"];
$distance = distance($lat1, $lon1, $lat2,$lon2);
}
如何计算运行距离函数并将距离值存储在数组中,然后对距离进行排序以找到最近的商店?这是正确的方法吗?我该如何处理数组代码?我对PHP中的数组没有经验。
谢谢。
答案 0 :(得分:1)
您可以在数据库端进行数学运算,按距离排序结果集并选择值最小的结果。
我冒昧地更新了您的数据库访问方法。在任何情况下,都不要使用mysql_*
函数。
$lat1 = 123.245;
$lon1 = 48.123;
$dbhost = "localhost";
$dbname = "database";
$username = "user";
$password = "pass";
$db = new PDO("mysql:host=$dbhost;dbname=$dbname", $username, $password);
$query = "SELECT *, DEGREES(ACOS(SIN(RADIANS(?)) * SIN(RADIANS(`lat`)) + COS(RADIANS(?)) * COS(RADIANS(`lat`)) * COS(RADIANS(? - `lon`)))) * 60 * 1.1515 AS distance
FROM store
ORDER BY distance ASC
LIMIT 1";
$stmt = $db->prepare($query);
$stmt->execute(array($lat1, $lat1, $lon1));
$result = $stmt->fetch(PDO::FETCH_ASSOC);
print_r($result);