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

Posted

技术标签:

【中文标题】通过用户输入城市名称检索邮政编码的最佳 API(仅限美国)? [关闭]【英文标题】:Best API to retrieve zip code by user input city name (US only)? [closed] 【发布时间】:2011-09-08 17:48:21 【问题描述】:

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

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

效率和性能很重要。我可以使用 javascriptphp 来检索这些数据。

到目前为止,我已经尝试使用 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

谢谢!

【问题讨论】:

将城市与邮政编码相关联在英国是行不通的,它只会为您提供邮政编码的前几个字符。还有一点就是有很多地址与附近的城市没有关联,所以地址表单的城市字段不适用。 荷兰也不行。它反过来工作。如果你有邮政编码和门牌号码,你可以从中得到城市和街道。据我所知,没有开放数据库或免费 api 来使用该数据库,尽管您可以购买该数据库的许可证并获得定期更新。 我认为它不适用于任何拥有大城市的地方。在美国,即使不是很大的城镇也经常有多个邮政编码,并且在邮局中将代码块分配给“邮箱”是很常见的(不知道国际术语;安全的盒子里面有锁邮局大楼)。 虽然这些肯定是有效的,但我的雇主最初并不关心非美国地址,i18n 更多的是我自己的好奇心。我将更新问题以使其更具体。对不起! @Pointy 我不需要确切的位置,我通常需要这个才能使用其他一些基于位置的 API,不幸的是需要邮政编码——但没有必要使其 100% 准确 【参考方案1】:

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

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

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

sort 参数按“search”子查询返回的“score”值降序排序。您还可以使用 mql_filter 参数进行搜索,使其甚至不考虑不符合您的约束的事物(效率稍高一些)。

搜索扩展记录在 here 并且用于底层搜索服务的文档是 here

【讨论】:

我猜search : "new york" 不是完全匹配,而是“字符串中的字符串”匹配。这个页面:freebase.com/docs/mql_extensions/.type.object.search 并没有过多地解释如何使用“搜索”扩展程序以及它到底做了什么,或者我可能无法正确理解它。感谢您的回复,尽管这(使用 search~=):tinyurl.com/3wbhdg2 似乎也不起作用(结果中没有 NYC)。

以上是关于通过用户输入城市名称检索邮政编码的最佳 API(仅限美国)? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在地理名称和地理编码器 api 中动态生成边界框

如何使用邮政编码获取准确的城市名称?我正在使用下面的 API,但它没有给出确切的城市名称,它只给出了地区名称

我可以从仅通过城市的 Google Geocoding API 获取地理编码信息吗?

Linkedin "/people" API 返回错误的位置信息

输入城市名称并获取可能城市列表的 API? [关闭]

邮政编码/城市多对多桥接表的最佳设计