> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-fix-nav-issues.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Polygon 辞書

> point-in-polygon ルックアップ用に Polygon 辞書を設定します。

`polygon` (`POLYGON`) 辞書は、point-in-polygon クエリ、いわゆる「逆ジオコーディング」のルックアップ向けに最適化されています。
座標 (緯度/経度) が与えられると、その点を含むポリゴン/リージョン (国境や地域の境界など、多数のポリゴン集合の中から) を効率的に特定できます。
位置座標を、その座標が属するリージョンに対応付ける用途に適しています。

<Frame>
  <iframe src="https://www.youtube.com/embed/FyRsriQp46E?si=Kf8CXoPKEpGQlC-Y" title="ClickHouse における Polygon 辞書" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen />
</Frame>

ポリゴン辞書の設定例:

<Tip>
  ClickHouse Cloud で Dictionary を使用している場合は、DDLクエリオプションを使用して Dictionary を作成し、`default` ユーザーとして作成してください。
  また、サポートされている Dictionary ソースの一覧は、[Cloud Compatibility ガイド](/ja/products/cloud/guides/cloud-compatibility)で確認してください。
</Tip>

<Tabs>
  <Tab title="DDL">
    ```sql theme={null}
    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))
    ...
    ```
  </Tab>

  <Tab title="設定ファイル">
    ```xml theme={null}
    <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>
    ```
  </Tab>
</Tabs>

<br />

ポリゴン辞書を設定する場合、キーには次のいずれかの型を指定する必要があります。

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

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

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

利用可能な[インメモリストレージ](/ja/reference/statements/create/dictionary/layouts/overview#storing-dictionaries-in-memory)は 3 種類あります。

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

辞書クエリは、辞書を扱うための標準的な[関数](/ja/reference/functions/regular-functions/ext-dict-functions)を使って実行します。
ここで重要なのは、この場合のキーが、含まれるポリゴンを見つけたい点になることです。

**例**

上で定義した辞書の使用例:

```sql theme={null}
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` を有効にするだけです。

```sql title="Query" theme={null}
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;
```

```text title="Response" theme={null}
┌─key─────────────────────────────┬─name──┐
│ [[[(3,1),(0,1),(0,-1),(3,-1)]]] │ Value │
└─────────────────────────────────┴───────┘
```
