... | ... | @@ -200,7 +200,9 @@ Dans le code fourni, on trouve des fonctions pour lire et écrire des fichiers s |
|
|
|
|
|
## **Etape 2.a** : Lire des fichiers shape "seuls"
|
|
|
|
|
|
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. :
|
|
|
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.
|
|
|
|
|
|
On va utiliser le [code sur la partie repo](https://gitlab.irstea.fr/christine.poulard/atelier-matplotlib/-/tree/master):
|
|
|
|
|
|
* 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...).
|
... | ... | @@ -236,15 +238,24 @@ Elle permet d'affiner la manipulation des shapes avec une méthode de lecture ti |
|
|
|
|
|
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
|
|
|
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ères lignes correspondent aux informations suivantes, avec sur chacune le mot clé, un espace et la valeur à affecter.
|
|
|
|
|
|
| signification| mot clé| valeur|
|
|
|
| ------ | ------ | ------ |
|
|
|
| nombre de colonnes de la matrice| ncols|21|
|
|
|
| nombre de lignes | nrows |27|
|
|
|
| abscisse du point en bas à gauche (lowerleft)|xllcorner |823737.2847998787|
|
|
|
| ordonnée du point en bas à gauche (lowerleft)|yllcorner |6619018.593063972|
|
|
|
| taille d'une cellule (carrée)|yllcorner |1013.374429690636|
|
|
|
| code lacune|NODATA_value |-1|
|
|
|
| matrice des valeurs||nrows lignes de ncols valeurs chacune|
|
|
|
|
|
|
une fois le fichier lu, on applique la méthode imshow comme à l'étape 1
|
|
|
|
|
|
#### classe Champ
|
|
|
#### classe Champ du code proposé
|
|
|
|
|
|
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...).
|
|
|
Dans le code disponible sur le repo, on a créé une classe pour manipuler plus facilement des champs de valeurs avec des méthodes associées.
|
|
|
**creer_heatmap** va demander à l'utilisateur (via la 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...).
|
|
|
|
|
|
### Déroulé dans le corps de programme
|
|
|
|
... | ... | @@ -257,6 +268,7 @@ mon_champ.ajouter_shape("réseau", nom="réseau hydrographique") |
|
|
mon_champ.ajouter_shape("contour", nom="France")
|
|
|
cmap, cbounds = cmap_continue(50)
|
|
|
mon_champ.trace_champ(cmap, cbounds)
|
|
|
```
|
|
|
|
|
|
**Etape 3** : lire des données (x,y,z) et les représenter par la méthode **contour** (isolignes seules) ou **contourf** (aplats sans isolignes)
|
|
|
|
... | ... | |