IATA到国家API

时间:2012-10-27 20:59:36

标签: api

我正在开发一款需要根据IATA代码(http://en.wikipedia.org/wiki/IATA_airport_code)查找国家/地区代码(ISO-3166 alpha2)的应用。

是否有(最好是免费的)API?

1 个答案:

答案 0 :(得分:8)

我在这里提交的是一个不完整的解决方案,既可以解决手头的IATA-to-Contry-Code问题,又可以关注结构化内容可能未被充分利用的资源:I'我在谈论Freebase

这并不完整,因为并非所有IATA代码都包含在内(虽然我猜测的覆盖范围相对较高)或者并非所有IATA代码都分配了国家代码(唉更常见)。

我想建议的API是Freebase MQL Read Service 此免费服务通过发送带有参数的HTTPS请求,该参数以MQL(Metaweb查询语言)表示查询,并接收具有所需结果的JSON对象。

特别是请求看起来像

https://www.googleapis.com/freebase/v1/mqlread?indent=2&query=[{"type":"/aviation/airport","id":null,"limit": 25,"name":null,"sort":"name","iata": "SFO", "/location/location/containedby": [{"limit":6,"name":null,"optional": true,"sort":"name","/location/country/iso3166_1_alpha2": [{ "limit":6, "optional": false, "sort":"value", "value":null}]}],"airport_type": [{"limit":3,"name":null,"optional": true,"sort":"name","type":"/aviation/airport_type"}]}]
                                                                                                                                                    ^---  here place the IATA code

为了便于阅读我在多行显示相应的MQL缩进;同样的事情只有更好的布局。

[{
  "type":  "/aviation/airport",
  "id":    null,
  "limit": 25,
  "name":  null,
  "sort":  "name",

  "iata": "SFO",     -- <<< that's where you place the desired IATA code

  "/location/location/containedby": [{
    "limit":    6,
    "name":     null,
    "optional": true,
    "sort":     "name",
    "/location/country/iso3166_1_alpha2": [{
      "limit":    6,
      "optional": false,
      "sort":     "value",
      "value":    null
    }]
  }],
  "airport_type": [{
    "limit":    3,
    "name":     null,
    "optional": true,
    "sort":     "name",
    "type":     "/aviation/airport_type"
  }]
}]​

响应如下:

{
  "result": [
    {
      "name": "San Francisco International Airport", 
      "iata": "SFO", 
      "/location/location/containedby": [
        {
          "name": "United States of America", 
          "/location/country/iso3166_1_alpha2": [
            {
              "value": "US"
            }
          ]
        }
      ], 
      "airport_type": [
        {
          "type": "/aviation/airport_type", 
          "name": "Public"
        }
      ], 
      "type": "/aviation/airport", 
      "id": "/en/san_francisco_international_airport"
    }
  ]
}


这个解决方案是#34;鞭打&#34;通过钻入Freebase /aviation/airport类型并使用我在下面简要描述的各种工具,大约30分钟

请注意这是一种通用方法,适用于各种查询:例如,我们可以获取1950年之前构建的桥梁列表,而不是将IATA机场代码与ISO国家/地区代码相匹配。超过500英尺的跨度,或查找在特定城市出生的着名音乐家等。此外,AFAIK,Freebase API和信息是免费提供的。但请注意,与从专业来源获得的内容相比,Freebase中的内容存在一些限制(以及一些优势!)。 从Freebase获得的信息可能不如使用来自专业来源的API和数据提取获得的信息具有权威性,完整性或最新性。这种限制说明了Freebase以协作的,类似wiki的方式,通过大多数志愿者工作组收集的信息的准普遍广度,与付费专业人员在各种交易中进行的重点,通常是单一目的的信息收集相比较像IATA或国际海事组织(IMO)这样的组织。另一方面,Freebase以其数据的语义表示,提供了以强大的方式连接信息的方法。因此权威来源主要提供&#34;表格&#34;数据,Freebase查询可以匹配明显不相关的信息。例如,国际海事组织可能会制作年度吨位,码头数量等的海港名单,Freebase也可以找到在这些港口拍摄的电影或出生在那里的着名作家。

但对于披露而言,让我们看看如何产生这些疑问

  • 首先仔细阅读Freebase上所需的项目,熟悉该网站在该区域提供的内容,并获得非正式的感受&#34;了解此类物品可用信息的广度和深度 例如,可以查看为Airport Type on Freebase
  • 找到的各种机场实例
  • 一旦确定了所需物品的类型,就可以查看他们的架构(很多方式到达那里,例如页面底部的链接)
    这是我们Airport Type示例的架构。
  • 架构显示为给定类型收集的信息字段。但请注意,虽然架构可以相对完整和精细,但相应类型的各个实例可能并非都填写了这些字段:使用 ad hoc 对实例的审核或使用列表进行非正式验证实例如下所述。
  • 返回实例列表视图,并通过添加和删除列来修改此视图。分别使用橙色&#34; +&#34;列表左上角的按钮和小的&#34; x&#34;每个列标题旁边的按钮 查看&#34;添加新列&#34;中显示的树的方式;部分(在按下&#34; +&#34;后显示)允许向下钻取我们开始使用的类型或与其连接的类型的模式。
    就机场而言,我很快删除了&#34;图像&#34;,&#34;文章&#34;以及&#34;航空公司和相关领域,以腾出空间,并添加IATA代码,并在&#34;位置&#34;找到国家和那里的ISO代码。这与国家&#34;的联系;有点棘手,我不得不调查&#34;包含&#34;这本身就是另一个&#34;位置&#34;并使用&#34;更多&#34;提起了#34;国家&#34;类型。
  • 一旦您有一个表格列表,包含所需的字段,并且可能还有一些额外的字段用于审核目的,您可以通过选择&#34; MQL&#34;来导出相应的MQL代码。链接在页面底部的#34;使用此集合中的数据&#34;。这会弹出一个窗口,您可以在其中复制MQL片段,尽管最好继续Query Editor。 (您可能仍需要复制MQL代码并将其粘贴回编辑器,因为应用程序的错误在按下&#34;查询编辑器中的查看&#34;按钮时没有带来MQL
  • 查询编辑器提供了一种调整此初始/默认查询并对其进行测试的便捷方法。您可能需要熟悉MQL language,它通常非常直观。
  • 当查询准确地生成我们需要的内容时,是时候将其作为一个&#34; One-liner&#34; (编辑器屏幕底部的格式化便利按钮),然后可以在Freebase MQL Read服务的URL中使用(参见本答案顶部的示例)。
  • 进行更多测试和调整(例如,在将字符串复制/编辑到URL时,通过拼写错误偶尔会引入JSON语法错误等等)... ... Voila!
  • 使用Freebase实际上还有很多工作要做,例如使用Google Client Library来促进与MQL服务的集成。

我想完成以下建议:有时可以下载完整列表并使用它创建本地数据库,而不是将此在线API集成到您的应用程序中。 。以这种方式,可以通过添加行和/或填充空列来补充数据。这种方法特别适用于IATA /机场示例 - 在所有机场列表及其基础代码相对较小且不经常变化之后。当然,这种方法可能需要刷新本地数据库并偶尔进行维护,但它不需要与Freebase建立在线实时连接。