Installation¶
L'installation du package Rasterio est compliquée par sa dépendance à libgdal et à d'autres bibliothèques C. Il existe des chemins d'installation faciles et un chemin d'installation avancé.
Installation facile¶
Rasterio dispose de plusieurs modules d'extension qui sont liés à libgdal. Cela complique l'installation. Les distributions binaires (wheels) contenant libgdal et ses propres dépendances sont disponibles dans l'index des packages Python et peuvent être installées avec pip.
#%pip install rasterio
Advanced installation¶
Rasterio démarrage rapide¶
La lecture et l’écriture de fichiers de données constituent le pain quotidien d’un programmeur de données spatiales. Ce document explique comment utiliser Rasterio pour lire des fichiers existants et créer nouveaux fichiers. Certains sujets avancés sont passés sous silence pour être abordés plus en détail ailleurs dans la documentation de Rasterio. Seul le format GeoTIFF est utilisé ici, mais les exemples s'appliquent à d'autres formats de données raster.
#!pip install --quiet rioxarray
Ouvrir un jeu de données en mode lecture¶
Considérons un fichier GeoTIFF nommé wbouira.tif
.
Bibliothèques¶
Importez rasterio pour commencer.
import rasterio
import matplotlib.pyplot as plt
import numpy as np
Puis, ouvrir le fichier.
dataset = rasterio.open('data/wbouira.tif')
La fonction ~rasterio.open
de Rasterio prend une chaîne de chemin ou un objet de type chemin et renvoie un objet d'ensemble de données ouvert. Le
path peut pointer vers un fichier de n’importe quel format raster pris en charge. Rasterio l'ouvrira
en utilisant le pilote de format GDAL approprié. Les objets de l'ensemble de données ont certaines des mêmes
attributs en tant qu'objets de fichier Python.
dataset.name
'data/wbouira.tif'
dataset.mode
'r'
dataset.closed
False
Attributs de l'ensemble de données¶
Les propriétés des données raster stockées dans l'exemple GeoTIFF sont accessibles via les attributs de l'objet de l'ensemble de données ouvert. Les objets de l'ensemble de données ont des bandes et cet exemple a un nombre de bandes de 1.
dataset.count
1
Une bande d'ensemble de données est un tableau de valeurs représentant la distribution partielle d'une variable unique dans un espace bidimensionnel (2D). Tous les tableaux de bandes d'un ensemble de données ont le même nombre de lignes et de colonnes. La variable représentée par la seule bande de l'ensemble de données d'exemple est constituée des nombres numériques (DN) de niveau 1 pour la bande 4 de l'imageur terrestre opérationnel Landsat 8 (OLI) (longueurs d'onde comprises entre 640 et 670 nanomètres). Ces valeurs peuvent être adaptées aux valeurs de radiance ou de réflectance. Le tableau de valeurs DN a une largeur de 7 731 colonnes et une hauteur de 7 871 lignes.
dataset.width
263
dataset.height
182
Certains attributs d'ensemble de données exposent les propriétés de toutes les bandes de l'ensemble de données via un tuple de valeurs, une par bande. Pour obtenir un mappage des index de bande avec des types de données variables, appliquez une compréhension de dictionnaire au produit :func:zip
des attributs :attr:.DatasetReader.indexes
et:attr:.DatasetReader.dtypes
d'un ensemble de données.
{i: dtype for i, dtype in zip(dataset.indexes, dataset.dtypes)}
{1: 'uint16'}
{1: 'uint16'}
The example file's sole band contains unsigned 16-bit integer values. The GeoTIFF format also supports signed integers and floats of different size.
Géoréférencement des ensembles de données¶
Un jeu de données raster SIG est différent d’une image ordinaire ; ses éléments (ou « pixels ») sont cartographiés sur des régions de la surface de la Terre. Chaque pixel d'un ensemble de données est contenu dans un cadre de délimitation spatiale.
dataset.bounds
BoundingBox(left=3.296759238, bottom=35.850862298, right=4.391925696, top=36.608734143)
Notre exemple couvre le monde de 358 485 mètres (dans ce cas) à 590 415 mètres, de gauche à droite, et de 4028 985 mètres à 4265 115 mètres de bas en haut. Il couvre une région de 231,93 kilomètres de large sur 236,13 kilomètres de haut.
La valeur de l'attribut :attr:.DatasetReader.bounds
est dérivée
à partir d'un attribut plus fondamental : la transformation géospatiale de l'ensemble de données.
dataset.transform
Affine(0.0041641310190114085, 0.0, 3.296759238, 0.0, -0.004164131016483499, 36.608734143)
Le .DatasetReader.transform
d'un ensemble de données est une matrice de transformation affine qui mappe les emplacements des pixels dans les coordonnées (col, ligne) aux positions spatiales (x, y). Le produit de cette matrice et (0, 0)
, les coordonnées de colonne et de ligne du coin supérieur gauche de l'ensemble de données, est la position spatiale du coin supérieur gauche.
dataset.transform * (0, 0)
(3.296759238, 36.608734143)
La position du coin inférieur droit est obtenue de la même manière.
dataset.transform * (dataset.width, dataset.height)
(4.391925696, 35.850862298)
Mais que signifient ces chiffres ? 4028985 mètres d'où ? Ces valeurs de coordonnées sont relatives à l'origine du système de référence de coordonnées (CRS) de l'ensemble de données.
dataset.crs
CRS.from_epsg(4326)
EPSG:32612 <https://epsg.org/crs_32612/WGS-84-UTM-zone-12N.html>
__ identifie un système de référence de coordonnées particulier : UTM__
zone 12N. Ce système est utilisé pour cartographier les zones de l'hémisphère nord
entre 108 et 114 degrés ouest. Le coin supérieur gauche de l'exemple d'ensemble de données,
(358485.0, 4265115.0)
, est à 141,5 kilomètres à l'ouest du centre de la zone 12
méridien (111 degrés ouest) et à 4 265 kilomètres au nord de l'équateur.
Entre le .DatasetReader.crs
et
.DatasetReader.transform
, le géoréférencement
d'un ensemble de données raster est décrit et l'ensemble de données peut être comparé à d'autres ensembles de données SIG.
# Read the data set as array
arr=dataset.read(1)
type(arr)
numpy.ndarray
# La valeur nodata dans le jeu de données raster est -3.402823e+38, cela affectera le moment où nous tracerons le raster(voir la figure suivante), il est donc préférable de le remplacer par np.nan
arr
array([[-32768, -32768, -32768, ..., -32768, -32768, -32768], [-32768, -32768, -32768, ..., -32768, -32768, -32768], [-32768, -32768, -32768, ..., -32768, -32768, -32768], ..., [-32768, -32768, -32768, ..., -32768, -32768, -32768], [-32768, -32768, -32768, ..., -32768, -32768, -32768], [-32768, -32768, -32768, ..., -32768, -32768, -32768]], dtype=int16)
# plotting
plt.imshow(arr, cmap="Greys")
plt.show
<function matplotlib.pyplot.show(close=None, block=None)>
# Replaceer -32768 par np.nan
arr=np.where(arr<-10,np.nan,arr)
arr
array([[nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan], ..., [nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan], [nan, nan, nan, ..., nan, nan, nan]])
Maintenant après avoir Remplacer les valeur Null relançantle tracé pour voir la différence
# plotting
plt.imshow(arr, cmap="Greys")
plt.show
<function matplotlib.pyplot.show(close=None, block=None)>
# Afin de tracer une barre de couleurs, nous devons créer une image cachée pour l'utiliser pour créer la barre de couleurs
fig , ax=plt.subplots(figsize=(5,5))
# image cachée
image_hidden=ax.imshow(arr,cmap="terrain")
# image
image=plt.imshow(arr,cmap="terrain")
# add colorbar
fig.colorbar(image_hidden, ax=ax, orientation='horizontal')
<matplotlib.colorbar.Colorbar at 0x757618272090>