找到2个坐标与表中存储的1个集合之间的最短距离

时间:2016-02-04 22:38:36

标签: php mysql arrays sorting

我有一个包含以下属性的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中的数组没有经验。

谢谢。

1 个答案:

答案 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);