BigQuery と Datasets API によるデータの可視化

このドキュメントでは、Google Cloud Platform BigQueryGoogle Maps Platform Datasets API で位置情報を使用して地図データを可視化するためのリファレンス アーキテクチャと例(自治体公開データの分析、通信範囲マップの作成、モバイル車両の移動のトレースの可視化など)について説明します。

地図データの可視化は、ユーザーを引き付け、位置情報の空間分析情報を明らかにするための優れたツールです。位置情報は、ポイント、ライン、ポリゴンの対象物を含むデータです。たとえば、気象マップは、消費者が移動を理解して計画し、暴風雨に備えるために役立ちます。ビジネス インテリジェンス マップは、データ分析から分析情報を得るのに役立ち、通信マップは、ユーザーが特定のサービス提供地域におけるプロバイダの対応範囲と品質を把握するのに役立ちます。

しかし、アプリ デベロッパーにとって、大規模な地図データを可視化し、高いパフォーマンスと優れたユーザー エクスペリエンスを提供するのは困難です。大きなデータはクライアント側でメモリに読み込む必要があるため、最初の地図の読み込みに時間がかかります。メモリと GPU の制約があるローエンドのスマートフォンを含む、すべてのデバイスで優れたパフォーマンスを表示する必要があります。最後に、デベロッパーは、ポータブルで信頼性が高く、大量のデータに対して高いパフォーマンスを発揮する大規模なデータ レンダリング ライブラリを選択する必要があります。

リファレンス アーキテクチャ

大規模なデータを可視化するアプリの開発には、2 つの主要コンポーネントが必要です。

  1. 顧客のバックエンド - 処理やストレージなど、すべてのバックエンド アプリのデータとサービス。
  2. お客様のクライアント - 地図の可視化コンポーネントを含むアプリのユーザー インターフェース。

以下のシステム図は、これら 2 つのコンポーネントがアプリユーザーである Google Cloud および Google Maps Platform とやり取りして、大規模なデータ可視化アプリを作成する方法を示すシステム図です。

アーキテクチャ図

⭐ 注: Maps Datasets API一般提供前のプロダクトです。詳しくは、利用規約をご覧ください。

設計上の考慮事項

Google Cloud と Google Maps Platform を使用してパフォーマンスの高いデータを可視化するには、設計上の考慮事項がいくつかあります。

  1. ソースデータサイズと更新頻度
    1. Geojson 形式のソースデータが 5 MB 未満の場合や、気象レーダーのライブ予報など、非常に頻繁に更新される場合は、アプリでデータを GeoJSON オブジェクトとしてクライアントサイドで提供し、deck.gl レイヤでレンダリングすることを検討してください。
    2. データのサイズが 5 MB を超え、更新頻度が 1 時間に 1 回を超える場合は、このドキュメントの Datasets API アーキテクチャを検討してください。
      1. データセットは最大 350 MB のファイルをサポートします。
      2. データが 350 MB を超える場合は、データセットに渡す前に、ソースファイル内のジオメトリ データをプルーニングまたは簡素化することを検討してください(後述の「データのプルーニング」を参照)。
  2. スキーマと形式
    1. データに、特徴ごとにグローバルに一意の ID プロパティがあることを確認します。一意の ID を使用すると、特定の対象物を選択してスタイル設定したり、データを対象物に結合して可視化したりできます(たとえば、「クリック」ユーザー イベントで選択した対象物のスタイルを設定するなど)。
    2. Datasets API 仕様に従って、有効な列名、データ型、GeoJSON オブジェクトの型を使用して、データを CSV または GeoJSON としてフォーマットします。
    3. BigQuery からデータセットを簡単に作成できるように、SQL CSV エクスポートに wkt という名前の列を作成します。データセットでは、wkt という名前の列から、Well-Known Text(WKT)形式の CSV からジオメトリをインポートできます。
    4. データのジオメトリとデータ型が有効であることを確認してください。たとえば、GeoJSON は WGS84 座標系、ジオメトリのワインディング順序などでなければならない
    5. geojson-validate などのツールを使用してソースファイル内のすべてのジオメトリが有効であることを確認するか、ogr2ogr を使用してソースファイルの形式または座標系間でソースファイルを変換します。
  3. データのプルーニング
    1. 特徴のプロパティ数を最小限に抑える。実行時に、一意の ID キーに基づいて追加のプロパティを機能に結合できます()。
    2. 可能であれば、プロパティ オブジェクトで整数データ型を使用してタイルの保存容量を最小限に抑え、クライアント アプリでの HTTPS での読み込みのパフォーマンスを維持します。
    3. 非常に複雑な対象物ジオメトリを簡素化または集約します。複雑なポリゴン ジオメトリに ST_Simplify のような BigQuery 関数を使用し、ソースファイルのサイズを小さくして地図のパフォーマンスを高めることを検討してください。
  4. タイリング
    1. Google Maps Datasets API は、Maps JS API で使用する地図タイルをソースデータ ファイルから作成します。
    2. Map Tiles はズームベースのインデックス システムであり、ビジュアル アプリにデータをより効率的に読み込むことができます。
    3. ズームレベルが低いと、高密度の対象物や複雑な対象物が地図タイルにドロップされることがあります。州や国(例: z5-z12)にズームアウトしたときの表示は、都市やその近隣(z13-z18 など)にズームインしたときの表示とは異なります。

例 - ロンドンの鉄道

この例では、リファレンス アーキテクチャを適用して、GCP と Google マップでOpen Street Map(OSM)データからロンドンのすべての鉄道を可視化するウェブ アプリケーションを作成します。

前提条件

  1. BigQuery サンドボックスCloud コンソールへのアクセス
  2. GCP プロジェクトと請求先アカウントが設定されていることを確認します。

ステップ 1 - BigQuery でデータにクエリを実行する

[BigQuery の一般公開データセット] に移動します。データセット「bigquery-public-data」とテーブル geo_openstreetmap.planet_features には、利用可能なすべての対象物を含む地球全体の Open Street Map(OSM)データが含まれています。amenityroadlanduse など、クエリで使用可能なすべての機能については、OSM Wiki をご覧ください。

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 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 でホストされているファイルからデータセットにデータをアップロードできます。

開始するには、GCP プロジェクトで Maps Datasets API を有効化し、API ドキュメントをご確認ください。アプリ バックエンドのロジックから Datasets API を呼び出すための PythonNode.js のクライアント ライブラリが用意されています。また、Cloud コンソールでデータセットを手動で作成するためのデータセット GUI もあります。

データセットのアップロードが完了したら、データセット GUI でデータセットをプレビューできます。

データセットのプレビュー

ステップ 4 - データセットをマップ ID に関連付ける

データセットを作成したら、関連する地図のスタイルとマップ ID を作成できます。地図のスタイル エディタで、mapId とスタイルをデータセットに関連付けることができます。ここでは、Cloud ベースのマップのスタイル設定を適用して、地図の外観をカスタマイズすることもできます。

ステップ 5 - クライアント アプリの地図可視化データを作成する

最後に、Maps JS API を使用して、クライアントサイドのデータ可視化アプリにデータセットを追加します。前の手順のデータセットに関連付けられた mapID を使用して、地図オブジェクトを初期化します。次に、データセット レイヤのスタイルとインタラクティビティを設定します。詳しくは、データセットを使用したデータドリブンのスタイル設定に関するガイドをご覧ください。

Maps JS API を使用すると、スタイルのカスタマイズや、スタイルを動的に変更するためのイベント ハンドラの追加などを行えます。docsの例をご覧ください。以下で、setStyle 関数を定義して、[feature_type] 属性に基づいてこの例の点と線の対象物スタイルを作成します。

注 - Maps JS API の実装には、必ず v=beta チャンネルを使用してください。

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 ガイドラインに準拠したドキュメント内のアトリビューションのサンプルコードに従ってください。

上記のこのコードを単一ページのウェブアプリで初期化すると、次のような地図データが得られます。

ロンドン鉄道の地図

ここから、対象物をフィルタリングするロジックを追加し、ユーザー操作に応じたスタイルを追加して、アプリケーションの他の部分を操作することで、setStyle() 関数で地図の可視化を拡張できます。

おわりに

この記事では、Google Cloud と Google Maps Platform を使用した大規模なデータ可視化アプリケーションのリファレンス アーキテクチャと実装例について説明しました。このリファレンス アーキテクチャを使用すると、Google Maps Datasets API を使用して、あらゆるデバイスでパフォーマンスを発揮する GCP BigQuery 内のデータから位置情報可視化アプリを作成できます。

次のアクション

その他の情報:

協力者

主要な著者:

  • Google Maps Platform ソリューション エンジニアリング マネージャー Ryan Baumann