Limites administratives simplifiées

Depuis que l'ensemble des limites administratives des communes françaises ont été tracées dans OpenStreetMap, un besoin d'une version simplifiée de ces limites s'est fait sentir.

En effet, le tracé fait par les contributeurs OpenStreetMap approche la précision du cadastre or pour de nombreux usages, ces tracés s'avèrent trop lourds à manipuler.

Il n'y a pas moins de 9 millions et demi de points dans ces 36680 polygones, ce qui représente un jeu de données de plus de 250Mo de data bien difficile à manipuler pour des besoins cartographiques à petite ou moyenne échelle.

Mais comment simplifier plus de 36000 polygones tout en gardant une cohérente topologique entre eux ?

postGIS possède bien une commande ST_SimplifyPreserveTopology, mais c'est la topologie de chaque polygone qui est conservée sans cohérence entre 2 polygones ayant une frontière commune.

Du coup cela donne un résultat de ce type:

Ou voit que les polygones ne sont pas jointifs, ce qui bien sûr n'est pas le but recherché, l'objectif étant celui-ci:

Il existe des outils en ligne comme mapshaper, mais je doute qu'il puisse traiter autant de données d'un coup (j'avoue ne pas avoir testé).

Je voulais aussi produire un autre jeu de données, celui non pas des polygones des communes, mais des linéaires des frontières, afin à terme de les dessiner plus proprement dans le rendu "FR" car actuellement ces limites sont tracées polygone par polygone et donc tracées 2 fois dans la majorité des cas, ce qui empêche d'avoir un pointillé cohérent, voire d'autres tracés plus utiles qu'un simple pointillé.

L'objectif aussi est de faire tout ça avec postGIS... pour pouvoir l'intégrer à la base osm2pgsql utilisée par le rendu FR.

Donc l'idée est de :

  • recréer les linéaires des frontières
  • simplifier ces linéaires en vérifiant qu'il n'y a pas d'intersection dûe à la simplification
  • moins simplifier ceux qui se croisent
  • recréer les polygones
Après avoir démarré initialement en pur postgis, j'ai voulu utiliser les extensions topologiques de postgis qui permettent de gérer ce genre de choses, mais les temps de traitement semblent bien trop long et inadaptés à un tel volume de géométries à simplifier. Retour donc à du pur postgis...
 
Je vous passe (pour l'instant) les détails, mais ça y est, le résultat est atteint après un long week-end passé sur le sujet à fouiller la doc de postGIS, celle de postgres et aussi à corriger des limites de communes qui n'étaient pas correctes (chevauchements sur des intersections, îles mises dans 2 communes différentes, etc).
 
Le résultat ce sont 3 fichiers shapefile contenant les polygones simplifiés des communes françaises avec 3 niveaux de simplification différents (10, 100 et 250) qui correspondent grosso-modo à une simplification à 5m, 50m et 100m (voir ici).
Du coup, on passe d'un shapefile de 250Mo à 85, 22 et 12Mo.
 
Sur la todo list:
  • extraction des limites linéaires
  • utilisation de ces limites linéaires dans le rendu FR
  • scripter le processus pour produire ces fichiers remis à jour quotidiennement
  • le généraliser pour d'autres découpages...

Ces fichiers simplifiés sont référencés sur data.gouv.fr: http://www.data.gouv.fr/fr/dataset/decoupage-administratif-communal-fran...

Commentaires

As-tu jetté un oeuil à TopoJSON ? Ça ne remplis pas le critère "intégré à PostGIS", mais ça a l'air de faire tout le reste, et a l'avantage d'être un projet public mature, et à priori bien optimisé. https://github.com/mbostock/topojson/wiki