2011-06-05 78 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

相关问题