メインコンテンツへスキップ
メインコンテンツへスキップ

ポリゴン Dictionary

polygonPOLYGON)Dictionary は、ポイント・イン・ポリゴンクエリ、すなわち「逆ジオコーディング」ルックアップに最適化されています。 座標(緯度・経度)を指定すると、多数のポリゴン(国や地域の境界など)の中からその座標を含むポリゴン/地域を効率的に特定します。 位置座標をそれが属する地域にマッピングする用途に適しています。

ポリゴンDictionaryの設定例:

ヒント

ClickHouse Cloud でディクショナリを使用している場合は、ディクショナリの作成に DDL クエリオプションを使用し、ユーザー default でディクショナリを作成してください。 また、Cloud 互換性ガイド でサポートされているディクショナリソースの一覧を確認してください。

CREATE DICTIONARY polygon_dict_name (
    key Array(Array(Array(Array(Float64)))),
    name String,
    value UInt64
)
PRIMARY KEY key
LAYOUT(POLYGON(STORE_POLYGON_KEY_COLUMN 1))
...

ポリゴンDictionaryを設定する際、キーは以下の2つの型のいずれかである必要があります:

  • 単純ポリゴン。点の配列です。
  • MultiPolygon。これはポリゴンの配列です。各ポリゴンは点の二次元配列です。この配列の最初の要素はポリゴンの外側の境界を表し、以降の要素はそのポリゴンから除外する領域を指定します。

点は座標の配列またはタプルとして指定できます。現在の実装では、2次元の点のみサポートされています。

ユーザーは、ClickHouseがサポートするすべての形式で自身のデータをアップロードできます。

利用可能なインメモリストレージには、3つの種類があります:

レイアウト説明
POLYGON_SIMPLE単純な実装です。各クエリごとにすべてのポリゴンを線形走査し、追加の索引を使用せずに包含関係を判定します。
POLYGON_INDEX_EACH各ポリゴンごとに個別の索引が構築され、多くの場合に高速な包含判定が可能になります(地理的な領域向けに最適化されています)。領域上にグリッドが重ね合わされ、セルは再帰的に 16 個の等しいパーツに分割されます。再帰の深さが MAX_DEPTH に達するか、1 つのセルと交差するポリゴンの数が MIN_INTERSECTIONS 以下になると分割は停止します。
POLYGON_INDEX_CELL上記で説明したグリッドも、同じオプションで作成します。各リーフセルごとに、そのセルに含まれるすべてのポリゴン断片に対して索引を構築し、高速なクエリ応答を可能にします。
POLYGONPOLYGON_INDEX_CELL の別名です。

Dictionaryのクエリは、Dictionaryを操作するための標準的な関数を使用して実行されます。 重要な違いは、ここでのキーが、そのキーを含むポリゴンを検索したい地点になるという点です。

上記で定義したDictionaryを使用した例:

CREATE TABLE points (
    x Float64,
    y Float64
)
...
SELECT tuple(x, y) AS key, dictGet(dict_name, 'name', key), dictGet(dict_name, 'value', key) FROM points ORDER BY x, y;

'points' テーブル内の各ポイントに対して上記のコマンドを実行すると、そのポイントを含む最小面積のポリゴンが検索され、指定した属性が出力されます。

SELECT クエリでポリゴン Dictionary からカラムを読み取ることができます。そのためには、Dictionary の設定または対応する DDL クエリで store_polygon_key_column = 1 を有効にしてください。

CREATE TABLE polygons_test_table
(
    key Array(Array(Array(Tuple(Float64, Float64)))),
    name String
) ENGINE = MergeTree
ORDER BY tuple();

INSERT INTO polygons_test_table VALUES ([[[(3, 1), (0, 1), (0, -1), (3, -1)]]], 'Value');

CREATE DICTIONARY polygons_test_dictionary
(
    key Array(Array(Array(Tuple(Float64, Float64)))),
    name String
)
PRIMARY KEY key
SOURCE(CLICKHOUSE(TABLE 'polygons_test_table'))
LAYOUT(POLYGON(STORE_POLYGON_KEY_COLUMN 1))
LIFETIME(0);

SELECT * FROM polygons_test_dictionary;
┌─key─────────────────────────────┬─name──┐
│ [[[(3,1),(0,1),(0,-1),(3,-1)]]] │ Value │
└─────────────────────────────────┴───────┘