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

标签 javascript api location freebase postal-code

<分区>

我有一个城市名称字段,我从中获取值(即随机格式化),例如“NEW YORK”、“new york”或“new-york”或“ny”。

有了该字段的值,我需要以这种格式向用户展示名称中具有该值的城市列表:
NY – 纽约市 – 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('') );
});

但是,查询“New York”似乎甚至不会返回“New York City”。

有没有更好的API可以满足我的需求?我在使用 Freebase API 时做错了什么吗?

更新。另一个有用的 API 可以做同样的事情(但它仍然不能满足我的需求——结果太多而且无法对它们进行分页):
文档:http://www.geonames.org/export/web-services.html
示例:http://api.geonames.org/postalCodeSearch?placename=los%20angeles&username=demo&maxRows=500

谢谢!

最佳答案

对之前的误导性回答感到抱歉。我没有注意到您使用的是 MQL 扩展“搜索”而不是“名称”属性。

主要问题是默认排序不是按搜索分数(不知道为什么,但就是这样)。修改您的查询,如 this应该解决问题:

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

排序参数按照从“search”子查询返回的“score”值降序排序。您还可以使用 mql_filter 参数进行搜索,让它甚至不考虑不满足您的约束条件的事物(效率稍微高一些)。

搜索扩展已记录 here所使用的底层搜索服务的文档是 here

关于javascript - 通过用户输入城市名称检索邮政编码的最佳 API(仅限美国)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6243077/

相关文章:

JavaScript:这可能吗?使用数组值显示数量

api - api (opensearch) 与普通 Web 界面的维基百科搜索结果不同?

android - 如何使用 AsyncTask 获取位置

android 纬度/经度格式

Android:如何使用谷歌地图在我的应用程序中显示用户当前位置?

javascript - 在?中使用多个条件:javascript中的语句

javascript - 在 JavaScript 中仅使用表达式/不使用语句是否会降低性能?

javascript - ASP.NET 用户在线状态存储

api - 是否可以通过管理/资源管理 API 为 Azure 网站启用 Always On?

api - Yii2 REST 查询