OpenStreetMap User's Diaries
Overpass et les cours d'eau
Pour la Journée Mondiale de l’Eau ce 22 mars 2025, je vous ai concocté quelques requêtes Overpass qui valorisent le modèle de données OSM décrivant les cours d’eau. Ce modèle est décrit sur cette page du wiki, la clef qui nous intéresse ici est waterway.
Les cours d’eau d’une commune
Commençons par une requête classique visant à extraire les cours d’eau se trouvant à l’intérieur d’un te
Pour la Journée Mondiale de l’Eau ce 22 mars 2025, je vous ai concocté quelques requêtes Overpass qui valorisent le modèle de données OSM décrivant les cours d’eau. Ce modèle est décrit sur cette page du wiki, la clef qui nous intéresse ici est waterway.
Les cours d’eau d’une commune
Commençons par une requête classique visant à extraire les cours d’eau se trouvant à l’intérieur d’un territoire. Prenons la commune de Nort-sur-Erdre en Loire-Atlantique, la rivière L’Erdre présentant des caractéristiques intéressantes pour la suite de cet article. Notre première requête produit tous les cours d’eau se trouvant à l’intérieur de la commune. Pour vérifier le résultat (une bonne pratique avec Overpass), la requête retourne également le contour de la commune.
Les 3 lignes de MapCSS à la suite de la requête permettent de styliser l’affichage du résultat. La clause render: native;
indique d’afficher tous les tronçons sous forme de lignes, même les plus courts qui sont par défaut représentés par des cercles selon le niveau de zoom.
On observe deux problèmes :
- Les portions de cours d’eau qui longent le périmètre sont manquantes, notamment au niveau de la Plaine de la Poupinière au sud-est de la commune.
- Le résultat contient des ways qui sortent du périmètre de la commune, à l’ouest et au sud.
Pour résoudre le premier problème, nous devons prendre en compte à la fois les cours d’eau se trouvant à l’intérieur de la commune avec le filtre (area)
, et ceux le long de son périmètre avec le filtre (around)
. Celui-ci s’applique à des ways : on récupère les ways référencés par la relation avec la syntaxe way(r.commune)
.
Notre seconde requête utilise une distance nulle, il est aussi possible d’utiliser une distance de quelques mètres pour récupérer des cours d’eau proches de la commune.
Pour le second problème, il est possible de réaliser un clipping des rivières par le contour de la commune, en récupérant les seuls nodes des ways se trouvant à l’intérieur de la commune : c’est le rôle de l’instruction node(w)(area.a);
dans notre troisième requête. Les ways incomplets (dont une partie des nodes n’est pas retournée par la requête) sont affichés en pointillés bleus.
Nous pouvons observer au sud de la commune deux cours d’eau parallèles très proches l’un de l’autre. Il s’agit du Canal de Nantes à Brest (waterway=canal
) et la rigole qui le longe (waterway=ditch
). Si nous nous intéressons uniquement aux cours d’eau naturels, il convient d’utiliser les valeurs river
, stream
et flow_line
pour le tag waterway
. Cette dernière valeur, qui décrit l’écoulement dans un plan d’eau, a été définie courant 2024 et est encore peu présente dans les données. Nous utilisons l’expression régulière ^(river|stream|flowline)$
pour filtrer ces seuls éléments. Pour plus de clarté notre requête « aboutie » ne retourne plus la périmètre de la commune.
Les cours d’eau en amont d’un point
Le bassin versant est la zone de collecte des eaux en amont d’un point. Son polygone se calcule à partir d’un Modèle Numérique de Terrain. Il est possible, avec OpenStreetMap, de produire le réseau hydrographique d’un bassin versant.
Partons du way traversant la Plaine de la Poupinière. Les sections de cours d’eau directement en amont terminent sur ce way : leur dernier node est un des nodes de ce way. On récupère donc les nodes de notre way de départ avec node(w)
, puis les ways de type waterway dont le dernier node est un de ces nodes, avec l’instruction way(bn:-1)[waterway];
. On place cela dans une boucle complete
, qui se termine quand le résultat n’évolue plus. Notre requête ne fait que quelques lignes !
Pour partir d’un point plutôt que d’un way OSM, nous utilisons le filtre (around)
avec 2 variables Overpass Turbo, définies par des accolades. L’une définit le point de départ, en aval du bassin versant, l’autre la distance maximale entre le point fourni et le cours d’eau le plus proche. Cette requête peut ainsi être facilement adaptée à votre besoin.
À partir de ce résultat, il est possible d’identifier les communes traversées par les cours d’eau en amont de notre point. L’instruction is_in
, qui s’applique à des nodes, permet de trouver les éléments de type area
qui les contiennent. Nous filtrons ce résultat pour ne retenir que les communes avec cette requête.
Nous pouvons également produire, à la place d’une carte, la liste des cours d’eau du bassin versant, avec leur nom et leur longueur totale. Nous utilisons une boucle sur les valeurs du tag name
, l’instruction make
qui permet d’utiliser la fonction d’agrégation sum()
sur l’évaluateur length()
qui calcule la longueur d’un way. Cette requête ne produit pas de carte mais un résultat textuel au format CSV.
De la source à la mer
Après avoir remonté les cours d’eau, suivons les jusqu’à leur embouchure. Partons de la source de l’Erdre, puis prenons un tronçon connecté à cette source. La démarche consiste ensuite à prendre le node à la fin de ce way, pour trouver les ways connectés à ce node. Nous utilisons à nouveau une boucle complete
, en prenant soin de ne pas remonter les affluents rencontrés en cours de navigation, c’est -à-dire les cours d’eau qui se terminent sur les ways trouvés jusqu’ici. La requête utilise donc une soustraction à l’intérieur de la boucle complete
.
Les cours d’eau large comme la partie aval de l’Erdre et la Loire sont aussi représentés par leur surface, avec le tag natural=water
. On peut obtenir les plans d’eau traversés par une goutte d’eau s’écoulant de la source de l’Erdre jusqu’à l’Océan Atlantique. Cette requête retourne le cours d’eau linéaire ainsi que les plans d’eau traversés. Ceux-ci sont retournés dans leur entièreté : on récupère donc toute une portion de la Loire en amont du confluent avec l’Erdre.
Pour terminer intéressons-nous aux zones humides (natural=wetland
), nombreuses le long de l’Erdre et de la Loire. Nous utilisons à nouveau une boucle complete
pour obtenir les zones humides directement adjacentes aux plans d’eau, ainsi que celles plus en profondeur dans les terres. Notre dernière requête produit des données un peu conséquentes, mais le résultat est intéressant.
Pour la Journée Mondiale de l’Eau ce 22 mars 2025, je vous ai concocté quelques requêtes Overpass qui valorisent le modèle de données OSM décrivant les cours d’eau. Ce modèle est décrit sur cette page du wiki, la clef qui nous intéresse ici est waterway.
Les cours d’eau d’une communeCommençons par une requête classique visant à extraire les cours d’eau se trouvant à l’intérieur d’un te
Pour la Journée Mondiale de l’Eau ce 22 mars 2025, je vous ai concocté quelques requêtes Overpass qui valorisent le modèle de données OSM décrivant les cours d’eau. Ce modèle est décrit sur cette page du wiki, la clef qui nous intéresse ici est waterway.
Les cours d’eau d’une commune
Commençons par une requête classique visant à extraire les cours d’eau se trouvant à l’intérieur d’un territoire. Prenons la commune de Nort-sur-Erdre en Loire-Atlantique, la rivière L’Erdre présentant des caractéristiques intéressantes pour la suite de cet article. Notre première requête produit tous les cours d’eau se trouvant à l’intérieur de la commune. Pour vérifier le résultat (une bonne pratique avec Overpass), la requête retourne également le contour de la commune.
Les 3 lignes de MapCSS à la suite de la requête permettent de styliser l’affichage du résultat. La clause render: native;
indique d’afficher tous les tronçons sous forme de lignes, même les plus courts qui sont par défaut représentés par des cercles selon le niveau de zoom.
On observe deux problèmes :
- Les portions de cours d’eau qui longent le périmètre sont manquantes, notamment au niveau de la Plaine de la Poupinière au sud-est de la commune.
- Le résultat contient des ways qui sortent du périmètre de la commune, à l’ouest et au sud.
Pour résoudre le premier problème, nous devons prendre en compte à la fois les cours d’eau se trouvant à l’intérieur de la commune avec le filtre (area)
, et ceux le long de son périmètre avec le filtre (around)
. Celui-ci s’applique à des ways : on récupère les ways référencés par la relation avec la syntaxe way(r.commune)
.
Notre seconde requête utilise une distance nulle, il est aussi possible d’utiliser une distance de quelques mètres pour récupérer des cours d’eau proches de la commune.
Pour le second problème, il est possible de réaliser un clipping des rivières par le contour de la commune, en récupérant les seuls nodes des ways se trouvant à l’intérieur de la commune : c’est le rôle de l’instruction node(w)(area.a);
dans notre troisième requête. Les ways incomplets (dont une partie des nodes n’est pas retournée par la requête) sont affichés en pointillés bleus.
Nous pouvons observer au sud de la commune deux cours d’eau parallèles très proches l’un de l’autre. Il s’agit du Canal de Nantes à Brest (waterway=canal
) et la rigole qui le longe (waterway=ditch
). Si nous nous intéressons uniquement aux cours d’eau naturels, il convient d’utiliser les valeurs river
, stream
et flow_line
pour le tag waterway
. Cette dernière valeur, qui décrit l’écoulement dans un plan d’eau, a été définie courant 2024 et est encore peu présente dans les données. Nous utilisons l’expression régulière ^(river|stream|flowline)$
pour filtrer ces seuls éléments. Pour plus de clarté notre requête « aboutie » ne retourne plus la périmètre de la commune.
Les cours d’eau en amont d’un point
Le bassin versant est la zone de collecte des eaux en amont d’un point. Son polygone se calcule à partir d’un Modèle Numérique de Terrain. Il est possible, avec OpenStreetMap, de produire le réseau hydrographique d’un bassin versant.
Partons du way traversant la Plaine de la Poupinière. Les sections de cours d’eau directement en amont terminent sur ce way : leur dernier node est un des nodes de ce way. On récupère donc les nodes de notre way de départ avec node(w)
, puis les ways de type waterway dont le dernier node est un de ces nodes, avec l’instruction way(bn:-1)[waterway];
. On place cela dans une boucle complete
, qui se termine quand le résultat n’évolue plus. Notre requête ne fait que quelques lignes !
Pour partir d’un point plutôt que d’un way OSM, nous utilisons le filtre (around)
avec 2 variables Overpass Turbo, définies par des accolades. L’une définit le point de départ, en aval du bassin versant, l’autre la distance maximale entre le point fourni et le cours d’eau le plus proche. Cette requête peut ainsi être facilement adaptée à votre besoin.
À partir de ce résultat, il est possible d’identifier les communes traversées par les cours d’eau en amont de notre point. L’instruction is_in
, qui s’applique à des nodes, permet de trouver les éléments de type area
qui les contiennent. Nous filtrons ce résultat pour ne retenir que les communes avec cette requête.
Nous pouvons également produire, à la place d’une carte, la liste des cours d’eau du bassin versant, avec leur nom et leur longueur totale. Nous utilisons une boucle sur les valeurs du tag name
, l’instruction make
qui permet d’utiliser la fonction d’agrégation sum()
sur l’évaluateur length()
qui calcule la longueur d’un way. Cette requête ne produit pas de carte mais un résultat textuel au format CSV.
De la source à la mer
Après avoir remonté les cours d’eau, suivons les jusqu’à leur embouchure. Partons de la source de l’Erdre, puis prenons un tronçon connecté à cette source. La démarche consiste ensuite à prendre le node à la fin de ce way, pour trouver les ways connectés à ce node. Nous utilisons à nouveau une boucle complete
, en prenant soin de ne pas remonter les affluents rencontrés en cours de navigation, c’est -à-dire les cours d’eau qui se terminent sur les ways trouvés jusqu’ici. La requête utilise donc une soustraction à l’intérieur de la boucle complete
.
Les cours d’eau large comme la partie aval de l’Erdre et la Loire sont aussi représentés par leur surface, avec le tag natural=water
. On peut obtenir les plans d’eau traversés par une goutte d’eau s’écoulant de la source de l’Erdre jusqu’à l’Océan Atlantique. Cette requête retourne le cours d’eau linéaire ainsi que les plans d’eau traversés. Ceux-ci sont retournés dans leur entièreté : on récupère donc toute une portion de la Loire en amont du confluent avec l’Erdre.
Pour terminer intéressons-nous aux zones humides (natural=wetland
), nombreuses le long de l’Erdre et de la Loire. Nous utilisons à nouveau une boucle complete
pour obtenir les zones humides directement adjacentes aux plans d’eau, ainsi que celles plus en profondeur dans les terres. Notre dernière requête produit des données un peu conséquentes, mais le résultat est intéressant.