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 :
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 :
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
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.