2016-02-04 172 views
0

我有一个MySQL表具有以下属性1套: STORE_NAME 纬度 LON找到2个坐标之间最短的距离与存储在表中

我有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

请[停止使用'mysql_ *'功能](http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php)。 [这些扩展](http://php.net/manual/en/migration70.removed-exts-sapis.php)已在PHP 7中删除。了解[编写]​​(http://en.wikipedia.org/ wiki/Prepared_statement)语句[PDO](http://php.net/manual/en/pdo.prepared-statements.php)和[MySQLi](http://php.net/manual/en/mysqli.quickstart .prepared-statements.php)并考虑使用PDO,[这真的很简单](http://jayblanchard.net/demystifying_php_pdo.html)。 –

+0

mysql_query放在一边(我会解决这个问题,谢谢),我该如何处理排序? –

+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); 
+0

快速的问题 - 为什么2 $ lat1变量在这一行传递 - $ stmt-> execute(array($ lat1,$ lat1,$ lon1)); –

+0

在公式中引用用户纬度两次;你需要为每个'?'占位符传递一个变量。 – miken32