polygon (POLYGON) 辞書は、point-in-polygon クエリ、いわゆる「逆ジオコーディング」のルックアップ向けに最適化されています。
座標 (緯度/経度) が与えられると、その点を含むポリゴン/リージョン (国境や地域の境界など、多数のポリゴン集合の中から) を効率的に特定できます。
位置座標を、その座標が属するリージョンに対応付ける用途に適しています。
ポリゴン辞書の設定例:
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>
<structure>
<key>
<attribute>
<name>key</name>
<type>Array(Array(Array(Array(Float64))))</type>
</attribute>
</key>
<attribute>
<name>name</name>
<type>String</type>
<null_value></null_value>
</attribute>
<attribute>
<name>value</name>
<type>UInt64</type>
<null_value>0</null_value>
</attribute>
</structure>
<layout>
<polygon>
<store_polygon_key_column>1</store_polygon_key_column>
</polygon>
</layout>
...
</dictionary>ポリゴン辞書を設定する場合、キーには次のいずれかの型を指定する必要があります。
- 単純なポリゴン。点の配列です。
- MultiPolygon。ポリゴンの配列です。各ポリゴンは点の二次元配列で、この配列の最初の要素はポリゴンの外周境界、以降の要素はそこから除外する領域を表します。
点は、座標の配列またはタプルとして指定できます。現在の実装では、二次元の点のみがサポートされています。
ユーザーは、ClickHouse がサポートするすべてのフォーマットで独自のデータをアップロードできます。
利用可能なインメモリストレージは 3 種類あります。
| レイアウト | 説明 |
|---|---|
POLYGON_SIMPLE |
単純な実装です。追加の索引は使わず、各クエリごとにすべてのポリゴンを線形走査して、その点が含まれるかどうかを判定します。 |
POLYGON_INDEX_EACH |
各ポリゴンごとに個別の索引を構築するため、多くの場合に高速な包含判定が可能です (地理的リージョン向けに最適化) 。対象領域にグリッドを重ね、セルを再帰的に 16 等分していきます。再帰の深さが MAX_DEPTH に達するか、1 つのセルと交差するポリゴン数が MIN_INTERSECTIONS 以下になると分割を停止します。 |
POLYGON_INDEX_CELL |
上記と同じオプションで同様のグリッドを作成します。各リーフセルについて、そのセル内に含まれるすべてのポリゴン片に対する索引を構築し、高速なクエリ応答を可能にします。 |
POLYGON |
POLYGON_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 を有効にするだけです。
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 │
└─────────────────────────────────┴───────┘