Pular para o conteúdo principal
O dicionário polygon (POLYGON) é otimizado para consultas de ponto em polígono, ou seja, buscas de “geocodificação reversa”. Dada uma coordenada (latitude/longitude), ele identifica com eficiência qual polígono/região (entre um conjunto com muitos polígonos, como fronteiras de países ou regiões) contém esse ponto. Ele é particularmente adequado para mapear coordenadas de localização à região que as contém.
Exemplo de configuração de um dicionário polígono:
Se você estiver usando um dicionário com o ClickHouse Cloud, use a opção de consulta DDL para criar seus dicionários e crie o dicionário como o usuário default. Além disso, verifique a lista de fontes de dicionário compatíveis no guia de compatibilidade com a 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))
...

Ao configurar o dicionário polígono, a chave deve ter um destes dois tipos:
  • Um polígono simples. É um array de pontos.
  • MultiPolygon. É um array de polígonos. Cada polígono é um array bidimensional de pontos. O primeiro elemento desse array é o contorno externo do polígono, e os elementos subsequentes especificam áreas a serem excluídas dele.
Os pontos podem ser especificados como um array ou uma tupla de coordenadas. Na implementação atual, apenas pontos bidimensionais são suportados. O usuário pode enviar seus próprios dados em todos os formatos compatíveis com o ClickHouse. Há 3 tipos de armazenamento em memória disponíveis:
LayoutDescrição
POLYGON_SIMPLEImplementação ingênua. Para cada consulta, é feito um percurso linear por todos os polígonos, verificando a pertença sem índices adicionais.
POLYGON_INDEX_EACHUm índice separado é criado para cada polígono, permitindo verificações rápidas de pertença na maioria dos casos (otimizado para regiões geográficas). Uma grade é sobreposta à área, dividindo recursivamente as células em 16 partes iguais. A divisão para quando a profundidade da recursão atinge MAX_DEPTH ou quando uma célula cruza no máximo MIN_INTERSECTIONS polígonos.
POLYGON_INDEX_CELLTambém cria a grade descrita acima com as mesmas opções. Para cada célula folha, é criado um índice sobre todos os fragmentos de polígono que caem nela, permitindo respostas rápidas às consultas.
POLYGONSinônimo de POLYGON_INDEX_CELL.
As consultas ao dicionário são realizadas usando as funções padrão para trabalhar com dicionários. Uma diferença importante é que, aqui, as chaves serão os pontos para os quais você deseja encontrar o polígono que os contém. Exemplo Exemplo de uso do dicionário definido acima:
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 da execução do último comando para cada ponto da tabela ‘points’, será encontrado o polígono de menor área que contém esse ponto, e os atributos solicitados serão exibidos. Exemplo Você pode ler colunas de dicionários de polígonos por meio de uma consulta SELECT; basta ativar store_polygon_key_column = 1 na configuração do dicionário ou na consulta DDL correspondente.
Consulta
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 modificação em 10 de junho de 2026