2021 dans le rétro

Cela fait longtemps que je n’ai pas écrit d’article sur mon blog.

Je me suis dit que ce début d’année 2022 était l’occasion de parler de mes projets les plus marquants de 2021 réalisés au Cerema ou sur mon temps propre.

C’est comme regrouper en un seul article tous les articles que j’aurais pu écrire (dû ?) en 2021.

Vous verrez que pour moi, 2021 a été beaucoup été question de qualité et de standardisation, ainsi que de (géo)dataviz. Mais aussi de musique.

Formation “La data dans les territoires” avec OpenDataFrance

Avec l’association OpenDataFrance, j’ai animé début 2021 quelques sessions de formation en webinaire intitulées “La data dans les territoires”.

J’ai eu l’honneur d’ouvrir les sessions en animant le module : “La data, kezaco ?” afin d’expliquer ce qu’est une donnée, lister les typologies de données avec des analogies : la donnée brute comme le cristal, celle enrichie comme un verre ou harmonica de cristal, parler des API, des licences, … en essayant d’être le moins technique possible.

J’ai aussi animé le troisième module autour de l’écosystème des données en présentant les acteurs de la donnée, ce qu’ils font, et les relations qu’entretient la donnée avec la société civile : les répercussions d’une data déséquilibrée sur les disparités de politiques publiques de plus en plus propulsées par les données, mais aussi les discriminations engendrées par des biais dans l’IA. A ce titre, ne pas hésiter à suivre les webinaires “Automating Society”.

Schéma sur les arrêtés de circulation pour le transport de marchandises

On the standardization road again

Avec La Région Sud, OpenDataFrance, et le concours d’Etalab, dans le cadre de la Fabrique de la Logistique, nous avons travaillé au Cerema sur la dématérialisation des arrêtés de circulation pour le transport de marchandises.

Au tout départ, un environnement de saisie SIG, sous QGIS, était envisagé, mais de fil en aiguille, l’idée de créer un schéma de données nous a semblés la plus pertinente, sous les conseils de Jean-Marie Bourgogne d’OpenDataFrance.

Le schéma est aujourd’hui publié sur schema.data.gouv.fr et accompagné de tutoriels qui expliquent pas à pas comment dématérialiser l’information de véritables arrêtés municipaux. D’ailleurs, je me dis que pour chaque schéma, il serait intéressant de proposer des tutoriels pour accompagner les producteurs dans la saisie.

Les vertus de ce schéma ont été celles-ci : il a permis de regrouper des acteurs, de réfléchir à un modèle de remplissage d’informations qui soit le plus appréhendable possible par des agents en Collectivités à qui l’on confierait la tâche de saisie. Enfin, la publication d’un schéma sur schema.data.gouv.fr entraîne de facto l’éclosion d’un validateur de données, et d’un assistant pour la création de données. Sympa, non ?

L’idée de ce schéma était de regrouper dans un tableau l’ensemble des informations utiles, issues d’arrêtés réglementant la circulation en ville de véhicules logistiques sur certaines rues, à certaines heures de la journée, tout en restant accessible et réutilisable.

MCDto2DCSV Challenge

Un défi majeur, que nous avons tenté de relever, était de concentrer un modèle initialement relationnel dans un modèle tabulaire en 2 dimensions : le fameux CSV. L’adoption d’Opening Hours d’OSM, qui devient aujourd’hui un standard dans les standards, l’utilisation de champs à valeurs multiples avec référentiel de valeurs dans certains cas, et dans d’autres non (pour permettre assez de souplesse) nous ont aidés.

En parallèle à ce schéma, j’ai créé un assistant en ligne pour aider les producteurs de données appelé groom-groom.

groom-groom (https://cerema-med.shinyapps.io/groom-groom)

Groom-groom fournit un assistant pour remplir certains champs très techniques : les jours et horaires au format Opening Hours, les géométries de rues au format KWKT, des champs multiples.

Des collaborations avec des villes du Sud vont commencer pour aboutir aux premiers jeux de données d’arrêtés sur DataSud. Cela permettra d’éprouver le standard, même si nous avons déjà pu le mettre à l’épreuve de plusieurs arrêtés.

La qualification d’une donnée ne peut exister selon moi sans spécifications concernant celle-ci, soit sans standard, et la production de données de qualité dépend aussi de la présence de standards qui soient de qualité.

Validator

En même temps que je prenais connaissance de schema.data.gouv.fr et de la norme TableSchema qui propulse ses schémas, nous devions, dans le cadre du projet Cartofriches auquel je participe, consolider des données multi-sources, issues de partenaires divers et variés.

Je me suis alors posé la question d’un validateur de données qui permette de prendre connaissance des données d’entrée, et de réaliser une conversion d’une structure originelle à une structure cible.

Validator intègre un standard, un visualisateur de données et un transformateur d’une structure à une autre. Validator est écrit en python.

J’avais de prime abord regretté la technicité du standard TableSchema au format JSON. Aussi, pour validator ai-je utilisé un tableau CSV car il est plus facilement modifiable qu’un fichier JSON. Aussi, souvent, un tableau, par exemple sous framacalc, constitue la pierre angulaire des premières collaborations autour des standards, avant la constitution du fichier JSON.

Validator m’a permis de consolider mes connaissances en python tout en bénéficiant des conseils éclairés de Mathieu Morey de Datactivist, grâce auquel j’ai appris l’existence de plein de librairies intéressantes, dont black, typer, pydantic.

A noter que j’aurais des idées afin d’implémenter la dimension géo dans TableSchema. Je partagerai ces idées dans un nouveau billet de blog.

Quadogeo

La planète ISO, une planète où tout le monde est dans la norme

Le groupe Quadogeo, sous l’égide du CNIG, s’intéresse à la qualité des données géographiques.

Une donnée géographique est composée de deux composants principaux. Le premier concerne ses dimensions géographiques, le second ses dimensions attributaires.

Déjà beaucoup de ressources méthodologiques sur la qualité des données existent sur le net, créées par OpenDataFrance, la FING, Datactivist, mais peu concernent la dimension géographique, à l’exception de certains documents IGN ou Certu, que le groupe Quadogeo s’est proposé, justement, de remettre au goût du jour.

Les dimensions géographiques, comme vous le savez déjà, concernent la localisation et la forme d’objets dans l’espace.

En aparté, question que je pose souvent à des apprenants : “Quelle proportion de données géographiques existe parmi toutes les données existantes ?” On la retrouve quasiment partout. Même si la donnée n’existe pas toujours à des formats spatiaux type shapefile ou geopackage, la simple mention d’une adresse, d’une commune ou d’une référence cadastrale dans un fichier en fait une donnée géoréférençable et spatiale. Et force est de constater que peu de jeux de données échappent à ces attributs de localisation.

Revenons à la qualité : le groupe Quadogeo me donne l’occasion de m’intéresser à la qualité des données, pas forcément dans sa dimension géo, mais de manière générale, et à des initiatives de qualification et d’impact de jeux de données tels qu’évalués dans d’autres pays, comme au Canada à Toronto.

Aussi, le groupe me permet d’expérimenter et mettre au point des outils de contrôle et de qualification des dimensions spatiales d’une donnée, comme le modeste quadorender.

J’ai aussi pu prendre connaissance, par ce groupe, d’initiatives telles que le Geospatial User Feedback, Interlis, des plugins QGIS comme QompliGIS, qui visent pour le premier à collecter le ressenti qualité des usagers, pour les seconds, à formaliser, spécifier et contrôler la donnée dans sa dimension géo.

Webinaires qualité des données géos

RéGIS, le gaffeur de la géodata

Le Cerema avait produit une série de fiches autour de la qualité, mais avec le CRIGE, nous avons souhaité aller plus loin, en réalisant 5 webinaires autour de la qualité des données géographiques.

Ces webinaires, d’une durée chacun de 2h30, se déroulent en deux phases : une présentation théorique des mesures de qualité, et une mise en application concrète avec QGIS.

Lors de ces sessions, assurées par Stéphane Rolle du CRIGE PACA et moi-même, nous avons misé sur l’humour, nécessaire pour aborder un sujet aussi “effrayant” que la qualité, en incarnant un personnage gaffeur appelé Régis (si vous avez pigé, il y a un petit jeu de mots avec GIS pour Geographical Information Systems).

Régis fait des bêtises de digitalisation, de saisie de données que nous nous empressons de détecter et de quantifier.

Ces webinaires ont permis de donner une tangibilité aux fiches qualité via des applications pratiques, reproductibles, sous QGIS, d’aller à la rencontre des utilisateurs, et de collecter des remarques très pertinentes sur la qualité de la part des participants, remarques qui permettront de solidifier le contenu de formation.

Master Dataviz Mois dans le cadre de l’Innovation Publique

Dans le cadre du Mois de l’Innovation Publique 2021, j’ai été invité à animer une masterclass autour de la Dataviz.

Le contenu de cette masterclass est disponible en Open à cette adresse : https://github.com/datagistips/dataviz-masterclass

Aussi, la masterclass est disponible en format web ici : https://datagistips.github.io/dataviz-masterclass/

Il se compose d’une petite introduction à la dataviz, en passant en revue des dataviz marquantes, comme celle de Charles-Joseph Minard, en proposant des notebooks qui explorent la couleur, confrontent les camemberts aux graphiques en barres.

Enfin, cette masterclass aborde pas à pas, commit après commit, la création d’une application autour de données sur l’artificialisation, données consolidées par le Cerema.

Cette masterclass permettra d’initier un module de formation autour de Shiny au MTE.

D3

Amoureux de la représentation des données, D3 m’a fourni l’occasion d’apprendre le javascript via la dataviz, de façon ludique et pratique.

Sur la base des données ouvertes de trafic que nous avons publiées suite au Covid, je me suis amusé à produire quelques notebooks autour de D3 et du jeu de données trafic COVID.

Par exemple, une façon de visualiser la baisse et la rehausse trafic en animation

Là, c’est statique, mais en cliquant, vous aurez l’animation

Comme disait Laurent Jégou, chaque apprentissage nécessite d’intellégir, à savoir appliquer ses connaissances, immédiatement à quelque chose de tangible, qui nous soit utile.

J’ai encore quelques projets D3 en gestation, telles qu’une transposition des Covid sparklines sous D3, ce qui me permettra d’apprendre à manipuler le côté spatial des données sous D3.

J’ai été très étonné de voir le fourmillement de l’univers Javascript dans D3, en pleine ébullition.

D’ailleurs, il y a un très bon fil twitter de Tom Février sur javascript.

J’ai appris dans ce fil que Jeff Atwood, le créateur de Stack Overflow, aurait prédit que « Toute application qui peut être écrite en #JavaScript sera un jour écrite en #JavaScript. ». A ce titre, il existe une librairie appelée Arquero qui permet de manipuler des données avec la même versatilité que tidyverse sous R, ce qui accrédite ce présage.

Pensée Design

Grâce au Cerema, j’ai pu suivre une formation au Design Thinking animée par la Fabrique Humaine.

J’ai trouvé cette formation très intéressante, en cela qu’elle permet d’envisager les choses non du point de vue de l'”Expert”, mais du point de vue de l’Utilisateur.

En effet, certains projets sont parfois déconnectés de l’Usager. Ce dernier ne se sent pas engagé dans la démarche, parfois même avec un sentiment d’infériorité vis-à-vis d’une expertise affirmée par les tenants du projet.

Cette démarche ascendante, bottom up, qui valorise l’expérience et le ressenti des utilisateurs, permet de motiver les troupes, lever des ambigüités sur la direction de projets, qui ne permet que de leur faire du bien (en plus parfois de les sauver).

Cette approche fournit les bons réflexes pour dompter aussi la multitude d’idées qui jaillit de brainstormings : des façons de les hiérarchiser, de les prioriser et de les aiguiller pour prototyper à une solution. De plus de façon assez ludique et sympa, et selon une alternance de convergences-divergences caractéristiques de cycles naturels.

Des cartes

De la distorsion de la donnée géographique

La cartographie est une discipline d’une telle noblesse qu’il m’est difficile de me revendiquer un de ses pratiquants. Je me considère plutôt comme un bidouilleur de données spatiales qui s’amuse à faire des cartes.

Sur mon temps libre, j’expérimente sur mon territoire des types de cartographie, dans une discipline que je nommerais cartomatique, à la croisée de la cartographie et l’informatique, et que je réalise à grand renfort de geometry generators sous QGIS.

Sur Aix-en-Provence, je m’amuse à contorsionner les rues, les bâtiments afin d’aboutir à certains rendus, soit à faire faire des acrobaties aux données vectorielles.

Cercles contenus
Mon voisinage façon Kandinksy

Sur la Sainte-Victoire, j’expérimente différentes façons de voir le relief, soit à faire faire des acrobaties aux données de Modèle Numérique de Terrain.

La Ste Victoire et la division de la joie
Une Nuit Étoilée à la Ste Victoire

Il faut dire que l’ouverture Open des données RGE de l’IGN permet à présent de beaucoup s’amuser avec les cartes.

Du côté du design génératif, ou du graphisme computationnel (voir le fil #genuary), je vois beaucoup d’oeuvres intéressantes, vibrionnantes, mais pour lesquelles je regrette une décorrélation à quelque chose de tangible et concret.

Je vois beaucoup de potentiel dans l’utilisation des données spatiales pour expérimenter de nouvelles façons de voir et représenter le territoire de façon artistique.

(Temps personnel)

OSM Data

Je participe aussi bénévolement à OSM Data, pour le volet visualisation des données. OSM Data a été créé par Karl Tayou.

Karl, Jean-Louis Zimmermann et moi-même sommes de la partie.

J’ai ainsi pu créer un style autour des lampadaires, iconique de la plateforme, un sur les sentiers de randonnée, ainsi que d’autres, divers et variés.

Hypercarto des lampadaires

OSM Data permet de prendre connaissance de la richesse OSM à la façon d’un catalogue de données. OSM Data est ainsi présenté dans certains cursus pour montrer à quoi ressemble OSM et toutes les thématiques qui y sont associées.

OSM Data permet aussi de télécharger les données OSM facilement au format Geopackage.

Enfin, comme vu avec les lampadaires, OSM Data fournit des rendus cartos très avancés qui rendent honneur à l’effort, immense, des contributeurs d’OpenStreetMap.

L’hypercartographie du lampadaire : du point à l’objet réaliste

Après la cartomatique, pourquoi ne pas introduire un nouveau mode de cartographie : l’hyper-cartographie.

Si la micro-cartographie s’intéresse à la cartographie d’éléments minuscules dans l’espace, tels que des bancs, des passages piétons, des feux de signalisation, l’hyper-cartographie s’intéresse, elle, à la restitution cartographique, pour un objet donné, du maximum de ses attributs. Ainsi, pour les lampadaires, on essaiera de représenter graphiquement le type de lampe, la couleur de l’éclairage, le type de mât, l’orientation de l’éclairage.

Dans le cadre d’OSM Data, nous demandons aux utilisateurs quels rendus ils souhaitent.

Le prochain sera donc les restaurants. Miam !

(Temps personnel)

Géotribu

Une des missions que je me suis fixées l’année dernière est de remettre au propre les revues de presse de 2011, à grand renfort de scripts.

Il y a plusieurs passes de correction : du gras à passer en titres, des niveaux de titres à corriger, des espaces à supprimer. Je dois admettre que le temps passé à programmer ça était si grand qu’il aurait été sans doute aussi rapide de le faire manuellement.

Cependant, le temps passé à deux activités différentes ayant la même finalité, l’une auto, l’autre mano, n’a de mon point de vue pas la même valeur.

Le temps passé à concevoir des scripts est un temps à apprendre, à consolider quelque chose qui sera toujours réutilisable plus tard, peut-être même sur les revues de presse d’autres années.

Une fois les revues de presse nettoyées, beaucoup de valorisations seront possibles, telles q’une analyse de l’ensemble des revues de presse et de l’évolution des tendances géomatiques, une petite vidéo GIF à partir des des imagettes, la mise en opensource et en JSON du contenu.

To be continued !

(Temps personnel)

Collaboration musicale avec Samuel Bobin

J’ai commencé l’harmonica pour son côté léger et sympathique.

L’imaginaire que le ruine-babines véhicule est aussi fascinant. C’est celui du voyage, celui des grandes étendues d’Amérique où seuls résonnent le sifflement du train et le jeu d’harmo du cow-boy de Morricone ou du hobo de Kerouac.

Au départ autodidacte, inspiré de prime abord par la rugosité du souffle du bluesman James Cotton, puis ensuite par la limpidité de celui de Jean-Jacques Milteau, j’ai appris l’harmonie et l’impro jazz auprès de Sébastien Charlier, de mon point de vue un des meilleurs harmonicistes au monde, et approfondi les overnotes, une technique étrange de respiration qui permet d’obtenir la gamme chromatique à l’harmonica diatonique, sésame pour s’aventurer sur d’autres contrées musicales.

L’année dernière, le chanteur (et batteur), Samuel Bobin (du groupe Poum Tchack) m’a proposé de l’accompagner à l’harmonica lors d’une session youtube Tiny d’Aix (en référence aux fameux Tiny Desk) autour de son album Combustion Spontanée, un savoureux album aux sonorités langoureuses et jazzy.

Ce fut un honneur pour moi de prendre part à un projet impliquant des musiciens professionnels, reconnus comme Cathy Heiting.

Si vous voulez voir la vidéo et entendre la musique :

Voilà pour un petit “résumé” de l’année 2021 !

Line meteor gradients with data-defined start and end colors

Doing line gradients in QGIS is an interesting challenge.

Anita Graser gave a hack in a post.

Lutra Consulting had an idea of gradient colored meshes, but they didn’t reach their goal to develop it.

But the question asked by Tammo on Twitter was quite special. Tammo wanted to apply gradients on lines, and data-define the starting and ending color along a certain color ramp.

Here is my result, that I also gave on StackOverflow. It uses a hack based on interpolating points along a line and coloring them based on their position.

How to do this ?

First, set your line to geometry generator to Points

Then, apply this expression to have interpolated points along the line :

collect_geometries(
  array_foreach(
    generate_series(0, length($geometry), 0.000001), -- here, we add a point every 0.000001 unit (I am in WGS84)
    line_interpolate_point($geometry, 
    @element
  )
)
You can not see it, but there are very little points !

Here is a zoomed-in image of the line :

The points are very near from one another. I don’t know if you can see them. That’s why it looks like lines.

Finally, just set the filling color according to the position of the point along the line, and along the subsetted color ramp :

ramp_color( -- this function allows you to select one particular color along a color ramp
  'Viridis', -- I ❤ Viridis
  scale_linear(
    @geometry_part_num, -- @geometry_part_num is the number of the point along the line (its position)
    0, @geometry_part_count, -- @geometry_part_count is the number for points along the line
    "start"/10, "end"/10 -- my values are between 0 and 10, so 10/10 gives 1 (the max of the color ramp)
  )
)
Here it is !

What if you made them meteors ?

Just set the size of each point from a min to a max :

scale_linear(
  @geometry_part_num,
  0, @geometry_part_count,
  0, 10 -- 10 : max size
)

So, what could be the use of such a rendering ?

Imagine you want to visualize the routes that connect the places with the most people, or that will connect places with few people.

Or, for instance, imagine you want to see the “cost” of going from one place to another, depending on relief.

This type of rendering could be useful to see the change of a particular variable between two states (before – after or origin – destination).

The power of array in qgis : match two sets of lines together

On Georezo, a French forum, someone asked how to retrieve the streets closest to pipelines.

The QGIS expression

So, let’s suppose we have one data for pipelines (source) and one for streets (target), here is a QGIS expression that retrieves the street data object index closest to each pipeline.

with_variable(
  'mean_distances',
  aggregate(
    'streets', 
    'array_agg', 
    array_avg(
      with_variable(
        'nodes',
        nodes_to_points(geometry(@parent)),
        array_foreach(
          generate_series(1, num_points(@nodes)),
          distance(point_n(@nodes, @element), $geometry)
        )
      )
    )
  ),
  array_find(@mean_distances, array_min(@mean_distances)) + 1
)

Github repo

Here, you’ll find a complete reproducible project with layers and expressions

Tutorial

One way to master QGIS field calculator expressions is to conceive them progressively, iteratively. Let’s decompose it.

Add a virtual field named nearest_with_nodes as integer which will store the index of the perfect target candidate, that is the index of the closest street line.

Open the Field Calculator window and follow this tutorial.

One street can be retrieved with the expression

get_feature_by_id('streets', 1)

Here it is the first object

To get the distance to this street from the current object, we calculate

distance(get_feature_by_id('streets', 1), $geometry)

But this distance is not ideal, because it is the closest space from one line to the other. If nodes are spread out, this does not reflect the “true” distance.

The “true” distance can be approached by calculating the distance from each of target object nodes to the current source line.

To get the nodes from the target line, we use

nodes_to_points(geometry(@parent) -- @nodes variable

To get the first node of the target line, we use

point_n(@nodes, 1)

To get the distance to this node

distance(point_n(@nodes, 1), $geometry)

But we have to compute it to each node.

We get the number of point with num_points(@nodes)

So we use generate_series to create the indexes of the nodes, going from 1 to the number of nodes. If 3 nodes, we’ll have [1,2,3]

generate_series(1, num_points(@nodes))

And we use array_foreach to calculate the distance to each node

array_foreach(
generate_series(1, num_points(@nodes)),
distance(point_n(@nodes, @element), $geometry)
)

Now we have an array of distances, let’s say [1, 3, 2], we want to get the average of the distance. For this, we use array_avg available after installing the ArrayPlus plugin.

array_avg(
  with_variable(
    'nodes',
    nodes_to_points(geometry(@parent)),
    array_foreach(
      generate_series(1, num_points(@nodes)),
      distance(point_n(@nodes, @element), $geometry)
    )
  )
)

And we calculate this mean distance from source line (pipeline) to each of the target lines (streets).

For this, we use aggregate function

aggregate(
  'streets',
  'array_agg',
  array_avg(
    with_variable(
      'nodes',
      nodes_to_points(geometry(@parent)),
      array_foreach(
        generate_series(1, num_points(@nodes)),
        distance(point_n(@nodes, @element), $geometry)
      )
    )
  )
)

Now, we have an array of mean distances, one mean distance per target line.

But we want to retrieve the min mean distance, and its index. Its index will be the one of the closest line.

To get the min distance, we use

array_min(@mean_distances)

We find the index of the min mean distance, in the array

array_find(@mean_distances, array_min(@mean_distances))

We add one because the first element of the array is indexed 0

array_find(@mean_distances, array_min(@mean_distances)) + 1

Here is the complete expression :

with_variable(
  'mean_distances',
  aggregate(
    'streets',
    'array_agg',
    array_avg(
      with_variable(
        'nodes',
        nodes_to_points(geometry(@parent)),
        array_foreach(
          generate_series(1, num_points(@nodes)),
          distance(point_n(@nodes, @element), $geometry)
        )
      )
    )
  ),
array_find(@mean_distances, array_min(@mean_distances)) + 1
)

So I hope you understood how to find the closest line to another one and the logic behind creating sophisticated expressions.

Display the street name

Let’s say the street layer has “name” attribute.

You can display as a label informations for the target line like this:

attribute(get_feature_by_id('streets', nearest_with_nodes), 'name')

Conclusion

Interestingly, you can see you can execute sophisticated tasks internally with expressions in the field calculator without making any SQLish virtual layers or applying magic python code.

That makes the Field Calculator a powerful and fun-to-use tool

To me, ArrayPlus should benefit from higher visibility as adding really interesting operators in QGIS. A user had to remain me of its existence. It would be nice if it joined the panoply of Field Calculator functions.

Bonus

What if you put many points on each target line ?

We can do this with interpolate_line_point

Here is the expression :

with_variable(
	'mult',
	10, 
	with_variable(
		'mean_distances',
		aggregate(
			'streets',
			'array_agg',
			with_variable(
				'feat',
				geometry(@parent),
				with_variable(
					'distances',
					array_foreach(
					generate_series(0, length(@feat), length(@feat)/((num_points(@feat)-1) * @mult)),
					distance($geometry, line_interpolate_point(@feat, @element))),
					array_avg(@distances)
				)
			)
		),
	array_find(@mean_distances, array_min(@mean_distances)) + 1
	)
)

Geospatial fun

Rechercher dans OpenEdition Search

Vous allez être redirigé vers OpenEdition Search