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

本文档提供了一个参考架构和示例,说明如何在 Google Cloud Platform 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. 如果您的数据大小超过 5 MB,并且更新速度不快于每小时一次,请考虑使用本文档中的 Datasets API 架构。
      1. 数据集支持的文件大小上限为 350 MB
      2. 如果您的数据大于 350MB,请考虑先在源文件中修剪或简化几何图形数据,然后再传递到数据集(请参阅下文中的“数据修剪”)。
  2. 架构和格式
    1. 确保您的数据为每个地图项都提供了全局唯一 ID 属性。借助唯一 ID,您可以选择特定地图项并为其设置样式,或者将数据与地图项联接以实现可视化,例如在“点击”用户事件中设置所选地图项的样式。
    2. 根据 Datasets API 规范,将数据格式设置为 CSVGeoJSON,并使用有效的列名称、数据类型和 GeoJSON 对象类型。
    3. 如需通过 BigQuery 轻松创建数据集,请在 SQL CSV 导出中创建一个名为 wkt 的列。数据集支持从名为 wkt 的列中以 CSV 格式导入几何图形,格式为已知文本 (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)时看到的内容不同。

示例 - 伦敦的铁路

在本例中,我们将应用参考架构,使用 GCP 和 Google 地图创建一个 Web 应用,以便通过 Open Street Map (OSM) 数据直观呈现伦敦的所有铁路。

前提条件

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

第 1 步 - 在 BigQuery 中查询数据

前往 BigQuery 公共数据集。数据集“bigquery-public-data”和表 geo_openstreetmap.planet_features 包含全球范围的 Open Street Map (OSM) 数据,包括所有可能的地图项。了解可在 OSM Wiki 中查询的所有功能,包括 amenityroadlanduse

使用 Cloud Shell 或 BigQuery Cloud 控制台(https://console.cloud.google.com) 使用 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 地理位置列在查询中返回的标准数据格式。

注意:如需在创建数据集之前直观验证查询结果,您可以使用 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 上的文件将数据上传到数据集

首先,请在您的 GCP 项目上启用 Maps Datasets API,并查看 API 文档。您可以使用 PythonNode.js 客户端库从应用后端的逻辑调用 Datasets API。此外,您还可以使用“数据集”GUI 在 Cloud 控制台中手动创建数据集。

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

数据集预览

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

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

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

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

您可以使用 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,
           }
     }
}

注意 - 请务必始终向您的地图应用添加数据集的提供方说明。如需添加 OSM 提供方说明,请遵循 OSM 准则,按照文档中的提供方说明示例操作。

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

伦敦铁路地图

接下来,您可以在 setStyle() 函数中扩展地图可视化,方法是添加用于过滤地图项的逻辑、根据用户互动添加样式,以及与应用的其余部分进行互动。

总结

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

后续操作

补充阅读材料:

贡献者

主要作者:

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