Descrição
FeatureCollection, que o ClickHouse mapeia para três colunas — id, geometry e properties — um conjunto para cada Feature. A leitura de um documento produz uma linha por feature; a escrita produz uma feature por linha.
Leitura de dados
FeatureCollection produz uma linha por feature com o seguinte esquema fixo:
Cada geometria é armazenada no tipo
Geometry do ClickHouse (um Variant). Os tipos de geometria GeoJSON compatíveis são Point, LineString, MultiLineString, Polygon e MultiPolygon. Os outros dois tipos de geometria GeoJSON, GeometryCollection e MultiPoint, não podem ser representados pelo tipo Geometry; ler um deles na coluna geometry gera uma exceção por padrão, mas isso pode ser alterado para inserir NULL em vez disso — veja Como lidar com tipos de geometria não compatíveis abaixo. Por padrão, a coluna geometry é NULL apenas quando a geometria de uma feature é um null JSON explícito; com input_format_geojson_unsupported_geometry_handling = 'null', ela também é NULL para um tipo de geometria não compatível.
A estrutura do documento é validada: o type de nível superior deve ser FeatureCollection e todo elemento de features deve ter type Feature. Por padrão, as coordenadas devem satisfazer os invariantes de forma do GeoJSON — um LineString (e cada linha de um MultiLineString) deve ter pelo menos dois pontos, e um anel de Polygon (e cada anel de um MultiPolygon) deve ser fechado e ter pelo menos quatro pontos (veja Validação de geometria). Documentos malformados são rejeitados em vez de serem carregados silenciosamente.
A ordem das chaves é flexível: o type de nível superior pode aparecer antes ou depois do array features, e, dentro de um objeto de geometria, coordinates pode aparecer antes ou depois de type.
A inferência de esquema retorna o esquema fixo acima, então DESCRIBE e SELECT ... FROM format(...) funcionam sem uma definição de tabela.
Considere o seguinte arquivo GeoJSON london.geojson, com uma combinação de tipos de geometria:
Query
Response
.geojson é detectada automaticamente, portanto o argumento format pode ser omitido:
Query
variantType para verificar o tipo subjacente de cada objeto Geometry:
Query
Response
Query
Response
Geometry, o valor é retornado quando a linha contém esse tipo; caso contrário, retorna o valor padrão do tipo — (0,0) para Point e [] para os tipos baseados em Array — portanto, use variantType(geometry) para identificar qual deles está definido.
Também podemos fazer a ingestão de dados GeoJSON em uma tabela:
Query
Query
Response
Query
Response
Tratamento de tipos de geometria não compatíveis
GeometryCollection e MultiPoint — não podem ser representados pelo tipo Geometry do ClickHouse. Você pode controlar o que acontece quando uma dessas geometrias precisa ser armazenada na coluna geometry usando a configuração input_format_geojson_unsupported_geometry_handling. Os valores possíveis são:
'throw'— lançar uma exceção (padrão)'null'— inserir um valorNULLna colunageometrye continuar a análise
geometry é lida. Quando geometry não é uma coluna de saída solicitada (por exemplo, SELECT id FROM ...), uma geometria não compatível ainda é validada quanto à sua integridade estrutural, mas não aciona esse tratamento — ela não lança exceção nem insere NULL, porque nenhum valor de geometria é materializado.
Limitações
- Apenas
id,geometryepropertiessão gerados; as demais estruturas do documento não são expostas como colunas. - A terceira coordenada (elevação) de uma posição, e quaisquer coordenadas além dela, são descartadas — as posições passam a ser
[longitude, latitude]. bboxe membros externos (como umnameoucrsde nível superior, ou membros extras dentro de umaFeature) são ignorados.- Um
idnumérico é armazenado como texto, portanto a distinção entre string e número se perde; umidausente ounullse tornaNULL. GeometryCollectioneMultiPointnão podem ser representados — consulte Tratamento de tipos de geometria não compatíveis.
Gravação de dados
FeatureCollection GeoJSON, com um Feature por linha.
As colunas do resultado são mapeadas para cada Feature da seguinte forma:
A coluna do tipo geometria pode ser a variante
Geometry ou um tipo geo específico; cada um é mapeado para um tipo de geometria GeoJSON:
Ring não é um tipo de geometria GeoJSON — um anel linear é um componente de um Polygon — portanto, um valor Ring é gravado como um Polygon de anel único.
Exemplos
london criada acima, a exportação de colunas de atributos simples transforma todas as colunas, exceto id e geometry, em uma propriedade:
Query
Response
properties é gravada diretamente, ler um arquivo GeoJSON e gravá-lo de volta reproduz o documento (as colunas id, geometry e properties são as inferidas para o arquivo):
Query
Response
id numérica é representada como um número JSON (um id Nullable que é NULL é omitido completamente):
Query
Response
Ring é representado como um Polygon de um único anel:
Query
Response
Gravando em um arquivo
INTO OUTFILE para gravar um arquivo GeoJSON no cliente:
Query
file (a extensão .geojson seleciona o formato automaticamente):
Query
Limitações
Os tipos geo do ClickHouse não carregam um sistema de referência de coordenadas, portanto a saída pressupõe que as coordenadas já estejam em longitude/latitude WGS84 na ordem
[longitude, latitude], como exige a RFC 7946. Nenhuma reprojeção nem troca de eixos é realizada, portanto coordenadas projetadas — ou dados armazenados como (latitude, longitude) — produzem GeoJSON estruturalmente válido, mas fora de conformidade.- Informações descartadas durante a leitura — a elevação de uma posição,
bbox, membros adicionais e a distinção entre string e número em umid— não podem ser reproduzidas; veja Limitações de leitura. - As coordenadas são gravadas a partir de valores
Float64usando a representação mais curta que permite ida e volta sem perda. - Um objeto
propertiesobtido diretamente de uma colunaJSONé emitido na ordem canônica das chaves do tipoJSON, que pode diferir da entrada.
LineString com um ponto ou um anel de Polygon não fechado, é rejeitada para que o documento gravado possa ser lido novamente. Defina format_geojson_validate_geometry = 0 para emitir essas geometrias como estão, produzindo GeoJSON estruturalmente válido, mas fora de conformidade. O invariante da regra da mão direita (sentido) não é aplicado em nenhum dos casos, e a distinção entre um objeto properties null e um vazio é preservada.
Validação de geometria
format_geojson_validate_geometry controla se o formato aplica as regras de forma geométrica da RFC 7946, em ambos os sentidos. Ela é ativada por padrão.
Quando ativada, uma geometria que viola as regras de forma do GeoJSON é rejeitada: uma LineString (ou uma linha de uma MultiLineString) com menos de dois pontos; um anel de Polygon ou MultiPolygon com menos de quatro pontos, ou cujos primeiro e último pontos sejam diferentes (um anel não fechado); ou uma MultiLineString, Polygon ou MultiPolygon vazia. As mesmas regras se aplicam tanto à leitura desse tipo de documento quanto à gravação desse tipo de valor do ClickHouse, de modo que um documento gravado sempre possa ser lido novamente.
Quando desativada, essas regras de forma não são aplicadas em nenhum dos sentidos: geometrias degeneradas são lidas como estão e gravadas como estão. Isso permite que valores de geometria do ClickHouse que não sejam geometrias GeoJSON válidas façam ida e volta no formato, ao custo de produzir documentos que não são GeoJSON válidos.
A validação é apenas estrutural: ela verifica a contagem de pontos e o fechamento dos anéis. Ela não inspeciona a correção geométrica da forma, portanto uma geometria estruturalmente válida, mas geometricamente degenerada, é aceita em qualquer um dos sentidos — por exemplo, um polígono de área zero, um anel autointersectante ou um polígono cujos buracos (anéis internos) ficam fora do anel externo. Da mesma forma, a orientação dos anéis de polígonos segundo a regra da mão direita (sentido) nunca é aplicada.
Uma verificação é independente da configuração: coordenadas não finitas (NaN, Inf) são sempre rejeitadas, porque não podem ser representadas como números JSON.