Makina Blog

Le blog Makina-corpus

Réduire le poids d'un GeoJSON


Présentation de plusieurs techniques pour diminuer la taille d'un GeoJSON

Le format GeoJSON est largement utilisé en webmapping. La conversion directe de données géographiques vers le GeoJSON peut produire des fichiers de taille trop importante, qui seront longs à charger et à exploiter. Plusieurs techniques permettent de réduire le poids de ces fichiers.

Ce billet de blog prendra l'exemple des régions dans OpenStreetMap, pouvant être téléchargée dans les exports d'OpenStreetMap France.

Fichier GeoJSON initial

Le fichier téléchargé est au format shapefile. La conversion de ces données au format GeoJSON produit un fichier de 44,7 Mo : c'est beaucoup trop important pour le web.

Les opérations d'allègement dépendront de l'usage souhaité des données. Le cas fictif traité ici est de présenter une vision globale de la France et d'avoir comme attribut le code de la région (pour une jointure éventuelle).

Simplification géométrique

La première étape est de simplifier la géométrie des régions, dont la résolution est beaucoup trop importante pour ce que l'on souhaite faire. Un bon outil pour cela est mapshaper : l'interface web est très réactive et la simplification est topologique, c'est à dire qu'elle ne crée pas de vides entre deux polygones par exemple.

Dans notre exemple, une simplification à 0,5% (c'est à dire une division par 200 du nombre de points) permet d'obtenir un fichier de 214 ko : c'est déjà bien mieux ! L'image suivante présente les contours des régions avant et après simplification : le résultat obtenu est suffisant pour l'échelle à laquelle la carte sera affichée.

Suppression des décimales inutiles

En observant le GeoJSON obtenu, on remarque que la précision des coordonnées est beaucoup trop importante : une latitude est par exemple notée 44.304137114679435, soit 15 décimales. Une règle de conversion approximative est de considérer qu'un degré équivaut à 100km : 15 décimales correspond donc à une précision de 10-10 m, soit le rayon d'un atome.

Deux décimales sont satisfaisantes dans notre cas, puisque la précision sera d'environ 1 km. On peut utiliser ogr2ogr pour cela :

ogr2ogr -f "GeoJSON" -lco COORDINATE_PRECISION=2 initial.json simplifié.shp

Le fichier obtenu ne pèse plus que 98 ko.

Conserver uniquement les attributs utiles

Supprimer les colonnes inutiles permet d'alléger encore un peu le fichier : seule une colonne NOM est supprimé dans notre cas et le nouveau fichier pèse 97 ko. Le gain est faible ici mais est souvent bien plus important, sur des tables à plusieurs dizaines de colonnes.

Aller plus loin

La taille du nouveau fichier est 460 fois plus faible qu'initialement, et 97 ko ne posent pas de problème à être transférés. Les données sont suffisantes et ces étapes de simplification sont effectuées rapidement.

D'autres possibilités permettraient de réduire encore la taille, par exemple :

  • la minification du JSON pour supprimer les espaces et les retours à la ligne
  • l'utilisation du TopoJSON ou d'un format binaire
  • la compression gzip sur le serveur

Actualités en lien

Image
Capture d'une partie de carte montrant un réseau de voies sur un fond de carte sombre. Au centre, une popup affiche les information de l'un des tronçons du réseau.
28/02/2024

Géné­rer un fichier PMTiles avec Tippe­ca­noe

Exemple de géné­ra­tion et d’af­fi­chage d’un jeu de tuiles vecto­rielles en PMTiles à partir de données publiques.

Voir l'article
Image
Encart article Protomaps : Illustration d'une portion de pyramide de tuiles
14/02/2024

Protomaps, stockez vos pyramides de tuiles plus simplement

Présentation d'un nouveau format de stockage de tuiles cartographiques

Voir l'article
Image
Article : Servir sa couche raster QGIS en tuiles sans effort avec le format PMTiles
25/01/2024

Servir sa couche raster QGIS en tuiles sans effort avec le format PMTiles

Cet article vous présente une approche permet­tant de tuiler et de publier une couche raster fabriquée avec QGIS.

Voir l'article

Inscription à la newsletter

Nous vous avons convaincus