Saltar al contenido principal
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.
Ejemplo de configuración de un diccionario de polígonos:
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.
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))
...

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 disponibles:
LayoutDescripción
POLYGON_SIMPLEImplementación ingenua. Se realiza un recorrido lineal por todos los polígonos para cada consulta, comprobando la pertenencia sin índices adicionales.
POLYGON_INDEX_EACHSe 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_CELLTambié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.
POLYGONSinónimo de POLYGON_INDEX_CELL.
Las consultas al diccionario se realizan mediante las funciones 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:
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.
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 │
└─────────────────────────────────┴───────┘
Última modificación el 10 de junio de 2026