Mapshaper, un outil précieux pour visualiser et affiner des fonds de carte

Un fond de carte (ou une couche) reste un objet mystérieux, dans son format comme dans son maniement numérique, pour qui n’est pas familier d’outils spécialisés comme QGIS ou tout autre logiciel SIG. Je vais vous montrer comment l’outil web Mapshaper peut spectaculairement vous simplifier la tâche, que vous soyez novice ou géomaticien chevronné. 

Zones d'emploi 2020, Île de France et Droms déplacés, ZE multi-régionales en orange

Plus précisément nous allons voir ici comment, avec un simple navigateur :

  • visualiser une couche cartographique vectorielle (format shp ou geojson),
  • reprojeter une couche,
  • déplacer certains territoires,
  • agréger une couche en regroupant des entités géographiques,
  • personnaliser le style (contour, remplissage) des objets géographiques,
  • apparier un fond de carte et un fichier csv,
  • exporter le résultat de son travail vers divers formats géographiques, statistiques ou graphiques,
  • comparer 2 couches polygonales (2 zonages), visualiser leurs intersections,
  • ajouter des formes géométriques simples.

Cet exposé est plutôt technique. Mais vous pouvez dans tous les cas reproduire vous-même toute la séquence.

L’Insee vient de publier la nouvelle définition des 306 zones d’emploi (2020) et met à disposition un fond de carte (au format shapefile) zippé. J’ai souhaité travailler ce fond de carte en vue d’analyses statistiques ultérieures. Mon exploration a nourri cet article.
 

Chargement du fond de carte dans Mapshaper

La première chose à faire pour visualiser rapidement un fond de carte, c’est donc d’aller sur mapshaper.org, vous pouvez par simple glisser-déposer y charger votre fichier, zippé ou pas.

Allons-y donc avec ce fond_ZE2020_geo20.zipIl s’affiche en un clin d’œil. Mais avec ce fichier proposé par l’Insee, double surprise, l’étendue est bien large, les Droms (départements et régions d’outre-mer) figurant à leur vraie position géographique, et il semble y avoir un peu plus que 300 entités géographiques !

Métropole, Antilles, Guyane, Mayotte et la Réunion

L’icone flèche de l’interface active les fonctions de survol et je comprends assez vite qu’il s’agit d’un fond communal (cf. champs code et libelle), dans lequel figurent toutefois 2 informations complémentaires : le code (ze2020) et le libellé (lb_clst) de la zone d’emploi englobante. J’ai donc a priori suffisamment d’information pour constituer le vrai fond de carte des zones d’emploi 2020. J’aimerais aussi le rendre plus compact, en rapprochant les Droms de la métropole.

J’ouvre la console (bouton en haut à droite), et entre :
-info
Le message renvoyé me précise que j’ai affaire à une couche de 34 968 polygones, dans un système longitude/latitude (non projeté). Sans trop réfléchir, je tape alors les lignes suivantes :
-proj crs=epsg:3857 \
-affine where="code.indexOf('971')==0" shift=6355000,3330000 scale=1.5 \
-affine where="code.indexOf('972')==0" shift=6480000,3505000 scale=1.5 \
-affine where="code.indexOf('973')==0" shift=5760000,4720000 scale=0.35 \
-affine where="code.indexOf('974')==0" shift=-6170000,7560000 scale=1.5 \
-affine where="code.indexOf('976')==0" shift=-4885000,6590000 scale=1.5 \
-rename-layers fond_com2020
Vous pouvez copier/coller ce bloc dans la console, ce qui devrait vous amener, après Entrée, à ceci :
Un joli fond reprojeté et compact, avec les Droms rapprochés
Cette disposition me va bien. Toujours saisi par l’inspiration, je rajoute :
-dissolve ze2020 +
Fond compact des zones d'emploi 2020 !

Plutôt pas mal ! Je suis déjà tout proche de ce que je voulais créer, une couche de 306 zones d’emploi, compacte, réutilisable. C’est le moment de détailler la signification de ces commandes tapées dans la console Mapshaper.

Une chaine de commandes peut s’écrire sur plusieurs lignes, la fin de ligne étant matérialisée par un \ (précédé d’un blanc). Les commandes Mapshaper commencent par un et peuvent donc s’enchaîner dans un tunnel de traitements

J’ai d’abord reprojeté avec -proj la couche communale vers un système métrique classique, la projection dite de Mercator, codée selon la norme EPSG avec 3857. Cette projection va ici me simplifier l’étape suivante, consistant à rapprocher les Droms, sans trop les déformer. J’aurais pu écrire cette ligne de façon alternative -proj webmercator, des alias sont disponibles pour les projections les plus courantes (taper projections pour les afficher).

Les lignes -affine translatent, puis agrandissent ou rétrécissent chacun des Drom afin de les aligner plus ou moins harmonieusement sous la métropole. Je suis amené ici, dans un souci de lisibilité, à agrandir les Antilles et les îles de l’océan indien, et à réduire la Guyane, relativement aux territoires métropolitains. Ces instructions de déplacement (ajustables) sont à conserver précieusement, car je peux vouloir les appliquer, plus tard, à d’autres couches ajoutées (villes, etc.) pour conserver un alignement parfait sur mes Droms rapprochés.

Nombre de commandes ont un paramètre de filtrage possible, sous forme d’une instruction javascript (where= »… »

Enfin, l’opération la plus spectaculaire est la fusion géométrique, agrégeant les communes en zones d’emploi. Il suffit de préciser, après la commande -dissolve, la variable de regroupement.

Le signe + en fin de commande indique à Mapshaper qu’il faut créer une nouvelle couche. Sinon, c’est la couche courante qui sera remplacée par le résultat du traitement.

Affinage et export de la couche des zones d’emploi 2020

Le bouton flèche (ou la commande -info) m’informe que cette couche des zones d’emploi n’a qu’une colonne (ze2020). Le fond est par ailleurs dénommé d’une façon inesthétique ([unnamed layer]). Ajustons cela :
-target fond_com2020 \
-dissolve ze2020 copy-fields=lb_clst + name=fond_ze2020 \
-rename-fields lib_ze=lb_clst -style fill='#f6f6f6' stroke='#ddd' \
-dissolve + name=contour_france -lines -style stroke='#666' stroke-width=1.5
Explications : par défaut, une commande opère sur la couche active (la dernière créée ou modifiée par exemple). Si je veux reprendre un traitement sur une autre couche (ici, je veux repartir de fond_com2020), je la cible au préalable avec la commande -target.

Pour préciser la ou les colonnes additionnelles à conserver lors de la fusion géométrique (ici le libellé des zones d’emploi), j’utiliserai après -dissolve le paramètre copy-fields. Après le +, le name nomme la couche résultat du traitement.  La commande -rename-fields renomme une colonne de façon plus lisible. Un style graphique (léger grisé avec contours) est affecté aux zones d’emploi. Je crée enfin une nouvelle couche de contour général de la France, convertie en polyligne, pour rehausser l’ensemble.

L’interface de Mapshaper offre quelques possibilités d’actions plus simples, pour supprimer des couches, les renommer, les réordonner, en contrôler la visibilité, il suffit de dérouler la liste figurant au-dessus de la carte. 

Le bouton export propose une batterie de formats possibles, soit de type SIG, que je pourrai retravailler dans un logiciel spécialisé comme QGIS, ou D3/Observable en topojson, soit SVG pour affinage par exemple dans Illustrator ou affichage dans une page web. Je choisis un export Shapefile de la couche fond_ze2020. Un zip est généré, que je peux faire « glisser », par exemple, dans l’interface de QGIS, si j’ai cet outil SIG dans ma mallette personnelle. Comme on peut le constater, cette couche est parfaitement géoréférencée et réutilisable. J’aurais pu la simplifier au préalable, via le bouton Simplify, en convoquant de puissants algorithmes de généralisation (cf. article à venir).

Fond des zones d'emploi dans QGIS, par dessus une couche OpenStreetMap

D’où vient Mapshaper ?

C’est un outil créé et activement maintenu par Matthew Bloch, qui travaille aujourd’hui au New-York Times. Il a initié ce projet en 2005, sous la supervision de Mark Harrower de l’Université du Wisconsin. J’ai eu le plaisir d’échanger avec Matthew dès 2007, nous partagions à l’époque le même engouement pour Flash/Actionscript, PHP et les optimisations de performance de rendu web. Mapshaper est en effet d’une vélocité et d’une fluidité incroyable, je connais peu de programmes capables d’afficher des fonds de carte volumineux aussi vite, avec zoom et interactivité fluides (à part Géoclip, et même mieux que Géoclip…)

Bloch et Harrower ont construit Mapshaper à partir de 2 fonctionnalités-clés : un algorithme de décomposition topologique (bien avant que Mike Bostock – D3 – ne popularise le format topojson), et un process de généralisation privilégiant l’algorithme de Visvalingam-Whyatt, plus efficace que le classique Douglas-Peucker. Mapshaper a évolué pour répondre aux besoins très pratiques des data-journalistes du New-York Times, tout en restant libre d’accès et open-source. Matthew est toujours à l’écoute de « feature requests », même s’il a peu de temps libre.

Cette carte, préparée avec Mapshaper avec la commande -clip et réalisée par Tim Wallace, un collègue de Matthew, a été primée au 25ème concours international d’infographie de presse Malofiej.

Les fonctions décrites dans cette page ne représentent qu’une fraction des possibilités de Mapshaper, raison pour laquelle il y aura trois autres articles ! Mais celui-ci n’est pas encore terminé, restons concentrés !

Ajout des nouvelles régions 

Les zones d’emploi s’inscrivent pour la plupart dans les régions administratives, sauf 14 d’entre elles. Il est parfois utilisé une variante dite « régionalisée » du maillage des zones d’emploi (ZE), qui subdivise ces ZE à cheval sur plusieurs régions. 

Nous allons donc voir comment avec Mapshaper comparer zones d’emploi et régions, identifier les ZE multirégionales, constituer le zonage alternatif découpé strictement selon les régions. Ces opérations topologiques nécessitent habituellement d’en passer par des bibliothèques géographiques spécialisées. Avec Mapshaper, aucun logiciel à installer, un simple navigateur web suffit.

Le fait d’être parti d’un fond communal nous facilite la tâche, nous pouvons essayer de l’agréger par région. Comme nous avons déplacé les Droms, nous obtiendrons une couche cohérente avec celle des zones d’emploi. Il nous manque juste pour le moment l’information « code région », qui ne figure pas dans le fond de carte proposé par l’Insee. Qu’à cela ne tienne, nous allons chercher la correspondance commune => région dans un fichier csv externe, et l’ajouter au fond communal par jointure.

Sur cette page Insee, j’accède à la liste des communes en géographie 2020, format csv, avec un code région associé, téléchargeons donc le fichier csv zippé proposé, pour l’importer dans Mapshaper par glisser/déposer. Pour déjouer un petit piège de conversion caractère => numérique, je précise une option string-fields=* (sans quoi un code 01 risque de devenir 1) : tous les champs importés seront typés caractère par défaut.

Une grille de points apparait à l’écran, c’est simplement parce que ce csv n’est pas un fond de carte. Entrons ces instructions de filtrage puis de jointure, notre fond communal va réapparaître :
-filter target=communes2020 "typecom=='COM'" \
-join target=fond_com2020 communes2020 keys=code,com fields=reg
Un filtrage préalable du csv s’impose ici car cette liste de communes comprend aussi des communes déléguées, ce qui amène à des doublons de code Insee. La commande -join précise la clé de jointure entre les deux tables (fond géographique des communes et nouvelle liste des communes), et permet de spécifier la seule colonne nouvelle (reg) que l’on veut ainsi injecter dans le fond géographique (sinon, toutes les colonnes du fichier joint seront ajoutées).
Au survol de fond_com2020, je peux maintenant vérifier que le champ reg est bien présent. Je vais maintenant fusionner les communes en régions. La nouvelle couche polygonale ainsi créée (nommée fond_reg2020) est ensuite convertie en une couche de polylignes. Cette couche de limites régionales est plus légère que la couche polygonale dont elle est dérivée, car les frontières communes à deux régions ne sont décrites qu’une fois : c’est l’un des charmes de la décomposition topologique ! Mapshaper ajoute un attribut TYPE permettant de différencier les frontières intérieures des autres. Nous l’utilisons pour affecter un style graphique différent au contour général de la France.
-dissolve target=fond_com2020 reg + name=fond_reg2020 \
-lines + name=contour_reg \
-style stroke="#999" where='TYPE == "inner"' \
-style stroke="#333" where='TYPE == "outer"'
Régions avec un style différent pour les limites intérieures, par dessus les zones d'emploi en gris
Sur la page Insee du Code officiel Géographique utilisée précédemment, nous téléchargeons cette fois le fichier csv des régions, afin de récupérer le libellé des régions. Nous l’insérons dans Mapshaper par glisser/déposer, toujours avec l’option string-fields=* , et déclenchons l’appariement :
-join target=fond_reg2020 region2020 keys=reg,reg fields=libelle \
-rename-fields lib_reg=libelle
Nous voilà donc avec un fond des régions, tout à fait cohérent et superposable au fond des zones d’emploi.

Filtrage des zones d’emploi d’une région choisie

Examinons ce cas d’école : je m’intéresse à la région Hauts-de-France et ses zones d’emploi. Comme 2 ZE débordent en Normandie, je peux envisager 3 variantes pour cartographier :
  1. les ZE entièrement comprises dans les Hauts-de-France (ne couvrant pas toute la région),
  2. les ZE strictement réduites aux Hauts-de-France, év. découpées pour ne garder que la partie Hauts-de-France (notion de ZE régionalisées, formant une partition de la région),
  3. les ZE qui intersectent d’une manière ou d’une autre les Hauts de France (débordant parfois).

Dans un logiciel SIG ou une base de données spatiale, je peux utiliser des instructions du type contain, intersect, within… Mais elles ne sont pas disponibles dans Mapshaper, ce qui m’oblige à faire preuve d’imagination. Je vais utiliser la commande -clip. Au préalable, je cible la région Hauts-de-France que je place dans une nouvelle couche reg32 :
-target fond_reg2020 -filter "reg=='32'" + name=reg32 \
-target fond_ze2020 -each "area=this.area" \
-clip reg32 + name=zeclipped32 -each "typo_clip=area==this.area?0:1" \
-style fill="typo_clip==1?'#e8f5f5':'#fef8ed'" \
-lines target=reg32 -style stroke-width=1.5 stroke='#1e9b9e'
J’ai ensuite stocké dans une variable area la surface de toutes les ZE de France, ce qui me permet de la confronter avec la nouvelle surface des ZE après application du -clip par la région 32. Si égalité il y a, la ZE est bien complète, sinon, c’est qu’elle est découpée. La variable typo_clip me permet de distinguer les 3 cas de figure ci-dessus. Je joins enfin les couches fond_ze2020 et zeclipped32 pour filtrer à ma guise :
-target fond_ze2020 -join zeclipped32 fields=typo_clip keys=ze2020,ze2020 \
-target fond_ze2020 -filter 'typo_clip==0' + name=ze32_v1 \
-style fill='#fef8ed' \
-target fond_ze2020 -filter 'typo_clip!==null' + name=ze32_v3 \
-style fill="typo_clip==1?'#e8f5f5':'#fef8ed'"
Zones d'emploi intéressant la région Hauts-de-France

Comparaison topologique entre zones d’emploi et régions pour toute la France

Nous disposons de deux fonds France entière cohérents, fond_ze2020 et fond_reg2020, nous allons pouvoir les comparer et analyser leurs intersections de façon plus globale.
-drop target=fond_com2020 \
-merge-layers target=fond_ze2020,fond_reg2020 force name=fond_ze2020_reg \
-mosaic target=fond_ze2020_reg calc='ze2020=min(ze2020),reg=min(reg)' \
-filter 'ze2020 !==null' \
-dissolve fields=ze2020,reg
-drop libère un peu de mémoire en supprimant la couche communale dont nous n’avons plus besoin (pas indispensable, mais c’est bien de faire le ménage de temps en temps). -merge-layers concatène les deux couches, ajoutant donc les régions aux ZE, le paramètre force fait que les colonnes de l’une et de l’autre sont toutes récupérées (on retrouve donc deux colonnes ze2020 et reg, partiellement remplies). -mosaic analyse les superpositions entre objets de la couche, et les découpe en fonction, de façon à obtenir une mosaïque d’objets plus petits, sans chevauchements. calc permet d’affecter à chaque objet découpé à la fois le code ze2020 et le code reg. Un dernier dissolve s’impose car -mosaic individualise toutes les petites îles.
Comme le confirmera la commande -info, Nous sommes passés de 306 zones d’emploi à 320 zones d’emploi régionalisées, 14 ZE ont ainsi été divisées car elles chevauchaient une frontière régionale. Comment puis-je les mettre en évidence ? Les familiers de la logique SQL auront déjà trouvé la réponse. Je vais regrouper cette couche des ZE régionalisées par code ze2020, en comptant le nombre de régions associées. La variable nreg ainsi créée est testée pour affecter une couleur orange aux ZE à cheval :
-dissolve fields=ze2020 calc='nreg=count()' + name=ze_reg \
-style fill="nreg>1?'#f4b84d':'#f6f6f6'" stroke="nreg>1?'purple':'#ccc'"
Zones d'emploi à cheval sur 2 régions mises en évidence en orange

Touche finale : déplacement de l’Ile-de-France et ajout de cadres

Je déplace et agrandis l’Ile-de-France, à l’instar de ce qu’il est fréquent de faire avec Paris et sa petite couronne, pour mieux visualiser les phénomènes qui les concernent :
-affine target=ze_reg where="ze2020.substr(0,2)=='11'" shift=-650000,275000 scale=1.5 \
-dissolve target=ze_reg + name=newcont -style stroke='#666' -lines
Je cible les Droms pour dessiner un rectangle qui les englobe, puis je procède de même pour l’ensemble de la couche :
-target ze_reg -filter "ze2020>='01' && ze2020<'11'" + name=droms \
-rectangle offset=5km \
-rectangle target=ze_reg offset=20km + name=cadre \
-merge-layers target=droms,cadre name=cadre -lines -style stroke='#1e9b9e'

Conclusion

Mapshaper nous a permis de de réaliser des opérations puissantes et élaborées sans besoin d’installer un logiciel spécialisé en traitements spatiaux. Il est capable d’opérer sur des fonds de carte habituels en usage statistique (France, voire Europe par commune) sans ciller. Il faut certes maîtriser un langage de commandes pour en exploiter tout le potentiel, et l’objet ici n’est pas de les retenir par cœur, mais de savoir qu’elles existent et ce qu’elles permettent de faire. L’instruction -help donne le détail des paramètres de chaque commande (par exemple -help affine).

Il est possible de se passer des commandes de la console, en utilisant les menus de l’interface, pour mettre en œuvre des opérations simples mais néanmoins très utiles :

  • charger un fond de carte shp et le convertir en geojson ou topojson pour le réutiliser dans un autre outil requérant ces formats,
  • simplifier un fond de carte pour le rendre plus facilement publiable sur le web (cf. prochain article),
  • et tout simplement visualiser un fond de carte vectoriel, quel qu’il soit, quand la plupart des autres services en ligne explosent à partir d’un certain volume.

2 commentaires sur “Mapshaper, un outil précieux pour visualiser et affiner des fonds de carte”

  1. Bonjour M Mauvière,

    Je tombe sur votre article (un peu ancien je le conçois) car je cherche à utiliser Mapshaper pour créer mes propres fonds de carte

    Dans l’exemple que vous présentez, la fonction affine m’intéresse particulièrement car je cherche également à regrouper l’ensemble des territoires d’outre mer (dans mon cas sont inclus la Polynésie Fr, Nouvelle-Calédonie etc. avec le reste du territoires

    Je ne cherche donc pas à me claquer exactement sur l’exemple présenter, mais bien à m’appuyer sur le format pour obtenir un résultat similaire. Etant cependant totalement novice en la matière, je ne parviens pas à le faire : de ce que je comprends, le « code.indexOf » utilisé est une expression Javascript pour faire comprendre à MS ce que l’on souhaite déplacer (sans certitude), mais de mon côté, c’est un message d’erreur qui est renvoyé

    Auriez-vous la possibilité d’éclairer sur l’utilisation de la fonction affine dans MS ? D’autant plus précieux que les tutoriels sur le sujet (francophone de surcroit) ne sont pas légion…

    Un grand merci par avance, si ce message vous trouve !

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *