2011-06-05 60 views
3

我有一個城市名稱字段,我從中獲得價值(即隨機格式),例如「紐約」,「紐約」或「紐約」或「紐約」。用戶輸入城市名稱(僅限美國)檢索郵政編碼的最佳API?

擁有該字段的值,我需要出示用戶與那些在他們的名字在這個格式值城市的列表:
紐約 - 紐約 - 10001個
MN - 紐約米爾斯 - 56567

效率和性能很重要。我可以使用JavaScript或PHP來檢索這些數據。

到目前爲止,我試過使用Freebase API。這裏有一個例子查詢我使用:http://tinyurl.com/3ogpf7k

而且這裏是我使用的JavaScript代碼:

// App.q contains city name field's value 

var query = { 
    extended : 1, 
    query : [{ 
     search : App.q, 
     type : '/location/citytown', 
     id : null, 
     name : null, 
     postal_codes : [], 
     "/location/location/containedby" : [{ 
      "type" : "/location/us_state", 
      "name": null, 
      // two letters abbreviation of state 
      "/common/topic/alias" : [] 
     }] 
    }] 
}, 
url = 'http://www.freebase.com/api/service/mqlread?callback=?&query=' + 
     encodeURIComponent(JSON.stringify(query)); 

$.getJSON(url, function(data) { 
    var cities, i, len, name, aliases, j, abbr, postal_code, HTML = []; 

    for (i = 0, len = data.result.length; i < len; i += 1) { 
     // cities with names matching user's input 
     if (data.result[ i ].name.toLowerCase().indexOf(App.q) === -1) continue; 
     // cities that have postal_codes data available 
     if (data.result[ i ].postal_codes.length === 0) continue; 

     name = data.result[ i ].name; 
     aliases = data.result[ i ]["/location/location/containedby"][0]["/common/topic/alias"]; 
     postal_code = data.result[ i ].postal_codes[0]; 

     // find two-letters alias 
     for (j = aliases.length - 1; j >= 0; j -= 1) { 
      if (aliases[j].length === 2 && aliases[j] === aliases[j].toUpperCase()) { 
       abbr = aliases[j]; 
      } 
     } 

     HTML.push(D.renderHTML(liTemplate, { 
      name : name, 
      abbr : abbr, 
      postal_code : postal_code 
     })); 

    } 

    console.log(HTML.join('')); 
}); 

然而,查詢「紐約」似乎並沒有返回連「紐約市」。

有沒有更好的API來滿足我的需求?我在做Freebase API的問題嗎?

UPD。另一個有用的API,允許做種相同的(它仍然不把我的需求,但 - 通過他們太多的結果,並沒有分頁的方式):
文檔:http://www.geonames.org/export/web-services.html
例子:http://api.geonames.org/postalCodeSearch?placename=los%20angeles&username=demo&maxRows=500

謝謝!

+2

關聯一個城市,郵政編碼不會在英國工作的基礎搜索服務的文件,它只會給你的前幾個字符代碼。另一點是,有很多地址與附近的城市沒有關聯,因此地址表單的城市字段不適用。 – koan 2011-06-05 13:13:35

+1

無論是荷蘭。它反過來工作。如果您有郵政編碼和門牌號碼,您可以從中獲取城市和街道。據我所知,沒有開放的數據庫或免費的API來使用該數據庫,儘管您可以購買該數據庫的許可證並獲取定期更新。 – GolezTrol 2011-06-05 13:15:27

+0

我不認爲它適用於任何有大城市的地方。在美國,即使不是非常大的城鎮也經常有多個郵政編碼,而且在郵局中分配「郵箱」的代碼塊很常見(不知道國際術語;內部帶鎖的安全箱郵局建築物)。 – Pointy 2011-06-05 13:18:25

回答

1

對不起以前誤導的答案。我沒有注意到您使用MQL擴展名「搜索」而不是「名稱」屬性。

主要的問題是,默認排序不是通過搜索得分(不知道爲什麼,但這是它的方式)。修改您的查詢像this應該解決的事情:

"search":  {"query":"New York","score":null,"type_strict":"all"}, 
"sort":"-search.score", 
"type":"/location/citytown", 

排序參數是從「搜索」子查詢返回的「分數」值降序排序。你也可以使用mql_filter參數進行搜索,以便它甚至不考慮不符合約束的事情(稍微高效)。

搜索擴展記錄here並且是用途here

+0

我猜想'search:「new york」'不是完全匹配,而是「string in string」匹配。 本頁面:https://www.freebase.com/docs/mql_extensions/.type.object.search並沒有太多解釋如何使用「搜索」擴展,它究竟做了什麼,或者我只是不能沒有正確理解。 感謝您的回覆,雖然這(使用'search_ ='):http://tinyurl.com/3wbhdg2似乎也沒有工作(結果沒有紐約市)。 – 2011-06-17 12:57:00

相關問題