2010-09-07 89 views
0

我剛剛爲我的爸爸公司開發了一個郵政編碼距離計算器,我們所有的客戶都在檔案中,每當有新的潛在客戶進行查詢時,系統都會檢查所有其他客戶的郵政編碼。問題是它還沒有做距離計算。在距離設置爲5英里的DT1郵政編碼中鍵入,表示DT1,2和3靠近。 DT2表示DT1和2,DT3表示DT1,3和4.這沒有任何意義。然而,如果我將BH2放在50英里的距離內,它將帶回伯恩茅斯,多爾切斯特,樸次茅斯,巴斯,南安普敦和其他幾個城鎮。這些都是正確的 - 但我不知道DT郵編髮生了什麼。 DT11不會帶回任何(不到5英里),DT10也不會帶回(除了他們自己)。郵政編碼距離計算

我首先使用了(x * x + y * y)的根 - 我相信這就是所謂的畢達哥拉斯定理。不知道,因爲我使用這個詞已經有多年了!

我也曾嘗試以下操作:

$sinstuff = sin(deg2rad($latitude))*sin(deg2rad($latitude2)); 
    $cosstuff = cos(deg2rad($latitude))*cos(deg2rad($latitude2))*cos(deg2rad($longitude-$longitude2)); 
    $sumstuff = $sinstuff + $cosstuff; 
    $acosstuff = rad2deg(acos($sumstuff)); 
    $distance = $acosstuff*60*1.1515; //dunno what the 60 and 1.1515 is all about - I got this formula off a website. 

這是似乎是造就了奇怪的結果的公式。我還注意到,DT11和DT11之間的確切距離大約是+/- 0.00000989 {和許多其他數字}。這也似乎有點奇怪,因爲,當然,DT11和它本身之間的距離是0 ...

有沒有人曾經成功地做過類似這樣的事情?

我確實有一大批文件 - 總共約158MB - 包含每個英國郵政編碼全部,以及相應的經度和緯度。我的目標是,不是將指定的全部郵政編碼與其他全部郵政編碼進行比較,以確定哪些區號小於一定距離,然後將指定的郵政編碼與這些區域內的所有郵政編碼進行比較。這是否有效?有沒有更高效的方法?

任何幫助,這將不勝感激。

問候,

理查德

PS我知道有一些網站在那裏,告訴你如何計算出的距離,但我不似乎能夠得到其中的任何工作正常(因爲你可以從上面告訴)。

PPS我知道我可以爲此使用Google API - 但這不是一個選項,因爲這將成爲在本地安裝的wamp服務器上運行的離線應用程序。它適用於我們無法保證互聯網連接的貿易展會。

+0

約+/- 0.00000989 {和很多其他數字}',這只是一個舍入誤差 – 2010-09-07 09:21:01

+0

它應該仍然是0,當然...無論計算是如果數字是相同的,它應該是0 .. 。當我把它變成2dp時,我發現了它,它在0時表示它只是四捨五入 - 但它不應該需要四捨五入。 – ClarkeyBoy 2010-09-07 09:33:32

回答

1

你使用haversine公式:

$ L1 ==> latitude1
$ 01 ==> longitude1
$ L2 ==> latitude2
$ O2 ==> longitude2

(從http://www.go4expert.com/forums/showthread.php?t=339拍攝)

 
function haversine ($l1, $o1, $l2, $o2)
{
$l1 = deg2rad ($l1);
$sinl1 = sin ($l1);
$l2 = deg2rad ($l2);
$o1 = deg2rad ($o1);
$o2 = deg2rad ($o2);
return (7926 - 26 * $sinl1) * asin (min (1, 0.707106781186548 * sqrt ((1 - (sin ($l2) * $sinl1) - cos ($l1) * cos ($l2) * cos ($o2 - $o1)))));
}

這應該給你兩個點之間的距離。

+0

看起來這可能正是我正在使用的,但以不同的格式。它出現了完全相同的結果 - DT1 => DT1,2,3; DT2 => DT1,2; DT3 => DT1,3,4等等 – ClarkeyBoy 2010-09-07 10:33:18

+0

想想吧,當然使用x * x + y * y的根應該可以工作,不應該嗎?我的意思是通過從lat2獲取lat1和從long2獲取long1,您將創建兩個距離。將這些用作三角形的兩邊應該給出一個直角三角形,然後你可以使用pythags定理來計算斜邊......儘管我認爲有單位轉換需要考慮。緯度/長度以米爲單位,每個機會?如果是這樣,那麼你可以用1000除以得到km或〜1680來獲得里程。 – ClarkeyBoy 2010-09-07 10:43:27

+0

那麼我已經提出了自己的公式 - 將經緯度轉換爲米,然後執行pythags定理,然後除以一英里的米數。它仍然會產生完全相同的結果。我想知道是否它的代碼決定了什麼結果輸出是造成這.. – ClarkeyBoy 2010-09-07 10:55:50

1

我認爲郵局維護一個郵政編碼地址文件,其中列出每個英國郵政編碼及其相關地址(不知道它是否有 經度和緯度信息) 。我在 以前的各種PC雜誌的封面光盤上看到過這些副本(可能不是最新的 )。我確定你必須支付最新版本,但你可能是 可以從 問題中查看封面光盤來獲得起點。