Javascript 通过用户输入城市名称检索邮政编码的最佳API(仅限美国)?

Javascript 通过用户输入城市名称检索邮政编码的最佳API(仅限美国)?,javascript,api,location,freebase,postal-code,Javascript,Api,Location,Freebase,Postal Code,我有一个从中获取值的城市名称字段(即随机格式化),例如“纽约”、“纽约”或“纽约”或“纽约” 有了该字段的值,我需要以以下格式向用户提供名称中包含该值的城市列表: 纽约-纽约市-10001 明尼苏达州–纽约磨坊–56567 效率和性能非常重要。我可以使用JavaScript或PHP来检索这些数据 到目前为止,我已经尝试使用Freebase API。下面是我使用的一个查询示例: 下面是我正在使用的JavaScript代码: // App.q contains city name field's v

我有一个从中获取值的城市名称字段(即随机格式化),例如“纽约”、“纽约”或“纽约”或“纽约”

有了该字段的值,我需要以以下格式向用户提供名称中包含该值的城市列表:
纽约-纽约市-10001
明尼苏达州–纽约磨坊–56567

效率和性能非常重要。我可以使用JavaScript或PHP来检索这些数据

到目前为止,我已经尝试使用Freebase API。下面是我使用的一个查询示例:

下面是我正在使用的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('') );
});
//App.q包含城市名称字段的值
变量查询={
扩展:1,
查询:[{
搜索:App.q,
类型:'/location/citytown',
id:null,
名称:空,
邮政编码:[],
“/location/location/containedby”:[{
“类型”:“/位置/美国州”,
“名称”:空,
//国家的两个字母缩写
“/common/topic/alias”:[]
}]
}]
},
url='1〕http://www.freebase.com/api/service/mqlread?callback=?&query=' + 
encodeURIComponent(JSON.stringify(query));
$.getJSON(url、函数(数据){
var cities,i,len,name,别名,j,abbr,邮政编码,HTML=[];
对于(i=0,len=data.result.length;i=0;j-=1){
if(别名[j].length==2&&aliases[j]==aliases[j].toUpperCase()){
abbr=别名[j];
}
}
push(D.renderHTML(liTemplate{
姓名:姓名,,
缩写:缩写,
邮政编码:邮政编码
}) );
}
console.log(HTML.join(“”));
});
然而,查询“纽约”似乎甚至不会返回“纽约市”

有更好的API满足我的需要吗?我对Freebase API做了什么错误吗

UPD。另一个有用的API,允许做同样的事情(但它仍然不能满足我的需求——结果太多,无法分页):
文档:
例如:


谢谢

很抱歉前面的回答有误导性。我没有注意到您使用的是MQL扩展名“search”而不是“name”属性

主要的问题是,默认的排序不是按搜索分数排序的(不确定原因,但事实就是这样)。像这样修改查询应该可以解决问题:

"search":       {"query":"New York","score":null,"type_strict":"all"},
"sort":"-search.score",
"type":"/location/citytown",
sort参数按“search”子查询返回的“score”值降序排序。您也可以使用MQLYFLASH筛选器参数来搜索它,甚至不考虑不能满足约束的情况(稍微有效率)。
搜索扩展是有文档记录的,并且将城市与邮政编码关联起来的基础搜索服务的文档在英国不起作用,它只会提供代码的前几个字符。另一点是,有许多地址与附近的城市没有关联,因此地址表单的城市字段不适用。荷兰也不适用。它的工作原理正好相反。如果你有一个邮政编码和一个门牌号,你可以从中得到城市和街道。据我所知,没有开放数据库或免费api来使用该数据库,尽管你可以购买该数据库的许可证并定期更新。我认为这对任何有大城市的地方都不管用。在美国,即使不是很大的城镇也经常有多个邮政编码,而且在邮局里,将代码块分配给“邮箱”是很常见的(不知道国际术语;在邮局大楼里用锁固定邮箱)。虽然这些都是有效的点,但我的雇主最初并不关心非美国地址,i18n更多的是我自己的好奇心。我会更新这个问题,让它更具体。对不起@Pointy我不需要精确的位置,我通常需要这个来使用其他基于位置的API,不幸的是,这需要邮政编码–但不需要100%准确。我猜
搜索:“纽约”
不是精确匹配,而是“字符串中的字符串”匹配。这一页:没有太多解释如何使用“搜索”扩展,它到底做什么,或者我只是不能正确理解它。感谢您的回复,尽管这(使用
搜索~=
):似乎也不起作用(结果中没有纽约市)。