2012-03-21 134 views
3

選擇隨機GPS點我想寫一個PHP程序在我的數據庫選擇從400點16個隨機GPS點與最小距離

(點表:ID - 標題 - 緯度 - 經度)。

LAT 37.9824
LON -87.5781547

的唯一要求16個的隨機點,其每一個彼此點(發現在1KM範圍的點)

它是一個至少爲1公里系統,該系統選擇每家藥房之間最小距離爲1公里的藥房。我在數據庫中有400家藥店,每週我必須選擇16家藥店。我無法選擇非常接近的兩家藥店。

示例:

如果程序返回3藥店A B和C。

藥房之間的ditance必須是:

A和B = 1 KM

A和C = 1 KM

B和C = 1 KM

+0

封閉,不是一個真正的問題由deceze,吉榮,袞,感知,道3小時前????? 對不起你們我認爲這是一個問題,我忘了,這只是一個爆炸性新聞 – Fadel 2012-03-21 12:02:38

回答

0

讓我們嘗試使硬方式,因爲你只有400個記錄,它可能只需要幾個小時......沒有嘗試過,但它可能會給你一個想法

$min =1; 
$n =16; 

$pharmas = fillUp(); 

// main function 
function fillUp(){ 
    $points = array(); 
    while(count($points)< $n){ 
     $tmp = getRandomPoint(); 
     if(checkAll($tmp, $points){ 
     $points[] = $tmp; 
     } 
} 
return $points; // after a few hours ?? 
} 

// get a random point 
// after all we might get lucky 
function getRandomPoint(){ 
//... 
// return array with ['latitude'] & ['longitude'] 
} 

// check that all points meet the requirements 
function checkAll($pt, $points){ 
    foreach($points as $point){ 
     if(distance($point, $pt) < $min { 
       return false; 
      } 
    } 
    return true; 
} 

// calculate the distance between 2 points 
function distance ($point1, $point2, $uom='km') { 
    // Use Haversine formula to calculate the great circle distance 
    //  between two points identified by longitude and latitude 
    switch (strtolower($uom)) { 
     case 'km' : 
      $earthMeanRadius = 6371.009; // km 
      break; 
     case 'm' : 
      $earthMeanRadius = 6371.009 * 1000; // km 
      break; 
     case 'miles' : 
      $earthMeanRadius = 3958.761; // miles 
      break; 
     case 'yards' : 
     case 'yds' : 
      $earthMeanRadius = 3958.761 * 1760; // miles 
      break; 
     case 'feet' : 
     case 'ft' : 
      $earthMeanRadius = 3958.761 * 1760 * 3; // miles 
      break; 
     case 'nm' : 
      $earthMeanRadius = 3440.069; // miles 
      break; 
    } 
    $deltaLatitude = deg2rad($point2['latitude'] - $point1['latitude']); 
    $deltaLongitude = deg2rad($point2['longitude'] - $point1['longitude']); 
    $a = sin($deltaLatitude/2) * sin($deltaLatitude/2) + 
      cos(deg2rad($point1['latitude'])) * cos(deg2rad($point2['latitude'])) * 
      sin($deltaLongitude/2) * sin($deltaLongitude/2); 
    $c = 2 * atan2(sqrt($a), sqrt(1 - $a)); 
    $distance = $earthMeanRadius * $c; 
    return $distance; 
} 
0

這裏摘下帽子的答案:

我首先會創建一個視圖,其中包含的對象列表與使用笛卡爾距離公式的距離接近,然後應用PHP代碼來計算實際的球面距離。

@MY_LAT = 37.9824; 
@MY_LONG = -87.5781547; 

SELECT *, SQRT(
       ABS((latitude - @MY_LAT) * (latitude - @MY_LAT) + 
        (longitude - @MY_LONG) * (longitude - @MY_LONG))) 
      AS DIST 
FROM POINT_TABLE 
ORDER BY DIST ASC 

從該視圖中選擇前n行,以獲得距離'興趣點'最近的16個點。要檢查點是你的參考點1公里範圍內得到的結果後,你可以寫一個小PHP代碼段。這會幫助你與片段:

http://www.zipcodeworld.com/samples/distance.php.html

在這裏,我用它只會減少的記錄數你能適用於PHP球面距離公式爲目的的查詢笛卡爾距離公式.X