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.

In [1]:
#%pip install rasterio

Advanced installation¶

suivez le lien

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.

In [2]:
#!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.

In [3]:
import rasterio
In [4]:
import matplotlib.pyplot as plt
import numpy as np

Puis, ouvrir le fichier.

In [5]:
 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.

In [6]:
dataset.name
Out[6]:
'data/wbouira.tif'
In [7]:
dataset.mode
Out[7]:
'r'
In [8]:
dataset.closed
Out[8]:
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.

In [9]:
dataset.count
Out[9]:
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.

In [10]:
dataset.width
Out[10]:
263
In [11]:
dataset.height
Out[11]:
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.

In [12]:
{i: dtype for i, dtype in zip(dataset.indexes, dataset.dtypes)}
{1: 'uint16'}
Out[12]:
{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.

In [13]:
dataset.bounds
Out[13]:
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.

In [14]:
dataset.transform
Out[14]:
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.

In [15]:
dataset.transform * (0, 0)
Out[15]:
(3.296759238, 36.608734143)

La position du coin inférieur droit est obtenue de la même manière.

In [16]:
dataset.transform * (dataset.width, dataset.height)
Out[16]:
(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.

In [17]:
dataset.crs
Out[17]:
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.

In [18]:
# Read the data set as array
arr=dataset.read(1)
In [19]:
type(arr)
Out[19]:
numpy.ndarray
In [20]:
# 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
Out[20]:
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)
In [21]:
# plotting 
plt.imshow(arr, cmap="Greys")
plt.show
Out[21]:
<function matplotlib.pyplot.show(close=None, block=None)>
No description has been provided for this image
In [22]:
# Replaceer -32768 par np.nan
arr=np.where(arr<-10,np.nan,arr)
In [23]:
arr
Out[23]:
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

In [24]:
# plotting 
plt.imshow(arr, cmap="Greys")
plt.show
Out[24]:
<function matplotlib.pyplot.show(close=None, block=None)>
No description has been provided for this image
In [25]:
# 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')
Out[25]:
<matplotlib.colorbar.Colorbar at 0x757618272090>
No description has been provided for this image