> ## 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.

# Diccionarios de polígonos

> Configure diccionarios de polígonos para búsquedas de punto en polígono.

El diccionario `polygon` (`POLYGON`) está optimizado para consultas de punto en polígono, es decir, búsquedas de "geocodificación inversa".
Dada una coordenada (latitud/longitud), encuentra de forma eficiente qué polígono o región (de entre un conjunto de muchos polígonos, como fronteras de países o regiones) contiene ese punto.
Es especialmente adecuado para asignar coordenadas geográficas a la región que las contiene.

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

Ejemplo de configuración de un diccionario de polígonos:

<Tip>
  Si usa un diccionario con ClickHouse Cloud, utilice la opción de consulta DDL para crear sus diccionarios y cree el diccionario como el usuario `default`.
  Además, consulte la lista de orígenes de diccionario compatibles en la [guía de compatibilidad de Cloud](/es/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="Archivo de configuración">
    ```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 />

Al configurar el diccionario de polígonos, la clave debe tener uno de estos dos tipos:

* Un polígono simple. Es un array de puntos.
* MultiPolygon. Es un array de polígonos. Cada polígono es un array bidimensional de puntos. El primer elemento de este array es el límite exterior del polígono, y los elementos posteriores especifican las áreas que deben excluirse de él.

Los puntos pueden especificarse como un array o una tupla de coordenadas. En la implementación actual, solo se admiten puntos bidimensionales.

El usuario puede cargar sus propios datos en cualquiera de los formatos compatibles con ClickHouse.

Hay 3 tipos de [almacenamiento en memoria](/es/reference/statements/create/dictionary/layouts/overview#storing-dictionaries-in-memory) disponibles:

| Layout               | Descripción                                                                                                                                                                                                                                                                                                                                                                                                                          |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `POLYGON_SIMPLE`     | Implementación ingenua. Se realiza un recorrido lineal por todos los polígonos para cada consulta, comprobando la pertenencia sin índices adicionales.                                                                                                                                                                                                                                                                               |
| `POLYGON_INDEX_EACH` | Se construye un índice independiente para cada polígono, lo que permite comprobaciones rápidas de pertenencia en la mayoría de los casos (optimizado para regiones geográficas). Se superpone una cuadrícula sobre el área, dividiendo recursivamente las celdas en 16 partes iguales. La división se detiene cuando la profundidad de la recursión alcanza `MAX_DEPTH` o una celda cruza como máximo `MIN_INTERSECTIONS` polígonos. |
| `POLYGON_INDEX_CELL` | También crea la cuadrícula descrita anteriormente con las mismas opciones. Para cada celda hoja, se construye un índice sobre todas las partes del polígono que caen en ella, lo que permite responder rápidamente a las consultas.                                                                                                                                                                                                  |
| `POLYGON`            | Sinónimo de `POLYGON_INDEX_CELL`.                                                                                                                                                                                                                                                                                                                                                                                                    |

Las consultas al diccionario se realizan mediante las [funciones](/es/reference/functions/regular-functions/ext-dict-functions) estándar para trabajar con diccionarios.
Una diferencia importante es que aquí las claves serán los puntos para los que se quiere encontrar el polígono que los contiene.

**Ejemplo**

Ejemplo de uso del diccionario definido anteriormente:

```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;
```

Como resultado de ejecutar el último comando para cada punto de la tabla 'points', se encontrará el polígono de área mínima que contiene ese punto y se mostrarán los atributos solicitados.

**Ejemplo**

Puede leer columnas de diccionarios de polígonos mediante una consulta SELECT; solo tiene que activar `store_polygon_key_column = 1` en la configuración del diccionario o en la consulta DDL correspondiente.

```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 │
└─────────────────────────────────┴───────┘
```
