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.
DDL
Arquivo de configuração
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>
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:
| Layout | Descrição |
|---|
POLYGON_SIMPLE | Implementação ingênua. Para cada consulta, é feito um percurso linear por todos os polígonos, verificando a pertença sem índices adicionais. |
POLYGON_INDEX_EACH | Um í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_CELL | També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. |
POLYGON | Sinô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.
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 │
└─────────────────────────────────┴───────┘
Última modificação em 10 de junho de 2026