使用 BigQuery 和 Datasets API 直观呈现数据

本文档提供了一个参考架构和示例,用于使用 Google Cloud BigQueryGoogle Maps Platform Datasets API 中的位置数据创建地图 数据可视化效果,例如 分析开放的市政数据、创建电信覆盖范围地图或 直观呈现移动车辆车队移动轨迹。

地图数据可视化效果是一种强大的工具,可吸引用户并揭示位置数据中的空间 洞见。位置数据是具有点、线或 多边形特征的数据。例如,天气地图可帮助消费者了解和规划 行程并为暴风雨做好准备;商业智能地图可帮助用户从数据分析中揭示 洞见,而电信地图可帮助用户 了解其提供商在给定服务区域内的覆盖范围和质量。

不过,应用开发者很难制作出性能良好且提供出色用户体验的大型地图数据可视化效果 。大型数据必须在客户端加载到内存中,导致首次地图加载时间较长。可视化效果 必须在所有设备(包括具有 内存和 GPU 限制的低端手机)上都能正常运行。最后,开发者需要选择一个可移植、可靠且性能良好(适用于大型数据)的大型数据 渲染库。

参考架构

开发具有大型数据可视化效果的应用需要两个主要组件。

  1. 客户后端 - 所有后端应用数据和服务,例如处理和存储。
  2. 客户客户端 - 您的应用界面,其中包含地图可视化组件。

下图是一个系统图,展示了这两个组件如何与应用 用户、Google Cloud 和 Google Maps Platform 进行交互,以创建大型数据 可视化应用。

架构图

设计考虑事项

如需使用 Google Cloud 和 Google Maps Platform 创建性能良好的 数据可视化效果,需要遵循一些设计考虑事项。

  1. 源数据大小和更新频率
    1. 如果 geojson 格式的源数据小于 5MB 或更新频率非常高(例如实时天气雷达预报),请考虑在应用中以 geojson 对象的形式在客户端提供数据,并使用 deck.gl 图层进行渲染。
    2. 如果您的数据大小超过 5MB 且更新频率不高于每小时一次,请考虑本文档中的 Datasets API 架构。
      1. Datasets 支持的文件大小上限为 350MB
      2. 如果您的数据大于 350MB,请考虑在传递给 Datasets 之前剪除或简化源文件中的几何图形数据(请参阅下面的数据剪除)。
  2. 架构和格式
    1. 确保您的数据为每个特征都有一个全局唯一的 ID 属性。借助唯一 ID,您可以选择特定特征并设置其样式,或者将数据与特征联接以进行可视化,例如在“点击”用户事件中设置所选特征的样式。
    2. 根据 Datasets API 规范,将数据格式设置为 CSVGeoJSON,并使用有效的列名称、数据类型和 GeoJSON 对象类型。
    3. 如需轻松地从 BigQuery 创建 Datasets,请在 SQL CSV 导出中创建一个名为 wkt 的列。Datasets 支持 从 CSV 导入几何图形已知文本 (WKT) 格式从名为 wkt 的列中。
    4. 检查您的数据是否为有效的几何图形和数据类型。例如,GeoJSON 必须采用 WGS84 坐标系、几何图形缠绕顺序等。
    5. 使用 geojson-validate 等工具确保源文件中的所有几何图形都有效,或者使用 ogr2ogr 在格式或坐标系之间转换源文件。
  3. 数据剪除
    1. 尽量减少特征的属性数量。您可以在运行时使用唯一标识符键(示例)将其他属性联接到特征。
    2. 尽可能对属性对象使用整数数据类型,以最大限度地减少图块存储空间,并保持图块在客户端应用中通过 HTTPS 加载时的性能。
    3. 简化和/或汇总非常复杂的特征几何图形;考虑对复杂的面几何图形使用 ST_Simplify 等 BigQuery 函数,以减小源文件大小并提高地图性能。
  4. 平铺
    1. Google Maps Datasets API 会根据您的源数据文件创建地图图块,以供 Web 或移动 Maps SDK 使用。
    2. 地图图块是一种基于缩放的索引系统,可提供更高效的方式将数据加载到可视化应用中。
    3. 地图图块可能会在较低的缩放级别丢弃密集或复杂的特征。当用户缩小到州或国家/地区(例如 z5-z12)时,地图可能与放大到城市或社区(例如 z13-z18)时看起来不同。

示例 - 伦敦的铁路

在此示例中,我们将应用参考架构,使用 Google Cloud 和 Google 地图创建一个 Web 应用,该应用可直观呈现来自Open Street Map (OSM) 数据的所有伦敦铁路。

前提条件

  1. 有权访问 BigQuery 沙盒Cloud 控制台
  2. 确保您已设置 Google Cloud 项目和结算账号。

第 1 步 - 在 BigQuery 中查询数据

前往 BigQuery 公开 数据集。数据集 “bigquery-public-data”和表 geo_openstreetmap.planet_features 包含 整个地球的 Open Street Map (OSM) 数据,包括所有可能的特征。在 OSM Wiki 中发现所有可查询的 特征,包括 amenityroadlanduse

使用 Cloud ShellBigQuery Cloud Console,使用 SQL 查询表。以下 代码段使用 bq query 命令查询所有铁路,并使用边界 框和 ST_Intersects() 函数将其过滤为仅限伦敦。

如需从 Cloud Shell 执行此查询,请运行以下代码段,并为您的环境更新 项目 ID、数据集和表名称。

bq query --use_legacy_sql=false \
--destination_table PROJECTID:DATASET.TABLENAME \
--replace \
'SELECT
osm_id, 
feature_type,
(SELECT value
         FROM   unnest(all_tags)
         WHERE  KEY = "name") AS name,
(SELECT value
         FROM   unnest(all_tags)
         WHERE  KEY = "railway") AS railway,
geometry as wkt
FROM   bigquery-public-data.geo_openstreetmap.planet_features
WHERE ("railway") IN (SELECT key FROM unnest(all_tags)) 
    AND ST_Intersects(
    geometry,
ST_MakePolygon(ST_MakeLine(
      [ST_GeogPoint(-0.549370, 51.725346),
      ST_GeogPoint(-0.549370, 51.2529407),
      ST_GeogPoint(0.3110581, 51.25294),
      ST_GeogPoint(0.3110581, 51.725346),
      ST_GeogPoint(-0.549370, 51.725346)]
    ))
   )'

查询返回:

  1. 每个特征的唯一标识符 osm_id
  2. feature_type,例如点、线等
  3. 特征的 name,例如 Paddington Station
  4. railway 类型,例如主要、旅游、军事等
  5. 特征的 wkt - WKT 格式的点、线或多边形几何图形。WKT 是 BigQuery Geography 列在查询中返回的标准数据格式。

注意 - 如需在创建数据集之前直观验证查询结果,您可以使用 Looker Studio 从 BigQuery 快速直观呈现信息中心内的数据。

如需将表导出到 Google Cloud Storage 存储分区中的 CSV 文件,请在 Cloud Shell 中使用 bq extract 命令:

bq extract \
--destination_format "CSV" \
--field_delimiter "," \
--print_header=true \
PROJECTID:DATASET.TABLENAME \
gs://BUCKET/FILENAME.csv

注意: 您可以使用 Cloud Scheduler 自动执行每个步骤,以定期更新数据。

第 2 步 - 从 CSV 文件创建数据集

接下来,根据 Google Cloud Storage (GCS) 上的查询输出创建 Google Maps Platform 数据集。使用 Datasets API,您可以 创建数据集,然后 从 GCS 上托管的文件将数据上传到数据集

如需开始使用,请在 Google Cloud 项目中启用 Maps Datasets API ,并查看API 文档。您可以使用 PythonNode.js 客户端库从应用后端的逻辑调用 Datasets API。 此外,您还可以使用 Datasets GUI 在 Cloud 控制台中手动创建 Datasets。

数据集上传完成后,您可以在 Datasets GUI 中预览数据集。

数据集预览

第 4 步 - 将数据集与地图 ID 相关联

创建数据集后,您可以创建地图 ID ,并关联地图样式。在地图样式编辑器中,您可以将 mapId 和样式与数据集相关联。您还可以在此处应用 云端地图 样式设置 ,以自定义地图的外观。

第 5 步 - 创建客户端应用地图可视化效果

最后,您可以使用 Maps JS API将数据集添加到客户端数据可视化应用。 使用上一步中与数据集关联的 mapID 初始化地图对象。然后,设置数据集图层的样式和互动性。如需了解详情,请参阅数据集的数据驱动型样式完整指南。

您可以使用 Maps JS API 自定义样式、添加事件处理程序以动态更改样式 等。请参阅 文档中的示例。 下面,我们将定义 setStyle 函数,以根据属性“feature_type”为此示例创建点和线特征 样式。

function setStyle(params) {
  const map.getDatasetFeatureLayer("your-dataset-id");
  const datasetFeature = params.feature;
  const type = datasetFeature.datasetAttributes["feature_type"];
if (type == "lines") {
           return {
             fillColor: "blue",
             strokeColor: "blue",
             fillOpacity: 0.5,
             strokeWeight: 1,
           }
         } else if (type == "points") {
           return {
             fillColor: "black",
             strokeColor: "black",
             strokeOpacity: 0.5,
             pointRadius: 2,
             fillOpacity: 0.5,
             strokeWeight: 1,
           }
     }
}

在单页 Web 应用中初始化后,上述代码会生成以下 地图数据可视化效果:

伦敦铁路地图

从这里开始,您可以在 setStyle() 函数中扩展地图可视化效果,方法是 添加逻辑来过滤特征、根据用户互动添加样式,以及 与应用的其余部分互动。

总结

在本文档中,我们讨论了使用 Google Cloud 和 Google Maps Platform 的大型数据可视化应用的参考架构和示例 实现。使用此参考架构,您可以根据 Google Cloud BigQuery 中的任何数据创建位置 数据可视化应用,这些应用在使用 Google Maps Datasets API 的任何设备上都能 正常运行。

后续操作

补充阅读材料:

贡献者

主要作者:

  • Ryan Baumann,Google Maps Platform 解决方案工程经理