2012-10-25 116 views
0

我想要做的是能夠抓取用戶IP地址並辨別出距離我的固定位置有多少個近似里程。我意識到通過使用服務或數據庫,我可以找到城市和郵政編碼,但我也想知道用戶ZIP和我的ZIP之間的大致距離。將IP地址轉換爲距離特定郵政編碼

我見過一個服務和數據庫從用戶IP獲取Zip/City/Country。我還使用了一些PHP類來獲得從一個郵政編碼到另一個郵政編碼的距離。假設我可以使用一個數據庫來獲取zip,而另一個可以比較兩個zip之間的距離,但這看起來非常耗費資源(至少有兩個查詢加處理)。

我只是想展示一個博物館展覽的廣告,如果用戶在100英里以內(基於IP)。如果不是,我不會展示它,因爲它好像太遠了。

有沒有更簡單的方法來實現這個目標?

此外,我不希望瀏覽器通過使用新的HTML5內容來詢問用戶是否可以在我的應用程序中使用他們的地理位置。我寧願這一切都發生在沒有基於位置的意識(和用戶Opt-In)的幕後,除非有一個壓倒性的理由來使用它。

我會接受任何解決方案,但希望在PHP/MYSQL/jQuery/Javascript領域找到一個解決方案。

感謝

+1

我的IP地址來自我的ISP,它距離我們的ISP有4個小時的車程。這是不對的。 –

+1

我的isp是國際性的,有時我的ip查找顯示錯誤的國家。 – 2012-10-25 21:18:08

+0

你的意思是像ip-tracker.org?你可以屏幕刮或看看是否有一個API爲它 – rws907

回答

3

有一個我公司使用名爲郵編Services服務。它位於https://www.zipcodeservices.com。它會處理您在問題中突出顯示的所有內容。

  1. 您可以獲得2個郵政編碼之間的距離。

  2. 您可以傳遞一個IP地址和一個半徑的整數,它將爲您提供該IP地址半徑內的所有zip代碼。

我們實際上使用郵政編碼服務IP地址和郵政編碼服務來向我們的網站查看者顯示地理位置廣告。

最酷的是它都是基於服務的(Rest/JSON,XML或SOAP--你可以自己選擇),而且它也相當便宜 - 它就像一個月15美元一樣。

1

您可以使用類似http://www.geoiptool.com/或其他類似的服務(谷歌的API甚至一個)。

然後,因爲它提供經緯度座標,只需使用以下函數將距離映射到您自己的距離。但要小心 - IP地址的一些緯度/長度的座標是遠離目標的,並且不會與移動設備/小區關聯。 IP的不漫遊:

function distance($lat1, $lng1, $lat2, $lng2, $miles = true) 
{ 
     $pi80 = M_PI/180; 
     $lat1 *= $pi80; 
     $lng1 *= $pi80; 
     $lat2 *= $pi80; 
     $lng2 *= $pi80; 

     $r = 6372.797; // mean radius of Earth in km 
     $dlat = $lat2 - $lat1; 
     $dlng = $lng2 - $lng1; 
     $a = sin($dlat/2) * sin($dlat/2) + cos($lat1) * cos($lat2) * sin($dlng/2) * sin($dlng/2); 
     $c = 2 * atan2(sqrt($a), sqrt(1 - $a)); 
     $km = $r * $c; 

     return ($miles ? ($km * 0.621371192) : $km); 
} 

希望這有助於。

1

有兩個問題需要解決:(1)獲取用戶的緯度/經度;(2)計算距離。對於(2),要使用haversine公式:

http://www.movable-type.co.uk/scripts/latlong.html

a = sin²(Δφ/2) + cos(φ1).cos(φ2).sin²(Δλ/2) 
c = 2.atan2(√a, √(1−a)) 
d = R.c 
where φ is latitude, λ is longitude, R is earth’s radius (mean radius = 6,371km) 
note that angles need to be in radians to pass to trig functions! 
+0

之前沒有看到Movable Type鏈接。良好的資源! – nickhar