Descripción
FeatureCollection, que ClickHouse asigna a tres columnas — id, geometry y properties —, un conjunto por cada Feature. Al leer un documento, se produce una fila por Feature; al escribir, se produce una Feature por fila.
Lectura de datos
FeatureCollection produce una fila por entidad con el siguiente esquema fijo:
Cada geometría se almacena en el tipo
Geometry de ClickHouse (un Variant). Los tipos de geometría GeoJSON admitidos son Point, LineString, MultiLineString, Polygon y MultiPolygon. Los otros dos tipos de geometría GeoJSON, GeometryCollection y MultiPoint, no pueden representarse con el tipo Geometry; leer uno en la columna geometry genera una excepción de forma predeterminada, aunque esto puede cambiarse para insertar NULL en su lugar; consulta Manejo de tipos de geometría no admitidos más abajo. De forma predeterminada, la columna geometry es NULL solo cuando la geometría de una entidad es un null JSON explícito; con input_format_geojson_unsupported_geometry_handling = 'null' también es NULL para un tipo de geometría no admitido.
Se valida la estructura del documento: el type de nivel superior debe ser FeatureCollection y cada elemento de features debe tener type Feature. De forma predeterminada, las coordenadas deben cumplir las invariantes de forma de GeoJSON: un LineString (y cada línea de un MultiLineString) debe tener al menos dos puntos, y un anillo de Polygon (y cada anillo de un MultiPolygon) debe estar cerrado y tener al menos cuatro puntos (consulta Validación de geometrías). Los documentos malformados se rechazan en lugar de cargarse silenciosamente.
El orden de las claves es flexible: el type de nivel superior puede aparecer antes o después del array features, y dentro de un objeto de geometría coordinates puede aparecer antes o después de type.
La inferencia de esquemas devuelve el esquema fijo anterior, por lo que DESCRIBE y SELECT ... FROM format(...) funcionan sin una definición de tabla.
Dado el siguiente archivo GeoJSON london.geojson, que contiene una combinación de tipos de geometría:
Query
Response
.geojson se detecta automáticamente, por lo que puede omitirse el argumento de formato:
Query
variantType para saber el tipo subyacente de cada objeto de tipo Geometry:
Query
Response
Query
Response
Geometry, se devuelve el valor cuando la fila contiene ese tipo y, en caso contrario, el valor predeterminado del tipo — (0,0) para Point y [] para los tipos basados en arrays —, así que usa variantType(geometry) para saber cuál está definido.
También podemos ingestar datos GeoJSON en una tabla:
Query
Query
Response
Query
Response
Manejo de tipos de geometría no admitidos
GeometryCollection y MultiPoint — no pueden representarse con el tipo Geometry de ClickHouse. Puede controlar qué ocurre cuando debe almacenarse una geometría de este tipo en la columna geometry mediante la configuración input_format_geojson_unsupported_geometry_handling. Los valores posibles son:
'throw'— lanzar una excepción (predeterminado)'null'— insertar un valorNULLen la columnageometryy continuar el análisis
geometry. Cuando geometry no es una columna de salida solicitada (por ejemplo, SELECT id FROM ...), una geometría no admitida sigue validándose para comprobar que esté bien formada, pero no activa este comportamiento: ni lanza una excepción ni inserta NULL, porque no se materializa ningún valor de geometría.
Limitaciones
- Solo se generan
id,geometryyproperties; el resto de la estructura del documento no se expone como columnas. - La tercera coordenada (elevación) de una posición, así como cualquier coordenada posterior, se descartan; las posiciones pasan a ser
[longitud, latitud]. bboxy los miembros ajenos (como unnameocrsde nivel superior, o miembros adicionales dentro de unaFeature) se ignoran.- Un
idnumérico se almacena como texto, por lo que se pierde la distinción entre cadena y número; unidausente onullpasa a serNULL. GeometryCollectionyMultiPointno pueden representarse; consulta Tratamiento de tipos de geometría no admitidos.
Escritura de datos
FeatureCollection de GeoJSON, con una Feature por fila.
Las columnas del resultado se asignan a cada Feature de la siguiente manera:
La columna de tipo geometría puede ser la variante
Geometry o un tipo geo específico; cada uno se asigna a un tipo de geometría GeoJSON:
Ring no es un tipo de geometría de GeoJSON: un anillo lineal es un componente de un Polygon, por lo que un valor Ring se escribe como un Polygon de un solo anillo.
Ejemplos
london creada anteriormente, al exportar columnas de atributo simples, cada columna distinta de id y geometry se convierte en una propiedad:
Query
Response
object llamada properties se escribe directamente, al leer un archivo GeoJSON y volver a escribirlo sin más se reproduce el documento (las columnas id, geometry y properties son las que se infieren para el archivo):
Query
Response
id numérica se escribe como un número JSON (un id Nullable que es NULL se omite por completo):
Query
Response
Ring se representa como un Polygon de un solo anillo:
Query
Response
Escribir en un archivo
INTO OUTFILE para escribir un archivo GeoJSON desde el client:
Query
file (la extensión .geojson selecciona el formato automáticamente):
Query
Limitaciones
Los tipos geo de ClickHouse no incluyen ningún sistema de referencia de coordenadas, por lo que la salida asume que las coordenadas ya están en longitud/latitud WGS84 en el orden
[longitude, latitude], como exige RFC 7946. No se realiza ninguna reproyección ni intercambio de ejes, de modo que las coordenadas proyectadas — o los datos almacenados como (latitude, longitude) — producen GeoJSON estructuralmente válido, pero no conforme.- La información descartada durante la lectura — la elevación de una posición,
bbox, miembros ajenos y la distinción entre cadena y número de unid— no puede reproducirse; consulte Limitaciones de lectura. - Las coordenadas se escriben a partir de valores
Float64usando su representación más corta que permite ida y vuelta. - Un objeto
propertiestomado directamente de una columnaJSONse emite en el orden canónico de claves del tipoJSON, que puede diferir de la entrada.
LineString con un solo punto o un anillo de Polygon no cerrado, se rechaza para garantizar que el documento escrito pueda volver a leerse. Establezca format_geojson_validate_geometry = 0 para emitir estas geometrías tal cual, produciendo en su lugar GeoJSON estructuralmente válido, pero no conforme. La regla de la mano derecha (orientación) no se aplica en ningún caso, y se conserva la distinción entre null y un objeto properties vacío.
Validación de geometrías
format_geojson_validate_geometry controla si el formato hace cumplir las reglas de forma geométrica de RFC 7946 en ambos sentidos. Está habilitada de forma predeterminada.
Cuando está habilitada, se rechaza cualquier geometría que incumpla las reglas de forma de GeoJSON: un LineString (o una línea de un MultiLineString) con menos de dos puntos; un anillo de Polygon o MultiPolygon con menos de cuatro puntos, o cuyo primer y último punto difieren (un anillo no cerrado); o un MultiLineString, Polygon o MultiPolygon vacío. Las mismas reglas se aplican tanto al leer un documento de este tipo como al escribir un valor de ClickHouse de este tipo, por lo que un documento escrito siempre puede volver a leerse.
Cuando está deshabilitada, estas reglas de forma no se aplican en ninguno de los dos sentidos: las geometrías degeneradas se leen tal cual y se escriben tal cual. Esto permite que los valores geométricos de ClickHouse que no son geometrías GeoJSON válidas puedan pasar de ida y vuelta por el formato, a costa de producir documentos que no son GeoJSON válidos.
La validación es solo estructural: comprueba el recuento de puntos y el cierre de los anillos. No examina la corrección geométrica de una forma, por lo que se acepta en ambos sentidos una geometría estructuralmente válida pero geométricamente degenerada; por ejemplo, un polígono de área cero, un anillo que se autointerseca o un polígono cuyos agujeros (anillos interiores) están fuera de su anillo exterior. Del mismo modo, nunca se aplica la orientación de los anillos de los polígonos según la regla de la mano derecha (sentido de recorrido).
Una comprobación es independiente de la configuración: las coordenadas no finitas (NaN, Inf) siempre se rechazan, porque no pueden representarse como números JSON.