发布于: Jun 17, 2022

这是 2017 年 OpenStreetMap 美国理事会成员 Seth Fitzsimmons 的一篇特邀博文。Seth 为 Humanitarian OpenStreetMap Team、Mapzen、美国红十字会以及世界银行等客户设计创新的地理空间解决方案。

如何使用数据集管理平台与地图软件迅速获得你想要的信息呢?本文将会针对这一问题作出介绍。OpenStreetMap (OSM) 式一个免费的可编辑世界地图,由志愿者创建和维护,可依据开放许可证使用。Mapbox、Foursquare、Mapzen、世界银行、美国红十字会以及其他公司和非营利组织使用 OSM 为全世界的用户提供地图、方向指引和地理背景。

在 OSM 诞生以来的 12 年里,编辑者们创建和修改了数十亿个特征(道路或建筑物等地面实物)。支持 OSM 编辑界面的主要 PostgreSQL 数据库现已超过 2TB,包含了可追溯至 2007 年的历史数据。随着新用户加入开放地图社区,越来越多的珍贵数据不断添加到 OpenStreetMap,需要更加强大的工具、界面和方法来探索它的浩瀚数据。

本博文解释了如何使用 Amazon Athena 快速查询以 Amazon Web Services 公开数据集方式存储在 Amazon S3 中的公开 OSM 数据(每周更新)。假设您为一家非政府组织工作,希望增加对非洲地区医疗中心的了解和接触。您可能希望知道哪些医疗中心已经在地图上存在,协助编制有关周边村落的地图,以及确定在哪里进行基础设施投资可能会最为有效。

注意:如果您运行本博文中的所有查询,根据扫描的字节数,您大约需要支付 1 USD 的费用。本博文中的所有查询可以在此 GitHub gist 中找到。

作为 一个开放内容项目,正常的 OSM 数据档案通过 planet.openstreetmap.org 以不同的格式(XML、PBF)向公众开放。这包括 OSM 中当前数据状态的快照和历史存档数据。

所谓的“星球”(planet,即存档数据)用起来可能会不太顺当。因为它包含覆盖全世界的数据,单个档案的大小以 50GB 为单位。其格式也是定制,特别针对 OSM 的。数据异常丰富、有意义和有用,但由于其大小、格式和工具的原因,经常会导致甚至难以开始提出复杂的问题。

大量的 OSM 数据用户通常会下载原始数据,然后导入到他们自己的系统中,这些系统会根据用户的具体使用案例定制,例如地图渲染、驾驶导向或一般性分析。自从在 Amazon S3 中以 Apache ORC 格式提供 OSM 数据后,无需下载数据即可在 Athena 中查询数据。

您可以将 Athena 与通过 OSM on Amazon Web Services 公开提供的数据结合使用。您无需了解如何安装、配置和运行自己的服务器实例,也无需完成将数据下载并转换为可查询格式的多个步骤。在 Amazon Web Services 以及合作伙伴的努力下,S3 上托管了一个会定期更新的“星球”文件副本(在 OSM 每周推送计划后几小时内即可用),它采用的格式支持使用 Athena 进行高效率的查询。

使用 Athena 提问涉及将此 OSM 星球文件注册为一个表以及进行 SQL 查询。一切搞定。无需任何下载,无需任何配置,也无需提取任何数据。Athena 会发布您的查询并在几秒钟内返回答案,即使查询超过 9 年的数十亿 OSM 元素也能达到此性能水平。

一切都由您控制。S3 提供极高的数据可用性,Athena 按照您扫描的数据 TB 数向您收费。此外,我们将 OSM 的定制格式转码为 ORC,从而尽可能降低扫描费用。所有将数据转换为高度可查询的格式并使其公开可用的繁重工作都已解决,您只需提出问题即可。

OSM 公开数据集由三个表组成:

  • planet
    其中包含 OSM 中所存在所有元素的当前版本。
  • planet_history
    其中包含所有元素所有版本的历史记录(甚至包含已经删除的版本)。
  • hangesets
    包含记录了元素更改(并且与 planet 和 planet_history 文件之间存在外键关系)的更改集的信息。

要在您的 Amazon Web Services 账户中注册 OSM 公开数据集,以便您能够进行查询,请打开 Athena 控制台(请务必使用 us-east-1 区域),然后粘贴并执行如下表定义:

CREATE EXTERNAL TABLE planet (
  id BIGINT,
  type STRING,
  tags MAP<STRING,STRING>,
  lat DECIMAL(9,7),
  lon DECIMAL(10,7),
  nds ARRAY<STRUCT<ref: BIGINT>>,
  members ARRAY<STRUCT<type: STRING, ref: BIGINT, role: STRING>>,
  changeset BIGINT,
  timestamp TIMESTAMP,
  uid BIGINT,
  user STRING,
  version BIGINT)
STORED AS ORCFILE
LOCATION 's3://osm-pds/planet/';
CREATE EXTERNAL TABLE planet_history (
    id BIGINT,
    type STRING,
    tags MAP<STRING,STRING>,
    lat DECIMAL(9,7),
    lon DECIMAL(10,7),
    nds ARRAY<STRUCT<ref: BIGINT>>,
    members ARRAY<STRUCT<type: STRING, ref: BIGINT, role: STRING>>,
    changeset BIGINT,
    timestamp TIMESTAMP,
    uid BIGINT,
    user STRING,
    version BIGINT,
    visible BOOLEAN)
STORED AS ORCFILE
LOCATION 's3://osm-pds/planet-history/';
CREATE EXTERNAL TABLE changesets (
    id BIGINT,
    tags MAP<STRING,STRING>,
    created_at TIMESTAMP,
    open BOOLEAN,
    closed_at TIMESTAMP,
    comments_count BIGINT,
    min_lat DECIMAL(9,7),
    max_lat DECIMAL(9,7),
    min_lon DECIMAL(10,7),
    max_lon DECIMAL(10,7),
    num_changes BIGINT,
    uid BIGINT,
    user STRING)
STORED AS ORCFILE
LOCATION 's3://osm-pds/changesets/';

那么在幕后发生了哪些事情才让您可以轻松使用? 简而言之,数据从 OSM PBF 格式转码为 Apache ORC 格式。

有一个 Amazon Web Services Lambda 函数(通过 CloudWatch Events 触发,每 15 分钟运行一次)会关注 planet.openstreetmap.org,以检查是否有每周更新(使用 rsync 功能)。如果该函数检测到有新版本可用,则它会提交一组 Amazon Web Services Batch 作业,以将该版本镜像、转码并设置为“最新”版本。此函数的代码可在 osm-pds-pipelines GitHub 存储库获取。

为便于将数据转码为适合 Athena 的格式,我们开发了一个开源工具 OSM2ORC。此工具还包含一个 Osmosis 插件,您可以使用此插件来处理复杂筛选管道。此工具会输出一个 ORC 文件,您可以将此文件上传到 S3 中以便使用 Athena,也可在本地保存以便使用来自 Hadoop 生态系统的其他工具。

相关文章