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

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

地図データの可視化は、ユーザーを引き付け、位置情報データの空間的な分析情報を明らかにするための強力なツールです。位置情報とは、ポイント、ライン、ポリゴンの対象物を含むデータです。たとえば、天気マップは、ユーザーが旅行を把握して計画し、嵐に備えるのに役立ちます。ビジネス インテリジェンス マップは、ユーザーがデータ分析から分析情報を得るのに役立ちます。通信マップは、ユーザーが特定のサービスエリアにおけるプロバイダの通信範囲と品質を把握するのに役立ちます。

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

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

大規模なデータ ビジュアリゼーションを使用するアプリを開発するには、主に 2 つのコンポーネントが必要です。

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

次のシステム図は、これらの 2 つのコンポーネントがアプリのユーザー、Google Cloud、Google マップ プラットフォームと連携して大規模なデータ可視化アプリを作成する仕組みを示しています。

アーキテクチャ図

設計上の考慮事項

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 を超える場合は、Datasets に渡す前に、ソースファイル内のジオメトリ データをプルーニングまたは簡素化することを検討してください(下記のデータのプルーニングをご覧ください)。
  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. 特徴のプロパティの数を最小限に抑える。一意の識別子キーを使用して、実行時に地図対象物に追加のプロパティを結合できます()。
    2. 可能な場合はプロパティ オブジェクトに整数データ型を使用して、タイルの保存容量を最小限に抑え、クライアント アプリで HTTPS 経由で読み込むタイルのパフォーマンスを維持します。
    3. 非常に複雑な対象物ジオメトリを簡素化または集約します。複雑なポリゴン ジオメトリに対して ST_Simplify などの BigQuery 関数を使用することを検討してください。これにより、ソースファイルのサイズを削減し、地図のパフォーマンスを向上させることができます。
  4. タイリング
    1. Google Maps Datasets API は、ウェブまたはモバイルの Maps SDK で使用するために、ソースデータ ファイルから地図タイルを作成する API です。
    2. 地図タイルは、ズームベースのインデックス システムで、ビジュアル アプリにデータをより効率的に読み込むことができます。
    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 を呼び出すための Python クライアント ライブラリと Node.js クライアント ライブラリがあります。また、Cloud コンソールでデータセットを手動で作成するための データセット GUI もあります。

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

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

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

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

ステップ 5 - クライアント アプリのマップ ビジュアリゼーションを作成する

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

Maps JS API を使用すると、スタイルをカスタマイズしたり、スタイルを動的に変更するイベント ハンドラを追加したりできます。ドキュメントの例をご覧ください。以下では、属性「feature_type」に基づいて、この例のポイントと線の特徴スタイルを作成する setStyle 関数を定義します。

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 内の任意のデータから、あらゆるデバイスでパフォーマンスの高い位置情報可視化アプリを作成できます。

次のアクション

その他の情報:

寄稿者

主な作成者:

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