メインコンテンツへスキップ
polygon (POLYGON) 辞書は、point-in-polygon クエリ、いわゆる「逆ジオコーディング」のルックアップ向けに最適化されています。 座標 (緯度/経度) が与えられると、その点を含むポリゴン/リージョン (国境や地域の境界など、多数のポリゴン集合の中から) を効率的に特定できます。 位置座標を、その座標が属するリージョンに対応付ける用途に適しています。
ポリゴン辞書の設定例:
ClickHouse Cloud で Dictionary を使用している場合は、DDLクエリオプションを使用して Dictionary を作成し、default ユーザーとして作成してください。 また、サポートされている Dictionary ソースの一覧は、Cloud Compatibility ガイドで確認してください。
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))
...

ポリゴン辞書を設定する場合、キーには次のいずれかの型を指定する必要があります。
  • 単純なポリゴン。点の配列です。
  • MultiPolygon。ポリゴンの配列です。各ポリゴンは点の二次元配列で、この配列の最初の要素はポリゴンの外周境界、以降の要素はそこから除外する領域を表します。
点は、座標の配列またはタプルとして指定できます。現在の実装では、二次元の点のみがサポートされています。 ユーザーは、ClickHouse がサポートするすべてのフォーマットで独自のデータをアップロードできます。 利用可能なインメモリストレージは 3 種類あります。
レイアウト説明
POLYGON_SIMPLE単純な実装です。追加の索引は使わず、各クエリごとにすべてのポリゴンを線形走査して、その点が含まれるかどうかを判定します。
POLYGON_INDEX_EACH各ポリゴンごとに個別の索引を構築するため、多くの場合に高速な包含判定が可能です (地理的リージョン向けに最適化) 。対象領域にグリッドを重ね、セルを再帰的に 16 等分していきます。再帰の深さが MAX_DEPTH に達するか、1 つのセルと交差するポリゴン数が MIN_INTERSECTIONS 以下になると分割を停止します。
POLYGON_INDEX_CELL上記と同じオプションで同様のグリッドを作成します。各リーフセルについて、そのセル内に含まれるすべてのポリゴン片に対する索引を構築し、高速なクエリ応答を可能にします。
POLYGONPOLYGON_INDEX_CELL の同義語です。
辞書クエリは、辞書を扱うための標準的な関数を使って実行します。 ここで重要なのは、この場合のキーが、含まれるポリゴンを見つけたい点になることです。 上で定義した辞書の使用例:
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’ テーブル内の各ポイントに対して最後のコマンドを実行すると、そのポイントを含む最小面積の Polygon が見つかり、要求した属性が出力されます。 SELECT クエリを使用して polygon dictionaries からカラムを読み取ることができます。これを行うには、Dictionary の設定または対応する DDL クエリで store_polygon_key_column = 1 を有効にするだけです。
Query
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;
Response
┌─key─────────────────────────────┬─name──┐
│ [[[(3,1),(0,1),(0,-1),(3,-1)]]] │ Value │
└─────────────────────────────────┴───────┘
最終更新日 2026年6月10日