Convertir un shapefile en GeoJSON pour Leaflet

samedi 3 août 2013

qgis / geojson / shapefile / leaflet / gdal / ogr2ogr

Cette semaine j’ai reçu un fichier shapefile afin d’afficher son contenu sur une carte Leaflet. Ce billet présente deux méthodes pour y parvenir.

Utilisons la commande ogrinfo pour afficher les informations de notre shapefile :

ogrinfo -al -so velo_l.shp.

La sortie de cette commande nous permet de connaître le système de coordonnées (ou SRS) du shapefile : RGF93_Lambert_93 (code EPSG:2154). Afin de pouvoir l’utiliser dans Leaflet, nous devons reprojeter les coordonnées en WGS84 (code EPSG:4326). [1]

Pour cela nous avons le choix entre deux solutions : la première utilise QGIS (logiciel de SIG avec une interface graphique) et la deuxième ogr2ogr (utilitaire en ligne de commande fourni par GDAL).

Conversion avec QGIS

Ouvrez un nouveau projet dans QGIS. Ajoutez une couche depuis le menu Couche > Ajouter une couche vecteur, sélectionnez votre fichier .shp et cliquez sur Ouvrir.

Faites un clic droit sur la couche en question dans le panneau de gauche (Couches), sélectionnez Sauvegardez sous dans le menu contextuel.

Choisissez le format GeoJSON, définissez le chemin et le nom du fichier d’export.

Remarque : vous pouvez optionnellement cocher la case Éviter la création d’attributs afin d’obtenir un fichier moins lourd en sortie. Cette option permet de ne pas exporter les informations complémentaires contenus dans le shapefile et de ne garder que les informations géométriques.

Avant d’exporter les données, il ne faut pas oublier de modifier les système de coordonnés de la couche. Cliquez sur Parcourir dans la partie SCR de la fenêtre et recherchez la référence 4326 (ou WGS84). Validez votre choix et cliquez sur OK.

Et voilà nous avons un fichier GeoJSON qui peut être affiché sur une carte Leaflet. À cette étape le fichier occupe 511,4 ko d’espace disque. Nous allons maintenant l’optimiser afin de réduire son poids [2]. Pour cela nous utiliserons le service proposé par mapshaper.org (il est aussi possible d’utiliser l’outil de simplification de QGIS).

Depuis la page d’accueil de mapshaper.org, cliquez sur le bouton select et choisissez votre fichier GeoJSON pour l’uploader. Une fois le fichier uploadé, vous pouvez régler le taux de simplification à l’aide de la réglette présente en haut de l’écran. Choisissez un taux de 50% et cliquez sur le bouton GeoJSON (en haut à droite de l’écran) pour télécharger le fichier simplifié. Notre fichier occupe maintenant 302,5 ko d’espace disque.

Nous pouvons encore réduire un peu de poids du fichier en réduisant sa précision. Pour cela nous utiliserons LilJSON qui permet de réduire le nombre de décimales du jeu de coordonnées.

python liljson.py --precision 7 velo.json > velo2.json

Et voilà, notre fichier ne pèse plus que 215,4 ko !

Conversion avec ogr2ogr

La commande ogr2ogr est fournie par le paquet gdal-bin sous Ubuntu. Exécutons la commande suivante depuis notre terminal :

ogr2ogr -t_srs EPSG:4326 -f geoJSON -lco COORDINATE_PRECISION=7 velo.json velo_l.shp

Détail des options utilisées :

  • -t_srs EPSG:4326 permet de définir le système de coordonnées à utiliser pour reprojeter les données
  • -f geoJSON permet de définir le format de sortie
  • -lco COORDINATE_PRECISION=7 permet de définir le nombre de décimales à utiliser dans les coordonnées du GeoJSON

À ce stade, notre fichier velo.json pèse 539,7 ko. Utilisons mapshaper.org pour le simplifier avec un taux de 50% et cette fois nous obtenons un fichier qui pèse 370,6 ko.

Afin de supprimer les informations complémentaires des items du GeoJSON (attribut properties), définissons la variable d’environnement ATTRIBUTES_SKIP :

export ATTRIBUTES_SKIP=YES

Puis, relançons la conversion de notre fichier :

ogr2ogr -f geoJSON velo2.json velo.json

Notre fichier pèse maintenant 246,0 ko. Nous pouvons réduire encore un peu son poids à l’aide de LilJSON :

python liljson.py --precision 7 velo2.json > velo3.json

Et voilà, notre fichier ne pèse plus que 211,1 ko !

Pour finir, voici une démonstration de ce que donne l’affichage de notre fichier GeoJSON sur une carte Leaflet.

[2Bjørn Sandvik a déjà rédigé un très bon billet à ce sujet How to minify GeoJSON files ?

Vos commentaires

  • Antoine Claval

    Bonjour,

    Je conseillerais l’utilisation de TopoJson pour réduire la taille du json plutot que liljson.
    https://github.com/mbostock/topojson/

    26 mars 2015, 12:14

  • b_b

    Salut, oui TopoJSON permet aussi de réduire le poids des fichiers GeoJSON, surtout lorsqu’ils contiennent des lignes ou des polygones. Par contre, les fichiers TopoJSON ne sont pas du GeoJSON natif et nécessitent l’utilisation d’un script pour les interpréter.

    De son côté LilJSON ne fait que réduire la précision des coordonnées et supprimer les espaces.

    26 mars 2015, 12:38

  • khalD

    Bonjour,
    Très bon article. Je voudrais savoir comment faire pour afficher le fichier GeoJson ainsi converti, avec leaflet (le fichier étant stocké sur le serveur).Le code d’intégration a leaflet notamment. Merci

    15 octobre, 18:58

  • b_b

    Salut, jette un œil sur ce tuto de Leaflet : http://leafletjs.com/examples/geojson/

    18 octobre, 20:36

Répondre à cet article

Qui êtes-vous ?
Ajoutez votre commentaire ici
  • Ce formulaire accepte les raccourcis SPIP [->url] {{gras}} {italique} <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.