Skip to main content

Description

Les données GeoJSON sont échangées sous la forme d’un unique document FeatureCollection, que ClickHouse associe à trois colonnes — id, geometry et properties — soit un ensemble par Feature. La lecture d’un document produit une ligne par feature ; l’écriture produit une feature par ligne.

Lecture des données

La lecture d’une FeatureCollection produit une ligne par feature avec le schéma fixe suivant : Chaque géométrie est stockée dans le type Geometry de ClickHouse (un Variant). Les types de géométrie GeoJSON pris en charge sont Point, LineString, MultiLineString, Polygon et MultiPolygon. Les deux autres types de géométrie GeoJSON, GeometryCollection et MultiPoint, ne peuvent pas être représentés par le type Geometry ; la lecture de l’un d’eux dans la colonne geometry lève par défaut une exception, mais ce comportement peut être modifié pour insérer NULL à la place — voir Gestion des types de géométrie non pris en charge ci-dessous. Par défaut, la colonne geometry vaut NULL uniquement lorsque la géométrie d’une feature est un null JSON explicite ; avec input_format_geojson_unsupported_geometry_handling = 'null', elle vaut également NULL pour un type de géométrie non pris en charge. La structure du document est validée : le type de premier niveau doit être FeatureCollection et chaque élément de features doit avoir pour type Feature. Par défaut, les coordonnées doivent respecter les invariants de forme du GeoJSON — une LineString (et chaque ligne d’une MultiLineString) doit comporter au moins deux points, et un anneau de Polygon (ainsi que chaque anneau d’un MultiPolygon) doit être fermé et comporter au moins quatre points (voir Validation de la géométrie). Les documents malformés sont rejetés plutôt que chargés silencieusement. L’ordre des clés est souple : le type de premier niveau peut apparaître avant ou après le tableau features, et dans un objet géométrique, coordinates peut apparaître avant ou après type. L’inférence de schéma renvoie le schéma fixe ci-dessus, de sorte que DESCRIBE et SELECT ... FROM format(...) fonctionnent sans définition de table. Considérons le fichier GeoJSON london.geojson ci-dessous, qui contient un mélange de types de géométrie :
Nous pouvons interroger le fichier et examiner les types de géométrie :
Query
Response
L’extension de fichier .geojson est détectée automatiquement ; l’argument de format peut donc être omis :
Query
Nous pouvons utiliser variantType pour vérifier le type sous-jacent de chaque objet Geometry :
Query
Response
Et nous pouvons extraire les données sous-jacentes de cette manière :
Query
Response
L’accès à une sous-colonne Geometry renvoie la valeur si la ligne contient ce type, et sinon la valeur par défaut du type — (0,0) pour Point et [] pour les types basés sur des tableaux — ; utilisez donc variantType(geometry) pour déterminer lequel est présent. Nous pouvons également ingérer des données GeoJSON dans une table :
Query
Ensuite, effectuez une requête par type d’entité :
Query
Response
Nous pouvons également inférer le schéma des données GeoJSON sans définir de table :
Query
Response

Gestion des types de géométrie non pris en charge

Certains types de géométrie GeoJSON valides — tels que GeometryCollection et MultiPoint — ne peuvent pas être représentés par le type Geometry de ClickHouse. Vous pouvez contrôler le comportement lorsqu’une telle géométrie doit être stockée dans la colonne geometry à l’aide du paramètre input_format_geojson_unsupported_geometry_handling. Les valeurs possibles sont :
  • 'throw' — générer une exception (par défaut)
  • 'null' — insérer une valeur NULL dans la colonne geometry et continuer l’analyse
Ce comportement s’applique uniquement lorsque la colonne geometry est lue. Lorsque geometry ne fait pas partie des colonnes de sortie demandées (par exemple SELECT id FROM ...), une géométrie non prise en charge est tout de même validée pour vérifier qu’elle est bien formée, mais ne déclenche pas ce traitement : elle ne génère pas d’exception et n’insère pas non plus NULL, car aucune valeur géométrique n’est matérialisée.

Limites

La lecture ne restitue que ce qui correspond au schéma fixe ; certaines informations GeoJSON ne sont donc pas conservées :
  • Seuls id, geometry et properties sont produits ; les autres éléments de la structure du document ne sont pas exposés sous forme de colonnes.
  • La troisième coordonnée (altitude) d’une position, ainsi que toutes les suivantes, sont supprimées — les positions deviennent [longitude, latitude].
  • bbox et les membres externes (comme un name ou un crs au niveau supérieur, ou des membres supplémentaires dans une Feature) sont ignorés.
  • Un id numérique est stocké sous forme de texte ; la distinction entre chaîne et nombre est donc perdue ; un id absent ou null devient NULL.
  • GeometryCollection et MultiPoint ne peuvent pas être représentés — voir Gestion des types de géométrie non pris en charge.

Écriture des données

L’écriture d’un jeu de résultats produit une seule FeatureCollection GeoJSON, avec une Feature par ligne. Les colonnes du résultat sont associées à chaque Feature comme suit : La colonne de type géométrique peut être la variante Geometry ou un type Geo spécifique ; chacune correspond à un type de géométrie GeoJSON : Ring n’est pas un type de géométrie GeoJSON — un anneau linéaire est un composant d’un Polygon — donc une valeur Ring est écrite comme un Polygon à anneau unique.

Exemples

En reprenant la table london créée ci-dessus, l’export de colonnes d’attribut simples transforme chaque colonne autre que id et geometry en propriété :
Query
Response
Comme une seule colonne de type objet nommée properties est écrite telle quelle, lire un fichier GeoJSON puis le réécrire tel quel reproduit le document (les colonnes id, geometry et properties sont celles déduites pour le fichier) :
Query
Response
Une colonne id numérique est représentée sous forme de nombre JSON (un id Nullable qui est NULL est entièrement omis) :
Query
Response
Un Ring s’écrit sous la forme d’un Polygon à anneau unique :
Query
Response

Écriture dans un fichier

Utilisez INTO OUTFILE pour écrire un fichier GeoJSON côté client :
Query
Le serveur peut lui-même écrire le fichier avec la fonction de table file (l’extension .geojson sélectionne automatiquement le format) :
Query

Limitations

Les types géo de ClickHouse n’intègrent aucun système de référence de coordonnées. La sortie suppose donc que les coordonnées sont déjà en WGS84 longitude/latitude, dans l’ordre [longitude, latitude], comme l’exige la RFC 7946. Aucune reprojection ni permutation d’axes n’est effectuée. Par conséquent, des coordonnées projetées — ou des données stockées sous la forme (latitude, longitude) — produisent un GeoJSON structurellement valide, mais non conforme.
La sortie reflète uniquement ce que ClickHouse stocke :
  • Les informations perdues à la lecture — l’altitude d’une position, bbox, les membres supplémentaires et la distinction entre chaîne et nombre pour un id — ne peuvent pas être restituées ; voir Reading limitations.
  • Les coordonnées sont écrites à partir de valeurs Float64 en utilisant leur représentation réversible la plus courte.
  • Un objet properties pris directement depuis une colonne JSON est émis dans l’ordre canonique des clés du type JSON, qui peut différer de l’entrée.
Les géométries sont écrites exactement telles qu’elles sont stockées — l’ordre des coordonnées et le sens d’enroulement sont conservés. Par défaut, la validité de la géométrie GeoJSON est vérifiée à l’écriture (voir Geometry validation) : une géométrie qui n’est pas une forme GeoJSON valide, comme une LineString avec un seul point ou un anneau de Polygon non fermé, est rejetée afin que le document écrit puisse être relu. Définissez format_geojson_validate_geometry = 0 pour émettre ces géométries telles quelles, ce qui produit un GeoJSON structurellement valide, mais non conforme. L’invariant de la règle de la main droite (sens d’enroulement) n’est appliqué dans aucun des deux cas, et la distinction entre null et un objet properties vide est conservée.

Validation de la géométrie

Le paramètre format_geojson_validate_geometry détermine si le format applique les règles de forme géométrique de la RFC 7946, dans les deux sens. Il est activé par défaut. Lorsqu’elle est activée, une géométrie qui ne respecte pas les règles de forme de GeoJSON est rejetée : une LineString (ou une ligne d’une MultiLineString) comportant moins de deux points ; un anneau de Polygon ou de MultiPolygon comportant moins de quatre points, ou dont le premier et le dernier point diffèrent (anneau non fermé) ; ou une MultiLineString, un Polygon ou un MultiPolygon vide. Les mêmes règles s’appliquent aussi bien à la lecture d’un tel document qu’à l’écriture d’une telle valeur ClickHouse, de sorte qu’un document écrit peut toujours être relu. Lorsqu’elle est désactivée, ces règles de forme ne sont appliquées dans aucun sens : les géométries dégénérées sont lues et écrites telles quelles. Cela permet à des valeurs géométriques ClickHouse qui ne sont pas des géométries GeoJSON valides d’être restituées à l’identique après un aller-retour via ce format, au prix de produire des documents qui ne sont pas des GeoJSON valides. La validation est uniquement structurelle : elle vérifie le nombre de points et la fermeture des anneaux. Elle n’examine pas la validité géométrique d’une forme ; ainsi, une géométrie structurellement valide mais géométriquement dégénérée est acceptée dans les deux sens — par exemple un polygone d’aire nulle, un anneau auto-intersectant, ou un polygone dont les trous (anneaux intérieurs) se trouvent en dehors de son anneau extérieur. De même, l’orientation des anneaux de polygone selon la règle de la main droite (ordre d’enroulement) n’est jamais imposée. Une vérification est indépendante du paramètre : les coordonnées non finies (NaN, Inf) sont toujours rejetées, car elles ne peuvent pas être représentées sous forme de nombres JSON.
Dernière modification le 23 juillet 2026