3

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

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

4

1 回答 1

8

我在这里提交了一个不完整的解决方案,既是为了解决手头的 IATA-to-Contry-Code 问题,也是为了引起人们对结构化内容可能未被充分利用的资源的关注:我说的是Freebase

这是不完整的,因为并非所有 IATA 代码都包括在内(尽管我猜测覆盖率相对较高)或并非所有都分配了国家代码(唉,这是一种更常见的情况)。

我想推荐的 API 是Freebase MQL 读取服务
这项免费服务的工作原理是发送一个带有参数的 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"
    }
  ]
}


通过深入研究 Freebase/aviation/airport类型并使用我在下面简要描述的各种工具,这个解决方案在大约 30 分钟内被“搅起” 。

请注意,这是一种通用方法,适用于各种查询:例如,我们可以获取 1950 年之前建造的跨度超过 500 英尺的桥梁列表,而不是将 IATA 机场代码与 ISO 国家代码匹配,或者查找出生在特定城市的著名音乐家等。此外,AFAIK、Freebase API 和信息是免费提供的。但是请注意,与从专业来源获得的内容相比,在 Freebase 上找到的内容存在一些限制(和一些优势!)。
从 Freebase 获得的信息可能不如通过 API 和从专业来源获得的数据提取获得的信息那样权威、完整或最新。这种限制说明了在 Freebase 以协作的、类似维基的方式收集的信息的准普遍广度,由一个主要是志愿者的工作组,与由各种行业的付费专业人士进行的集中的、通常是单一目的的信息收集相比国际航空运输协会或国际海事组织 (IMO) 等组织。另一方面,Freebase 凭借其数据的语义表示,提供了以强大的方式连接信息位的方法。由于权威来源主要提供“表格”数据,Freebase 查询可以匹配明显不相关的信息片段。例如,

但是足够的披露,让我们看看如何产生这些查询

  • 首先仔细阅读Freebase上所需的项目类型,以熟悉该站点在该领域提供的内容,并对此类项目可用信息的广度和深度有一个非正式的“感觉”。
    例如,可以查看为Freebase 上的Airport Type找到的各种机场实例
  • 一旦确定了所需项目的类型,就可以查看它们的模式(许多方法可以到达那里,例如页面底部的链接)
    这是我们的机场类型示例的模式。
  • 该模式显示为给定类型收集了哪些信息字段。但是请注意,虽然架构可能相对完整和详尽,但相应类型的各个实例可能并非都正确填写了这些字段:通过对实例的临时审查或实例列表进行非正式验证,如下所述。
  • 返回到实例列表视图并通过添加和删除列来修改此视图。这分别通过列表左上角的橙色“+”按钮和每个列标题旁边的小“x”按钮来完成。
    查看“添加新列”部分中显示的树(在按下“+”后显示)如何允许深入了解我们开始使用的类型或与之连接的类型的模式。
    在机场的情况下,我迅速删除了“图片”、“文章”和“航空公司”相关的字段,腾出空间,并添加了 IATA 代码,并在“位置”中钻取以找到国家,然后从那里ISO 代码。这种与“国家”的联系有点棘手,我不得不查看“包含者”
  • 一旦您有了一个包含所需字段的表格列表,并且可能还有一些用于审查目的的额外字段,您可以通过在“使用此集合中的数据”中选择“MQL”链接来导出相应的 MQL 代码,在页面底部。这会弹出一个窗口,您可以在其中复制 MQL 代码段,尽管继续进入查询编辑器可能会更好。(您可能仍需要复制 MQL 代码并将其粘贴回编辑器,因为应用程序的一个错误在按下“在查询编辑器中查看”按钮时不会带来该 MQL)
  • 查询编辑器提供了一种方便的方式来调整这个初始/默认查询并对其进行测试。您可能需要熟悉MQL 语言,它通常比较直观。
  • 当查询准确生成我们需要的内容时,是时候将其设置为“单线”(编辑器屏幕底部的格式化方便按钮),然后可以在 Freebase MQL 读取服务的 URL 中使用它(参见示例这个答案的顶部)。
  • 更多的测试和调整(例如,在将字符串复制/编辑到 URL 时,偶尔会遇到由拼写错误引入的 JSON 语法错误)等等……瞧!
  • 实际上,使用 Freebase 可以完成更多工作,例如使用Google 客户端库来促进与 MQL 服务的集成。

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

于 2012-10-28T01:18:00.413 回答