2016-02-04 33 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