2012-03-02 103 views
4

我需要用x英里的城鎮功能來實現查找條目,所以我有一個附有自動建議的城鎮框。目前,我使用Google的地理編碼API來獲取自動建議結果的數據,但我們顯然無法調整或更改此數據,並且它並不總是提出明智的建議(即使使用國家/地區提示)。有沒有其他的城鎮/城市位置數據來源?我嘗試瞭解是否可以從OpenStreetMap或其他東西獲得導出,但我只能找到地圖切片或矢量地圖數據,而不是城鎮/城市名稱和位置的POI數據。我可以在哪裏找到用於基於位置的搜索的城市/城鎮位置數據?

任何建議表示讚賞。 謝謝。

+0

您是否搜索過Google Place API?我認爲它是基於位置的搜索的一個很好的選擇。另一個是Foursquare API。其餘的東西,你可以找到從文件.. http://code.google.com/apis/maps/documentation/places/ https://developer.foursquare.com/ 希望這可能會幫助你。 .... – Scorpion 2012-03-13 10:08:37

回答

5

Geonames.org有一個可供下載的城市列表,甚至包括世界各地的許多國家的郵政編碼以及相應的經緯度點。它是在知識共享署名3.0許可下的,這意味着你可以在商業上使用它,但你必須給予歸屬等等。

雖然擁有可下載列表可能意味着在實現搜索算法的所有方面方面有更多工作要做,但最好的辦法是不要讓自己與第三方的正常運行時間/可用性網絡服務。

唯一缺少的其他部分是距離計算公式。您可以使用greater-circle distance formula來計算距離。

我自己做了很多次。第一次編寫代碼時,需要一點點時間才能將所有東西都包裹起來,但是一旦你做完了,之後就是小菜一碟。

我應該提到我是SmartyStreets的創始人。我們進行基於街道的地址驗證,不僅可以告訴您地址是否良好(有很多幫助),但我們也可以爲您提供給定街道地址的緯度/經度座標,可以然後插入上述解決方案,以確定附近的地方。

+0

謝謝 - 我會研究geonames。在摩爾,它似乎有太多的結果,但也許我可以過濾它的東西。不幸的是,我不確定數據中有什麼可以過濾掉英國或海外的所有村莊/小村莊。 – NickG 2012-03-12 17:16:15

+0

您是否試圖根據郵政編碼縮小範圍? (http://download.geonames.org/export/zip/) – 2012-03-12 18:46:14

+0

@JonathanOliver,我正在尋找用戶當前位置附近的餐廳列表。特別針對印度。你能告訴我你的服務是否會提供給我這些數據?如果是,那麼它將免費或付費? – Scorpion 2012-03-13 10:01:36

2

我會說你還有兩個其他的選擇來獲得你需要的功能。

首先,你可以使用一個雜牌集中的結果,更有意義的人(雖然我不會強力推薦這種方法可能足以滿足您的需求。)

你的初始查詢到谷歌的地理編碼API之前得到自動創建結果的數據首先確定城鎮所在的國家。然後,您可以使用國家字符串作爲Geocoding查詢的後綴。

喜歡的東西:

var country = 'UK'; // from initial query, reverse geocode, etc. 
    geocoder.geocode({ 
      'address': address + ', ' + country 
     }, 

看到答案在這個問題的一個例子。 Google's Geocoder returns wrong country, ignoring the region hint

其次,你「顯然不能調整或改變這些數據」的前提是有缺陷的。你當然可以過濾基於國家的結果。類似下面的代碼片段展示瞭如何深入挖掘結果。

geocoder.geocode({ 
     'address': address 
    }, 
    function(results, status) { 
     if(status == google.maps.GeocoderStatus.OK) { 
     for(var i = 0, l = results.length; i < l; i++) { 
      for (var j = 0, l2 = results[i].address_components.length; j < l2; j++) { 
       for (var k = 0, l3 = results[i].address_components[j].types.length; k < l3; k++) { 
       if(results[i].address_components[j].types[k]=="country") { 
        var country = results[i].address_components[j].long_name; 
        // do stuff based on the country 
        // add the result to your auto-suggest, etc... 
       } 
       } 
     } 
     } 
    }); 
    } 

最後,如果您實現了CGI包裝來執行地理編碼,則可以緩存結果。這樣你的應用程序會自動爲你建立你的數據庫。這實際上可以節省實際上對於已知結果的地理編碼。我認爲這幾乎就是你提到的問題,如果你確實找到了可靠的數據源,那麼沒有理由不能預先用已知的結果填充你的緩存。

看看這個文件,說明使用Google Maps API的各種地理編碼策略 - 它討論的東西比如緩存等 https://developers.google.com/maps/articles/geocodestrat

編輯

您可以使用類似geoPlugin

http://www.geoplugin.com/webservices/php#php_class

看看附近的地方的功能,這確實是wha你想要。

http://www.geoplugin.com/webservices/extras

+0

謝謝,但我不知道他們正在搜索的城市是在哪個國家,因爲他們只是在自由文本中輸入:( – NickG 2012-03-15 08:51:46

+0

如果你不知道國家,那麼任何建議是明智的...此外,你在這個問題中,即使是「國家提示」狀態 - 如果您不知道國家或地區,您使用的是哪個國家/地區提示 – Fraser 2012-03-15 14:05:46

+0

也可以查看我的答案編輯 – Fraser 2012-03-15 14:06:59

0

退房http://geohash.org/,這個網站有很多的API,你可能要使用工作。另請參閱article關於此網站的歷史記錄