Aller au contenu

Les ponts le long du Canal du Midi

Mesurer la distance entre les ponts du Canal du Midi avec OpenStreetmap et QGIS.

Constat

Lorsque je me promène à vélo le long du canal du midi, au sud de Toulouse, j'ai l'impression de rencontrer un pont environ tous les 2km. Je me suis donc demandé si c'est vrai tout au long du canal. Pour le vérifier, j'ai utilisé les données issues d'OpenStreetMap(OSM) et le logiciel QGIS.

Méthode

Le logiciel QGIS permet de traiter de l'information géographique. Il est capable d'extraire des données d'OpenStreetMap grace à l'extension QuickOSM. Cette extension qui permet d'effectuer des requêtes sur l'API d'OSM. QuickOSM dispose d'une interface pour construire la requête. Elle propose aussi un moyen d'entrer directement la requête au format XML.

Extraire le canal

La première étape consiste à importer le Canal du Midi dans QGIS. Dans OSM, le Canal du Midi est défini par un ensemble de chemins ayant les attributs waterway="canal" et name="Canal du Midi". Pour s'en assurer, il est possible d'aller sur OSM, de faire un clic-droit à proximité du canal et de choisir "Interroger les objets". J'obtiens alors un panneau comme celui-ci :

Description d'un élément du Canal sous OSM

Pour extraite le canal, je peux donc créer une requête filtrant les chemins en Occitanie ayant ces 2 attributs. La requête ressemble à cela :

<osm-script output="xml" timeout="25">
    <id-query {{geocodeArea:Occitanie}} into="area_0"/>
    <union>
        <query type="way">
            <has-kv k="waterway" v="canal"/>
            <has-kv k="name" v="Canal du Midi"/>
            <area-query from="area_0"/>
        </query>
    </union>
    <union>
        <item/>
        <recurse type="down"/>
    </union>
    <print mode="body"/>
</osm-script>

J'obtiens alors dans QGIS une première couche contenant un Polyligne représentant le Canal du Midi. Par défaut, ce Polyligne est en projection WGS84. Pour mesurer des distances en France, il est plus pratique d'utiliser le Lambert93. Il faut donc reprojeter la couche en utilisant l'outil Reprojeter une couche.

Extraire les ponts

La deuxième étape consiste à importer les ponts proches du canal dans QGIS. Le plus simple est d'extraire tous les ponts d'Occitanie, puis de ne conserver que ceux qui traversent le Canal. En revanche, c'est une requête un peu longue (il y a presque 31000 ponts en Occitanie), il est donc utile d'augmenter la valeur du timeout. Les ponts sont caractérisés par l'attribut bridge="yes". Voici donc la requête que j'utilise :

<osm-script output="xml" timeout="90">
    <id-query {{geocodeArea:Occitanie}} into="area_0"/>
    <union>
        <query type="way">
            <has-kv k="bridge" v="yes"/>
            <area-query from="area_0"/>
        </query>
    </union>
    <union>
        <item/>
        <recurse type="down"/>
    </union>
    <print mode="body"/>
</osm-script>

J'obtiens une nouvelle couche contenant les ponts sous forme de polylignes. Après l'avoir projeté en Lambert93, il faut ne conserver que les ponts qui traversent le Canal. Pour ce faire, il suffit de faire l'intersection des deux images vectorielles (dans QGIS, c'est le menu Vecteur > Outils d'analyse > Intersection de lignes).

Mesurer la distance entre chaque pont

Pour cette étape, plusieurs solutions sont envisageables.

Premièrement, je peux mesurer la distance "à vol d'oiseau" entre les ponts. Pour faire cela, j'utilise la matrice des distances (menu Vecteur > Outils d'analyse > Matrice des distances). En positionnant le paramètre Utiliser uniquement les poitns cibles les plus proches (k) à "2é, j'observe pour chaque pont quelle est la distance des deux ponts les plus proches. Cette approche n'est pas parfaite, mais elle a le mérite d'être simple.

Deuxièmement, je peux mesurer la longueur du canal entre chaque pont. Cela donne alors la distance "en longeant le canal". Pour ce faire, je découpe d'abord le polyligne représentant le canal aux emplacement des ponts. Cela est possible grâce à l'outil Différence (Vecteur > Outils de géotraitement > Différence). Puis je mesure la longueur de chaque segment avec l'outil Calculatrice de champs. Il suffit d'écrire $length dans le champs Formule. Cela ajoute alors un nouveau champs contenant la longueur de chaque segment de canal, en mètres (puisqu'on a reprojeté les couches en Lambert93).

Interprétation

Quelques statistiques

Il est intéressant d'effectuer une analyse statistique des distances entre les ponts. En utilisant Python et Pandas, on peut rapidement obtenir des informations intéressantes. On observe que la distance

  • minimale est 0.5m
  • maximale est 7777m
  • moyenne est 978.8m
  • médiane est 463.4m

Voici l'histogramme :

Histogramme 1

On se rend compte qu'il y a un très grand nombre de distance très courtes (< 60m). Ce sont les pont à 2 voies, ou les ponts piétons à coté des ponts auto, et autres cas un peu spéciaux. Il me semble qu'on peut ignorer ces cas dans notre calcul. Nous allons donc ignorer les distances inférieurs à 60m.

On observe alors que la distance

  • minimale est 60.8m
  • maximale est 7777m
  • moyenne est 1295
  • médiane est 929.5m

Histogramme 2

On peut remarquer sur l'histogramme qu'il y a un pic autours de 2km. Mais rien de vraiment sensible.

Voici le script python utilisé pour générer ces statistiques et graphiques :

import pandas as pd
import matplotlib.pyplot as plt

df = pd.read_csv("stats.csv", sep='\t')
lengths = df.loc[:, 'length_m']
print("Min:    ", lengths.min())
print("Max:    ", lengths.max())
print("Mean:   ", lengths.mean())
print("Median: ", lengths.median())

fig, ax = plt.subplots()
ax.set_xlabel("Distance (m)")
ax.set_title("Histogramme des distances entre deux ponts")
lengths.plot.hist(ax=ax, bins=50)
fig.savefig("histo.png")

lengths_cut = lengths.loc[lengths > 60]
print("Min:    ", lengths_cut.min())
print("Max:    ", lengths_cut.max())
print("Mean:   ", lengths_cut.mean())
print("Median: ", lengths_cut.median())

fig, ax = plt.subplots()
ax.set_xlabel("Distance (m)")
ax.set_title("Histogramme des distances entre deux ponts")
lengths_cut.plot.hist(bins=50)
fig.savefig("histo_cut.png")

Étude de contexte

On constate que la grande majorité des ponts se trouvent à moins de 4km d'un autre pont. Nous pouvons voir qu'il y a 3 portions de canal qui dépassent les 4km.

La plus grande (7777m) se situe dans une zone où le canal fait beaucoup de zigzags, à l'ouest de Capestang. À vole d'oiseau, la distance entre les deux ponts est de 5,3km.

La seconde plus grande (4618m) longe la réserve naturelle du Bagnas, à Agde. Cela explique peut-être qu'il ne s'y trouve pas de pont.

La dernière (4379m) se trouve à l'est de Marseillette. Celle-ci n'a aucune excuse, mais elle dépasse les 4km de peu.