... | ... | @@ -4,9 +4,14 @@ |
|
|
|
|
|
**Mots clés** : **matshow** (et **imshow**), **contour et contourf**, **geopandas**, **colormap** (discrétisation ; ListedColormap...), **colorbar**
|
|
|
|
|
|
**Modules optionnels** : **Shapely**, **pyproj**, **geopandas**, (_**cartopy ?**_)
|
|
|
**autre modules utilisés :** **pathlib** (notamment méthode **Path.is_file**), **Shapely** pour le traitement des objets géométriques
|
|
|
|
|
|
**Etape 1** : tracer une carte à partir d'une **matrice de valeurs** ("heatmap") ([Sur le REPL.it, une série de cartes simples est proposée](https://replit.com/@CPoulard/LaCartoAvecMplMatshowEtShapely#main.py))
|
|
|
**Modules pour les cartes géoréférencées ** : **pyproj**, **geopandas**, (_**cartopy ?**_)
|
|
|
|
|
|
SOMMAIRE
|
|
|
========
|
|
|
**Etape 1** : tracer une carte à partir d'une **matrice de valeurs** ("heatmap")
|
|
|
([Sur le REPL.it, une série de cartes simples est proposée](https://replit.com/@CPoulard/LaCartoAvecMplMatshowEtShapely#main.py))
|
|
|
- **1.a** affichage sous forme de matrice (abscisses et ordonnées = indices de colonne et de lignes)
|
|
|
- **1.b** ajout d'une légende colorimétrique (**colorbar**)
|
|
|
- **1.c** affichage de la carte en coordonnées précisées via les xmin, xmax, ymin, ymax (argument **extent=**(gauche, droite, haut, bas))
|
... | ... | @@ -175,26 +180,19 @@ fig.show() |
|
|
## **Etape 2** : Lire et tracer des shapes
|
|
|
=================
|
|
|
Lire des fichiers *shape**, issus de SIG comme QGis (plusieurs fichiers dont un avec l'extension *.shp) est utile indépendamment ou avec une représentation de champs de valeur, pour laquelle ils serviront au minimum de points de repère.
|
|
|
Dans cette partie, on va travailler avec des vrais fichiers de champs et des shapes.
|
|
|
|
|
|
Au passage, rappelons que la [base de données vectorielle TOPO de l'IGN est téléchargeable en ligne](https://geoservices.ign.fr/documentation/donnees/vecteur/bdtopo). Un[document décrit les données](https://geoservices.ign.fr/sites/default/files/2021-07/DC_BDTOPO_3-0_0.pdf), avec notamment couches hydrographiques disponibles (réseau hydrographique, bassins versants à chaque confluence...)
|
|
|
|
|
|
|
|
|
## **Etape 2.a** : Lire des fichiers shape "seuls"
|
|
|
Travailler avec des vrais fichiers de champs et des shapes
|
|
|
|
|
|
Dans le code, on trouve :
|
|
|
|
|
|
### Deux fonctions pour lire et tracer des _fichiers champs_
|
|
|
|
|
|
L'une accepte un format grid ascii et l'autre du binaire. Quand on exécute le code AtelierD_Champs, le message suivant d'affiche sur la console : " choix du type de fichier champ à lire (grid ou bin) ? " ; on vous demandera ensuite un nom de fichier, que le programme essaiera de lire avec l'une ou l'autre fonction selon votre choix (grid ou bin). Un exemple de fichier grid vous sera fourni. Le fichier champ de pluie radar utilisé dans les diapos est trop gros pour être mis à demeure sur le gitlab, il sera fourni au besoin en séance via filesender.
|
|
|
Dans le code fourni, on trouve des fonctions pour lire et écrire des fichiers shapes, puis des champs, pour pouvoir les superposer dans une même carte.
|
|
|
|
|
|
Le fichier [grid ascii](https://en.wikipedia.org/wiki/Esri_grid), contrairement au grid binaire, est au format texte, et il est facile d'écrire ou de lire ce format. Les six première lignes correspondent aux informations suivantes : nombre de colonnes puis de lignes de la matrice, coordonnées du point situé en bas à gauche (lowerleft), taille d'une cellule et code lacune.
|
|
|
|
|
|
ncols 21 nrows 27 xllcorner 823737.2847998787 yllcorner 6619018.593063972 cellsize 1013.374429690636 NODATA_value -1 (ensuite, nrows ligne de ncols valeurs chacune )
|
|
|
|
|
|
une fois le fichier lu, on applique imshow comme précédemment
|
|
|
## **Etape 2.a** : Lire des fichiers shape "seuls"
|
|
|
|
|
|
### Deux fonctions pour lire et tracer des _fichiers shape_, en utilisant en particulier le module Shapely :
|
|
|
A cette étape, on va lire les fichiers en plusieurs étapes, selon une démarche trouvée dans un tuto.
|
|
|
C'est un peu lourd, mais cela permet de comprendre la structure d'un fichier shp, et de décrire les différents objets (LineString, Polygon...).
|
|
|
Ensuite, on va utiliser le module Shapely qui permet de créer des objets géométriques et de disposer d'un grand nombre de méthodes. :
|
|
|
|
|
|
* lecture_shape(chemin_fichier_shape, trace=False), qui suppose que le fichier shape contient un seul objet géométrique, un polygone
|
|
|
* lecture_shape_plusieurs_elements(chemin_fichier_shape, trace=False) : qui généralise le cas précédent. Ces deux fonctions vont convertir les informations contenues dans les fichiers en un objet d'un type défini dans Shapely, et contient une méthode pour le(s) tracer. On remarque que l'import de la classe Polygon de Shapely se fait avec un alias, tout simplement parce qu'il m'est arrivé d'importer deux classes de même nom, Polygon, de deux bibliothèques différentes ! Un alias comme PolygonShapely lève les ambiguités (c'est une des raisons pour lesquelles import \* est mal ! Vous importez tout ce qui a dans une bibliothèque, avec des objets qui portent peut-être le même nom qu'un autre...).
|
... | ... | @@ -207,7 +205,7 @@ from shapely.geometry import Polygon as PolygonShapely |
|
|
|
|
|
On va d'abord s'intéresser aux fichiers "shape" (on rappelle qu'il y a en fait plusieurs fichiers, dont un seul porte l'extension \*.shp).
|
|
|
|
|
|
On passe le chemin en argument ; on teste que ce chemin existe avec Path.is_file. Les instructions ont été trouvées dans des discussions sur un forum dédié : on utilise le module shapefile pour lire le fichier shape, et ensuite on utilise les méthodes de l'objet lu pour en extraire l'information utile (variable feature) et le convertir en objet shapely avec shape.
|
|
|
On passe le chemin en argument ; on teste que ce chemin existe avec **Path.is_file**. Les instructions ont été trouvées dans des discussions sur un forum dédié : on utilise le module shapefile pour lire le fichier shape, et ensuite on utilise les méthodes de l'objet lu pour en extraire l'information utile (variable feature) et le convertir en objet shapely avec shape.
|
|
|
|
|
|
_lecture_shape_ suppose qu'il y a dans le fichier shape un seul objet intéressant, un polygone. On ne va donc travailler qu'avec le premier objet : feature = shape_lu.shapeRecords()\[0\] On propose de tracer l'objet pour vérifier que l'import s'est bien passé : on remarque que l'instruction x, y = objet_shapely.exterior.xy permet d'extraire la liste des abscisses et la liste des ordonnées des points, information dont on a besoin pour tracer avec matplotlib. La fonction retourne un objet shapely, un PolygonShapely.
|
|
|
|
... | ... | @@ -226,6 +224,16 @@ La fonction retourne la liste des tuples (x,y) pour les objets 2D ainsi que la l |
|
|
|
|
|
Elle permet d'affiner la manipulation des shapes avec une méthode de lecture tirée de la fonction "indépendante", une méthode **repr** qui définit ce qui se passe quand on tape print(mon_instance_de_cette_classe), et une méthode pour tracer qui prend en argument un objet de type "Axes", ce qui permet de construire une carte en plusieurs étapes
|
|
|
|
|
|
### Deux fonctions pour lire et tracer des _fichiers champs_
|
|
|
|
|
|
L'une accepte un format grid ascii et l'autre du binaire. Quand on exécute le code AtelierD_Champs, le message suivant d'affiche sur la console : " choix du type de fichier champ à lire (grid ou bin) ? " ; on vous demandera ensuite un nom de fichier, que le programme essaiera de lire avec l'une ou l'autre fonction selon votre choix (grid ou bin). Un exemple de fichier grid vous sera fourni. Le fichier champ de pluie radar utilisé dans les diapos est trop gros pour être mis à demeure sur le gitlab, il sera fourni au besoin en séance via filesender.
|
|
|
|
|
|
Le fichier [grid ascii](https://en.wikipedia.org/wiki/Esri_grid), contrairement au grid binaire, est au format texte, et il est facile d'écrire ou de lire ce format. Les six première lignes correspondent aux informations suivantes : nombre de colonnes puis de lignes de la matrice, coordonnées du point situé en bas à gauche (lowerleft), taille d'une cellule et code lacune.
|
|
|
|
|
|
ncols 21 nrows 27 xllcorner 823737.2847998787 yllcorner 6619018.593063972 cellsize 1013.374429690636 NODATA_value -1 (ensuite, nrows ligne de ncols valeurs chacune )
|
|
|
|
|
|
une fois le fichier lu, on applique imshow comme à l'étape 1
|
|
|
|
|
|
#### classe Champ
|
|
|
|
|
|
Elle permet de manipuler des champs de valeurs avec des méthodes associées. creer_heatmap va demander à l'utilisateur (fonction _input_) le format et le fichier, pour aiguiller vers l'une ou l'autre méthode de lecture, pour du binaire ou du grid ascii. Cette méthode s'exécute dès la création de l'instance, on pourrait faire autrement. La méthode test_trace_matrice_valeurs trace le champ seul pour vérification, si besoin. La méthode trace_champ construit une carte avec les valeurs de champ, en ajoutant tous les objets Shapely qui auront été définis en plus avec la méthode ajouter_shape. Ici, on a défini un "type" que l'on passe en argument, qui va simplement déterminer la couleur du tracé (bleu pour un réseau hydrographique...).
|
... | ... | |