H3の力で空間インデックスを簡略化 - 世界に必要なのは六角形のグリッド
注:本記事は(2024年2月29日)に公開された(注:本記事は(2024年2月1日)に公開された(xx)を機械翻訳により公開したものです。)を機械翻訳により公開したものです。
Snowflakeのお客様の約3分の2が、自社のアカウントで何らかのビジネスエンティティやイベントの緯度と経度を取得していることをご存知ですか?緯度と経度の列は、BIツールやPythonライブラリでポイントを地図にプロットしたり、州、州、国などの一般的な行政境界を濃淡を付けたりするためによく使用されますが、企業はこの貴重な地理空間データを使用して複雑な分析を実行することができます。
このブログシリーズではGEOGRAPHYおよびGEOMETRYデータ型に対するSnowflakeのサポートについて説明し、これらのデータ型を使用して毎日数百万のクエリが実行されていますが、実際には、これらのデータ型を扱うには地理空間の専門家である必要があると考えている人も少なくありません。その緯度と経度をより強力なものに変換するための、より簡単なアクセスパスが必要です。1960年代の古い歌「What the world need now」(世界は今何を必要としているか)を言い換えると…六角形です。
世界の皆様。本日、SnowflakeにおけるH3の一般提供開始を発表いたします。これで、緯度経度データ(および地理データがあればGEOGRAPHY)を取得して、H3の力を解き放つことができます。しかし、H3とは何か、そしてなぜ世界に六角形が必要なのか?
ゲームをしましょうか?
私はあらゆる種類のゲーム、特に戦略ゲームが大好きです。優れた戦略ゲームは、ゲームの構成の中であなたに戦いを挑むと同時に、その構成の中でのナビゲーションを、一緒にプレイしている友人や家族と天秤にかけていくことになります。
ストラテジーゲームにはさまざまなスタイルがありますが、特に言及しておきたいのがタイル配置ゲームです。タイル配置ゲームでは、プレーヤーは多くの場合、ゲームに勝つためにポイントまたは通貨を生成するためにボードまたはテーブルに相互接続タイルを配置しなければなりません。これにはさまざまなバリエーションがありますが、タイル配置ゲームに共通するテーマの1つは、現実世界または架空の世界の2次元マップを表現することです。これらのタイルは、マップを構築または入力するために互いに完全に接続する必要があるため、多くの場合、正方形、三角形、六角形のいずれかの形になります。
ゲーム内の現実または架空の地図の上に図形を配置するこのプロセスは、現実世界にも似ています。これを「空間グリッドの作成」と呼びます。空間グリッドは、面または球を多くの一般的な形状に整理し、その領域内の各セル(形状)をより迅速に見つけて参照できるようにします。このグリッドは、グリッドの構成と使用の詳細を表すメタデータとともに、空間インデックスと呼ばれます。SnowflakeのパートナーであるCARTOは、空間インデックスが強力なツールになり得ると指摘しています。これは、「格納するジオメトリが大きく、分析が遅い長いジオメトリ記述ではなく、短い参照文字列によって位置決めされている」ためです。
H3とは何か?
人気のライドシェア企業であるUberは、ライドシェアの価格設定と配車を最適化する必要がありました。地方自治体内の既存の任意のレベルのグループ化に基づく標準的な官公庁・公的機関定義のポリゴンを使用することもできましたが、これらは変更される可能性があり、非常に不規則です。このブログシリーズの第2部の次の画像について考えてみてください。
米国、英国、ドイツ、オランダ、ベルギーのポリゴンは非常に不規則な形状をしています。アウトラインのレンダリングには驚くほど密度の高い一連のポイントが必要であり、ユースケースによってはこれらのポリゴンに対する数学計算に時間がかかる場合があります。Uberは、グリッド内の予測可能なセル間で高速に計算できる、より均一なグリッドシステムを使用して地理領域を表現する機能を必要としていました。そこで同社は、空間インデックスH3を考案し、最終的にオープンソース化しました。
最初の課題は、グリッドシステムに使用する形状を決定することでした。先ほど説明したように、三角形、正方形、六角形は通常、グリッドシステムで使用されます。これは、三角形、正方形、六角形がうまくかみ合っているためです。しかし、六角形には、三角形や正方形に勝る重要な強みが1つあります。それは、等距離の近傍にあるということです。
グリッド内の六角形には、セントロイドが互いに等距離にある隣接する6つの六角形があります。これは三角形や正方形には当てはまらず、六角形が高速かつ単数形の距離カテゴリーを持つことから、Uberの地理空間ユースケースに最適です。これにより、与えられた六角形の周囲にリングを作成することにより、シンプルな座標系を構築することもできます。
H3で取り上げる価値のある最後の要素は、解像度の概念です。ディスプレイや動画ファイルのサイズにピクセル数を詰め込むビデオやテレビの解像度と同様に、グリッドシステムは、分析する領域のサイズや必要な分析の粒度に応じてさまざまなサイズの六角形を使用できるようにする解像度コンセプトで設計されています。この解像度は、以下に示すように、1つのグリッドを別のグリッドの上に重ねることで階層として作成されます。これが正しく行われると、7つの六角形セントロイドがアパーチャ7と呼ばれる方法でより大きな六角形の中に収まり、すべてのレイヤーで六角形の間に親子関係が生まれます。以下のウィジェットを使用して、さまざまな解像度を確認し、階層レベルを操作してください。
キャプション:Streamlitのデモ アプリでは、同じデータのさまざまな解像度でH3六角形を可視化します。
H3の解像度には16のレイヤー(レベル)があります。以下のデモStreamlitアプリでは、米国のセルタワーの濃度をさまざまな解像度レベルで示すことができます。これにより、六角形のサイズが大幅に異なります。
キャプション:Streamlitのデモ アプリでは、同じデータのさまざまな解像度でH3六角形を可視化します。
しかし、H3はライドシェア企業にとって価値のあるだけでなく、さまざまな業界のさまざまなユースケースに有効です。
- 通信:ネットワークの監視と計画。H3は、膨大なネットワークパフォーマンスデータの処理と、顧客独自の使用状況インサイトの生成を可能にします。
- 保険:価格設定戦略の定義、資産やインフラストラクチャーに対するリスクパターンの分析。
- 持続可能性と気候レジリエンスに関するアナリティクス:アナリストが大量のラスターデータセットの処理と可視化に伴う処理の制限とコストを克服するための支援をする。
- 物流およびフリート管理:ルーティングと配送時間の最適化、フリートの大規模な管理の改善。
- デリバリーとクイックコマース:納期の遅延やエラーなど、ビジネスクリティカルなパフォーマンス指標の評価。
キャプション:このマップでは、カリフォルニア州の森林火災リスク指数の作成にH3を利用しています。土地被覆の種類、気温、風速がすべて単一のスコアに組み込まれており、保険会社は山火事のリスクを理解するのに役立ちます。出典:CARTO
SnowflakeのH3
H3はSnowflakeで簡単に始められます。GEOGRAPHYやGEOMETRYとは異なり、H3はデータ型ではありません。代わりに、GEOGRAPHYデータ型または個別の緯度経度列として保存されているGEOGRAPHYデータのH3関数コレクションを使用します。SnowflakeとPyDeckパッケージでStreamlitを使用することで、このデータを可視化するダッシュボードを構築できます。
最も簡単な関数セットはH3 _ [ object ] _ TO_CELLです。 [object]はGEOGRAPHY POINTまたは緯度と経度の列の組み合わせです。これらの関数は、指定されたオブジェクトのH3セルIDを返します。どちらのタイプのオブジェクトでも動作する2つのバリエーションと、H3セルIDを整数または16進数で返す2つのバリエーションがあります。
- H3_POINT_TO_CELL
- H3_POINT_TO_CELL_STRING
- H3_LATLNG_TO_CELL
- H3_LATLNG_TO_CELL_STRING
整数か16進数かは ユースケースによって異なります16進数は、H3をサポートする可視化ツールやライブラリにより幅広くサポートされていますが、整数は、ストレージや結合または集計のパフォーマンスにより効率的になります。そのため、自分のユースケースに最適なバリエーションを選んでください。
ご覧のように ALL_NODESというテーブルがあり S_GEOGRAPHY列がGEOGRAPHYデータ型に格納されていますまた、列TAGSを使用して、パリのエッフェル塔の位置を特定します。
上記のクエリでは次の2つのことが行われます。
- まず、H3_POINT_TO_CELL(2行目と3行目)とH3_POINT_TO_CELL_STRING(4行目と5行目)の両方を使用して、エッフェル塔のH3セルIDをそれぞれ整数と16進数で返しています。
- 次に、どちらの関数も特定の解像度を必要とします。H3には六角形のグリッドが16層あることに注意してください。そのため、点の対応するH3セルIDを取得するには、どの解像度で取得するかを知る必要があります。ここでは、解像度8と解像度9を使用しました。
しかし、ここでもGEOGRAPHYデータ型にすでに保存されているデータは必要ありません。必要なのは緯度と経度の列だけです。そこで、S_GEOGRAPHY列から緯度と経度を抽出し、別々の列として格納するALL_NODES_VというALL_NODESのビューを作成しましょう。次に、上記のクエリを複製し、新しいビューとさまざまな関数から適切な列を置き換えることができます。
上記の2つのクエリで注意すべきポイントは2点です。
- まず、H3_LATLNG_TO_CELL関数(14行目と15行目)とH3_LATLNG_TO_CELL_STRING関数(16行目と17行目)に切り替えます。ここでは、個別の緯度と経度の列を引数として使用します。皆さんの3分の2はすでにSnowflakeアカウントにこのデータを持っています。
- 次に、クエリ1ではクエリ2とまったく同じH3セルIDが取得されることに注意してください。
POINTや緯度経度の組み合わせについて存在するのと同じ変換機能が、多角形についても存在します。これらの関数を使用すると、 H3グリッドをポリゴンの上にオーバーレイできます。これは、 ポリフィルとも呼ばれるアクションですただし、これらの関数の動作は若干異なります。
- H3_POLYGON_TO_CELLSは平面的で、セントロイドベースのポリフィルを行います。この方法は、より局所的な領域でより良い結果をもたらします。
- H3_COVERAGEは球形のジオメトリ計算を使用し、図形を完全に覆うセルを返します。大規模なデータに適しています
この2つのポリフィルアプローチの違いは、前述のStreamlitアプリで確認できます。
キャプション:異なるH3解像度での2つの異なるポリフィル関数の違いを示すStreamlitアプリ。
H3_POLYGON_TO_CELLSは、左側のグローバルスケールではうまく整列しませんが、右側の小さな領域ではH3_COVERAGEより少しきれいにポリフィルされます。
H3には、解像度階層を上下できる関数セットがもう1つあります。前述のように、16レイヤーはすべて親子関係で動作します。まず、H3_CELL_TO_PARENTを使って、特定の解像度のH3セルIDの親を探します。
上記のクエリの23行目と25行目で、解像度9のH3_LATLNG_TO_CELL関数とH3_LATLNG_TO_CELL_STRING関数をH3_CELL_TO_PARENTでラップし、解像度8の親セルIDを得ています。22行目と24行目の8つの列は、元の解像度のままにしておきます。また、解像度8をスキップして解像度7以下にジャンプし、解像度0にすることもできます。親解決番号は常に小さい番号です。
同じタイプの関数を逆に使用すると、特定の親セルのすべての子セルを見つけることができます。H3_CELL_TO_CHILDRENという名前のこの関数は、解像度の低い方から高い方へという逆方向に進みます。クエリの結果が以前のクエリと異なるため、いくつかの列を削除してクエリを少し簡略化してみましょう。
31行目は解像度9の特定のセルの子セルを求めており、30行目は解像度9のエッフェル塔セルを表しています。子がどのように配列で返され、7個あることがわかります。その配列をサイドバーに隔離すると、確かにEiffel Towerのセルが配列にリストされているセルの1つであることが分かります(赤のハイライトボックス)。
これですべてうまくいきましたが、まだ本当に面白いことは何もしていません。これらの関数は地理空間データをH3に変換するために便利ですが、一度変換したら、それで何ができるでしょうか?さらに深く掘り下げるために、外部の助けを借りてみましょう。
CARTOによるSnowflakeのH3
SnowflakeのパートナーであるCARTOは、空間データからインサイトを得るための幅広い機能を提供しています。
主な機能の1つはCARTOのアナリティクスツールボックスで、SnowflakeマーケットプレイスからSnowflakeネイティブアプリとして入手できます。これにより、地理加重回帰などの統計分析の実行から、地域(行政区画など)を含む別のエンリッチメントクエリのデータによるH3指数のエンリッチメントまで、高度な分析手順を活用できます。これらの高度なストアドプロシージャには、CALLコマンドを通じてSnowflakeでアクセスできます。また、各プロシージャは引数セットを受け取るため、一連の大きなSQLステートメントを手書きで書くよりも簡単に使用できます。
ENRICH_GRIDという分析ツールボックスプロシージャを使用した例を見てみましょう。この手順では、ターゲットのH3テーブルと重複する領域に基づいてソース テーブルから列を集計します。
上記の例では、ロサンゼルスの不動産データは次の手順でH3グリッドに集約されます。
- ラインユーザーは、ターゲットグリッドタイプ(「h3」)、ターゲットテーブル(「LOS_ANGELES_H3R9_POP」)、ターゲットH3列(「h3」)を指定します。
- 5行目:ソーステーブルと地理列を指定(それぞれ「LA_SALES_PARCELS」と「GEOM」)。
- 6-9行目:集計する列と集計方法を指定する配列を構築します。この例では、築年数(EFFECTIVE_YEARBUILT)と物件価格(SALEPRIES)の両方が平均化されます。
- 10行目:出力テーブルを指定。
このプロセスの詳細については、Analytics Toolboxドキュメントを参照してください。
ソーステーブルとターゲットテーブルを可視化する違いを見てみましょう。
キャプション:CARTO内のマップで、ポイントによるデータの可視化とH3によるデータの可視化の違いを示す。出典:carto.com
この分析結果は上の地図で確認できます。左側のマップがプロパティ区画(ソーステーブル)で、右側にH3集約グリッド(ターゲットテーブル)が表示されます。どちらも平均売却価格データを示しています。H3計算の速度により、マップを探索するにつれてデータロードが速くなるだけでなく、H3グリッドを介して空間パターンを解釈することがより簡単になることに注意してください。CARTOは、高度に最適化されたSQLクエリに基づいてオンデマンドでタイルを段階的に生成します。生成されたタイルは、動的タイリングと呼ばれるメカニズムでSnowflakeデータベースにプッシュダウンされ、データに存在するH3インデックスをマップに表示される六角形のセルに直接変換します。
地理空間の専門家でなくても、H3空間インデックスを利用することで、緯度経度データの利用を拡大することができます。SnowflakeとCARTOを組み合わせて使用すると、よりインパクトのある可視化により高性能で高度な分析を強化し、ビジネスに関するより良いインサイトを得ることができます。H3について詳しくは、地理空間ドキュメントと地理空間データによるパフォーマンス最適化アプローチに関する新しいクイックスタートをご覧ください。3月13日午後12時(東部標準時)//午後5時(中央ヨーロッパ標準時)にCARTOが主催するライブウェビナーに参加し、さらなるテクニックとユースケースを共有しましょう。