Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

TP1 : Rappels Python

Open in Colab Open in Kaggle Launch on Renku

TP1 : Rappels Python

Il est conseillé de faire tourner ce notebook dans le cloud, à l’aide de la plateforme Google Colaboratory (Colab). Si tu préfères, tu as aussi la possibilité d’ouvrir ce notebook sur les plateformes Kaggle ou Renku. Si besoin, plus d’informations sur l’exécution des TPs Python dans le cloud sont disponibles ici.

0.1 - Rappel : utilisation de Google Colaboratory

Pour utiliser Colab, tu dois disposer d’un compte Google. Si tu n’en as pas, tu peux en créer un ici. Une fois que tu auras un compte, tu pourras accéder à Colab ici. À partir de la page d’accueil, tu peux ouvrir un nouveau carnet en cliquant sur “Nouveau carnet” ou en cliquant sur “Fichier” puis sur “Nouveau carnet”.

Tu peux maintenant écrire et exécuter du code Python dans ce carnet. Pour exécuter une cellule, tu peux soit cliquer sur le bouton ‘play’ à gauche de la cellule, soit appuyer sur ‘Shift+Enter’ sur ton clavier. Essaie-le en copiant le texte suivant dans une cellule et en exécutant le code :

print('Voici la liste de tous les paquets installés dans cet environnement:')
!pip list

C’est bien, mais ce qui nous intéresse le plus aujourd’hui, c’est de pouvoir exécuter des tutoriels hébergés sur GitHub. Pour les TPs de ce cours, tu peux simplement cliquer sur le bouton “Open in Colab” en haut de la page.

Cela ouvrira le carnet dans Colab, et tu pourras alors exécuter le code comme tu le ferais normalement.

0.2 - Téléchargement des données

Avant de lancer les cellules, télécharge le fichier tp1.gpkg depuis le dossier OneDrive du cours et dépose-le dans le répertoire de travail du notebook en suivant une des procédures suivantes :

  • Colab :

    1. Clique sur “Files” (icône située dans la barre à gauche de ton écran)

    2. Clique sur Upload to session storage, et sélectionne le fichier tp1.gpkg que tu viens de télécharger -> Si le message “Connecting to a runtime to enable file browsing” apparaît, tu dois attendre quelques secondes avant de pouvoir ajouter ton fichier

    3. Si nécessaire, copie le chemin d’accès au fichier (trois points verticaux à droite du nom de fichier -> copier chemin d’accès)

  • Kaggle :

    1. Clique sur “File”

    2. Clique sur “Upload” et sélectionne le fichier tp1.gpkg que tu viens de télécharger

    3. Copie le chemin d’accès au fichier en utilisant l’icône rectangulaire à la droite du nom de fichier

  • Renku : Passe à l’étape suivante, le fichier est déjà dans le projet!

1. Concepts fondamentaux — Objets et structures de données

1.1 Types de données fondamentaux

Python propose plusieurs types de données de base. Le type d’une variable est déterminé automatiquement à l’affectation — pas besoin de le déclarer comme en C.

TypeExempleDescription
int42Nombre entier
float3.14Nombre décimal
str"Lausanne"Chaîne de caractères
boolTrueValeur logique
<class 'int'>
<class 'float'>
<class 'str'>
<class 'bool'>
Lausanne se trouve à 494 m d'altitude.
Température : 19.5 °C, ville lacustre : True

1.2 Listes

Une liste est une collection ordonnée et modifiable d’éléments. Elle peut contenir des éléments de types différents.

Nombre de cantons : 5
Premier canton  : Vaud
Dernier canton  : Berne
Deux premiers   : ['Vaud', 'Genève']
Trois derniers  : ['Valais', 'Fribourg', 'Berne']
['Vaud', 'GE', 'Valais', 'Fribourg', 'Berne', 'Neuchâtel']
True
False

1.3 Dictionnaires

Un dictionnaire associe des clés à des valeurs. Il peut par exemple représenter une entité (ligne) d’une table attributaire : chaque clé correspond à un nom de champ (colonne) et chaque valeur au contenu de la case située à l’intersection de la ligne et de la colonne dans la table.

Lausanne
139408
{'nom': 'Lausanne', 'canton': 'Vaud', 'population': 139408, 'superficie_km2': 41.37, 'chef_lieu': True, 'altitude_m': 496, 'crs': 'EPSG:2056'}
dict_keys(['nom', 'canton', 'population', 'superficie_km2', 'chef_lieu', 'altitude_m', 'crs'])
dict_values(['Lausanne', 'Vaud', 139408, 41.37, True, 496, 'EPSG:2056'])
Population : 139408

1.4 Boucles

Les boucles permettent de répéter des opérations. En géomatique, elles sont très utiles pour traiter une liste de couches, de fichiers ou d’entités.

  - Suisse
  - France
  - Belgique
  - Luxembourg

Comptage :
  i = 0
  i = 1
  i = 2
  i = 3
  i = 4

Index + valeur :
  [0] VD
  [1] GE
  [2] VS
  [3] FR
Itération 0
Itération 1
Itération 2

Altitudes en pieds : [14692, 15203, 13025, 13665]
Sommets > 4200 m : [4478, 4634]

1.5 Conditions

Les instructions if, elif et else permettent d’exécuter des actions seulement si certaines conditions sont vérifiées. Ces instructions sont très utiles en géomatique car elles permettent de classer et d’analyser des données géographiques en fonction de leurs caractéristiques.

1.6 Fonctions

Une fonction regroupe du code réutilisable. En géomatique, on écrit souvent des fonctions pour calculer des indicateurs ou transformer des données.

Surface d'un cercle de rayon 5000 m : 78.5398 km²
3369.8 hab/km²
5928.5 personnes/km²

1.7 Classes

Une classe est un plan de construction qui regroupe, dans un même objet, des données (les attributs) et des actions qui opèrent sur ces données (les méthodes).

Une méthode est simplement une fonction définie à l’intérieur d’une classe : même mécanisme (def, des paramètres, un return), avec deux différences essentielles.

FonctionMéthode
Où elle est définieseule, au niveau du fichierà l’intérieur d’une classe
Comment on l’appellesurface_cercle(5000)ville1.densite() — sur un objet, avec le point .
Accès aux données de l’objetnonoui, via self

Le premier paramètre d’une méthode est toujours self : il représente l’objet lui-même et donne accès à ses attributs (self.population, self.superficie_km2). C’est ce qui permet à ville1.densite() de calculer la densité de Lausanne et à ville2.densite() celle de Nyon — la même méthode, appliquée à des données différentes selon l’objet.

🔗 Lien avec GeoPandas : tu utilises déjà des méthodes sans le savoir. cantons.to_crs(2056) ou towns.plot() sont des méthodes des objets GeoDataFrame — d’où la notation avec le point.

Lausanne (Vaud) : 139408 habitants, 41.37 km², densité = 3369.8 hab/km²
Nyon (Vaud) : 22900 habitants, 6.79 km², densité = 3372.6 hab/km²
Lausanne est une grande ville ? True
Nyon est une grande ville ? False

2. NumPy — tableaux et calcul numérique

NumPy est la bibliothèque de référence pour le calcul numérique en Python. Un tableau NumPy (ndarray) stocke des données numériques de manière très efficace et permet des opérations vectorisées (sans boucle explicite).

🔗 Lien avec les SIG : les bandes raster, les coordonnées et les matrices de transformation sont naturellement représentées sous forme de tableaux NumPy.

a = [1 2 3 4 5]
b = [ 0 10 20 30 40 50 60 70 80 90]
c = [0.  0.2 0.4 0.6 0.8 1. ]
d (zéros) = [0. 0. 0. 0.]
e (2×3 de 1) =
 [[1. 1. 1.]
 [1. 1. 1.]]
Degrés  : [6.63 6.85 7.05 7.25]
Radians : [0.1157 0.1196 0.123  0.1265]
× 2 : [13.26 13.7  14.1  14.5 ]
+ 1 : [7.63 7.85 8.05 8.25]
²   : [43.9569 46.9225 49.7025 52.5625]
Premier élément  : 375
Dernier élément  : 1342
Éléments 2 à 5   : [520 612 728]
Un sur deux      : [ 375  520  728 1105]
Éléments > 700 m : [ 728  890 1105 1342]
Nombre d'éléments > 700 m : 4
Total annuel  : 822 mm
Moyenne mensuelle : 68.5 mm
Écart-type    : 11.2 mm
Min (mois)    : 54 mm — Jan
Max (mois)    : 93 mm — Jun

3. Matplotlib — visualisation de données

Matplotlib est la bibliothèque de visualisation standard en Python. Elle permet de créer des graphiques publiables en quelques lignes de code.

<Figure size 900x400 with 1 Axes>
<Figure size 1100x400 with 3 Axes>

4. GeoPandas — premier contact

GeoPandas étend la bibliothèque Pandas pour travailler avec des données géospatiales vectorielles (points, lignes, polygones).

Un GeoDataFrame ressemble à un tableau Pandas avec une colonne spéciale geometry contenant les géométries de chaque entité.

🔗 Parallèle QGIS : un GeoDataFrame est l’équivalent d’une couche vectorielle dans QGIS.

Nous allons travailler avec le même fichier tp1.gpkg que nous avons manipulé dans QGIS.

Colonnes disponibles :
['KT', 'AK', 'NAME', 'area', 'geometry']

Type      : <class 'geopandas.geodataframe.GeoDataFrame'>
Dimensions : 26 lignes × 5 colonnes

Loading...
Types de données :
KT             int32
AK            object
NAME          object
area         float64
geometry    geometry
dtype: object

Type de géométrie : MultiPolygon    26
Name: count, dtype: int64
CRS du jeu de données : EPSG:21781
Code EPSG             : 21781
Unité de mesure       : metre
→ Les coordonnées sont en mètres (système suisse MN03 / CH1903)
<Figure size 1000x800 with 1 Axes>
/tmp/ipykernel_96832/481605653.py:15: UserWarning: Legend does not support handles for PatchCollection instances.
See: https://matplotlib.org/stable/tutorials/intermediate/legend_guide.html#implementing-a-custom-legend-handler
  ax.legend(loc='lower right')
<Figure size 1000x800 with 1 Axes>
Villes chargées : 47 entités, CRS = 21781

Aperçu des attributs (couche Towns) :
          ID1  Population  Rank
0      Horgen       18443     3
1       Uster       31954     2
2  Winterthur       99377     2
3      Zürich      368677     1
4        Bern      123466     1

Villes de plus de 50 000 habitants : 10
       ID1  Population
    Zürich      368677
    Genève      185958
     Basel      166173
  Lausanne      125885
      Bern      123466
Winterthur       99377
 St.Gallen       72642
    Luzern       59509
    Lugano       55060
      Biel       50455
<Figure size 1000x800 with 1 Axes>

5. Parallèle QGIS ↔ Python

Voici un résumé des opérations effectuées dans QGIS au TP1 et leur équivalent en Python/GeoPandas :

Opération dans QGIS (TP1)Équivalent Python/GeoPandas
Ouvrir une couche de tp1.gpkggpd.read_file("tp1.gpkg", layer="Cantons")
Table attributairegdf.head() / gdf[['NAME', 'area']]
Sélection par attributgdf[gdf['Population'] > 50000]
Afficher le SCR de la coucheprint(gdf.crs) → EPSG:21781
Reprojection
Vecteur > Outils de gestion des données > Reprojeter une couche
gdf.to_crs(epsg=2056)
Symbologie (couleur, épaisseur)gdf.plot(color=..., edgecolor=..., linewidth=...)
Étiquettes (nom des villes)ax.annotate(row['ID1'], ...)
Superposition de couchesAppels .plot(ax=ax, ...) successifs
Field Calculator (longueur, surface)gdf.geometry.length / gdf.geometry.area

6. Export et partage : la répartition des rôles Python / QGIS

Une fois les données chargées, filtrées et transformées en Python, on les sauvegarde dans un fichier pour les réutiliser ailleurs. C’est le bon moment pour clarifier qui fait quoi entre Python et QGIS :

  • 🐍 Python excelle pour le traitement des données : charger, nettoyer, filtrer, joindre, calculer des indicateurs, automatiser un traitement sur des centaines de fichiers, de façon reproductible (un script se relance à l’identique), et s’intègre avec l’écosystème scientifique Python (NumPy, pandas, scikit-learn).

  • 🗺️ QGIS reste l’outil de choix pour l’esthétique cartographique : mise en page, choix fin des couleurs et des symboles, étiquetage soigné, échelle, flèche du nord, légende, export PDF haute résolution pour l’impression.

En pratique, on combine les deux : on fait le gros du traitement en Python, on exporte le résultat (GeoPackage / GeoJSON), puis on ouvre ce fichier dans QGIS pour la mise en forme finale de la carte. Les .plot() vus plus haut servent surtout à vérifier son travail au fil de l’analyse, pas à produire la carte de publication.

Formats d’export courants :

FormatExtensionAvantages
GeoPackage.gpkgPlusieurs couches dans un seul fichier, tous les CRS — format recommandé
GeoJSON.geojsonLisible par tous, idéal pour le web (à exporter en WGS84 / EPSG:4326)
Shapefile.shpCompatibilité maximale, mais 1 seule couche et noms de champs limités

6.1 - Exporter les géodonnées dans un fichier au format GeoPackage

6.2 - Récupérer les fichiers produits

Les fichiers produits sont enregistrés dans le dossier sortie/ (output/ ou équivalent). Avant de fermer ta session, télécharge manuellement resultats.gpkg et cantons.geojson depuis l’explorateur de fichiers de Colab, Kaggle ou Renku.


📝 Quiz Moodle

Une fois ce TP terminé, teste tes connaissances avec le quiz Moodle du TP1 :

👉 Ouvrir le quiz du TP1 sur Moodle (accès réservé aux étudiant·e·s UNIL)