Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

Dicionários de polígono

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:

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:

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.

Querysql
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;
Responsetext
┌─key─────────────────────────────┬─name──┐
│ [[[(3,1),(0,1),(0,-1),(3,-1)]]] │ Value │
└─────────────────────────────────┴───────┘
Navigation