" items_s2 = [item for item in items if item.id != pivot.id]\n",
" items_s2 = [item for item in items if item.id != pivot.id]\n",
...
@@ -819,51 +260,12 @@
...
@@ -819,51 +260,12 @@
},
},
{
{
"cell_type": "code",
"cell_type": "code",
"execution_count": 9,
"execution_count": null,
"id": "0f206e1e-3569-4180-91ed-00046c075b18",
"id": "0f206e1e-3569-4180-91ed-00046c075b18",
"metadata": {
"metadata": {
"tags": []
"tags": []
},
},
"outputs": [
"outputs": [],
{
"data": {
"text/html": [
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┓\n",
"<pre style=\"white-space:pre;overflow-x:auto;line-height:normal;font-family:Menlo,'DejaVu Sans Mono',consolas,'Courier New',monospace\">┏━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┓\n",
`Dinamis-SDK` est une bibliothèque Python qui permet de communiquer avec le prototype d'API d'infrastruture spatiale supporté par le dispositif national DINAMIS.
`Dinamis-SDK` est une bibliothèque Python qui permet de communiquer avec le prototype d'API d'infrastruture spatiale supporté par le dispositif national DINAMIS.
### 1.2. Installation du paquet Python Dinamis-SDK
### 1.2. Installation du paquet Python Dinamis-SDK
Le prototype de DINAMIS propose un catalogue d'images satellitaires dans un environnement STAC (Spatio Temporal Asset Catalogs). Nous souhaitons rechercher des images dans ce catalogue. Il faut dans un premier temps installer la bibliothèque `dinamis-sdk`.
Le prototype de DINAMIS propose un catalogue d'images satellitaires dans un environnement STAC (Spatio Temporal Asset Catalogs). Nous souhaitons rechercher des images dans ce catalogue. Il faut dans un premier temps installer la bibliothèque `dinamis-sdk`.
Dans un premier, on s'intéresse aux collections d'images disponibles dans DINAMIS. On utilise ici la méthode `get_collection()` de l'objet `api` (instance de la classe `pystac_client.client.Client`.
Dans un premier, on s'intéresse aux collections d'images disponibles dans DINAMIS. On utilise ici la méthode `get_collection()` de l'objet `api` (instance de la classe `pystac_client.client.Client`.
Il est désormais possible de requêter sur le catalogue afin de récupérer les items (ou images) d'intérêt. La recherche est réalisée à travers toutes les collections.
Il est désormais possible de requêter sur le catalogue afin de récupérer les items (ou images) d'intérêt. La recherche est réalisée à travers toutes les collections.
Ici, la requête repose sur deux critères :
Ici, la requête repose sur deux critères :
- étendue de recherche (ou *bounding box*) et,
- étendue de recherche (ou *bounding box*) et,
- une plage temporelle.
- une plage temporelle.
Pour chaque item, on récupère son identifiant et la collection à laquelle il appartient via les attributs `id` et `collection_id`. Ces informations permettront de retrouver aisément les images d'intérêt et de les traiter par la suite.
Pour chaque item, on récupère son identifiant et la collection à laquelle il appartient via les attributs `id` et `collection_id`. Ces informations permettront de retrouver aisément les images d'intérêt et de les traiter par la suite.
Il est possible d'accéder aux métadonnées de chaque image. Les items étant des entités geoJSON, ils peuvent être chargés sous forme de `dataframe` avec la bibliothèque `geopandas`.
Il est possible d'accéder aux métadonnées de chaque image. Les items étant des entités geoJSON, ils peuvent être chargés sous forme de `dataframe` avec la bibliothèque `geopandas`.
Dans un catalogue STAC, un *item* est constitué d'*assets*. Ces derniers correspondent à un ensemble de données cohérentes entre elles. Par exemple, les *assets* d'une image SPOT-6 comprennent :
Dans un catalogue STAC, un *item* est constitué d'*assets*. Ces derniers correspondent à un ensemble de données cohérentes entre elles. Par exemple, les *assets* d'une image SPOT-6 comprennent :
- une image multispectrale
- une image multispectrale
- une image panchromatique
- une image panchromatique
- des métadonnées au format Dimap
- des métadonnées au format Dimap
- des masques
- des masques
- etc.
- etc.
On récupère ici l'identifiant de l'asset et sa description avec la méthode `assets.items()` de la classe `pystac.item.Item`.
On récupère ici l'identifiant de l'asset et sa description avec la méthode `assets.items()` de la classe `pystac.item.Item`.
Un *asset* dispose d'un lien `href` vers la donnée. Ce `href` permet de :
Un *asset* dispose d'un lien `href` vers la donnée. Ce `href` permet de :
- télécharger la donnée dans son ensemble,
- télécharger la donnée dans son ensemble,
- charger en streaming (avec le format COG) une portion de l'image
- charger en streaming (avec le format COG) une portion de l'image
Dans un premier temps, on visualise les deux imagettes de prévisualisation. Celles-ci n'étant pas géoréférencées, il est inutile de les charger dans un client cartographique.
Dans un premier temps, on visualise les deux imagettes de prévisualisation. Celles-ci n'étant pas géoréférencées, il est inutile de les charger dans un client cartographique.
Pour bien comprendre le contenu d'un `href`, on les affiche ici.
Pour bien comprendre le contenu d'un `href`, on les affiche ici.
Les liens qui apparaissent sont non seulement "compris" dans un script Python (avec les bibliothèques qui conviennent) mais ils peuvent être également utilisés dans un logiciel SIG tel que QGis.
Les liens qui apparaissent sont non seulement "compris" dans un script Python (avec les bibliothèques qui conviennent) mais ils peuvent être également utilisés dans un logiciel SIG tel que QGis.
> Dans QGis :
> Dans QGis :
> - Cliquer sur `Ajouter une couche raster`
> - Cliquer sur `Ajouter une couche raster`
>
>
> Dans la fenêtre qui apparaît :
> Dans la fenêtre qui apparaît :
> - Cocher le Type de source : `Protocole: HTTP(S), cloud, etc.`
> - Cocher le Type de source : `Protocole: HTTP(S), cloud, etc.`
> - Copier/Coller le lien href
> - Copier/Coller le lien href
> - Cliquer sur le bouton `Ajouter`
> - Cliquer sur le bouton `Ajouter`
>
>
> *Dès lors la couche raster est affichée à l'écran en streaming. Elle peut être traitée avec les outils QGis (calculatrice raster, etc.).*
> *Dès lors la couche raster est affichée à l'écran en streaming. Elle peut être traitée avec les outils QGis (calculatrice raster, etc.).*
Pour finir, on souhaite calculer l'indice NDVI sur une portion de l'image SPOT-6. Il faut donc récupérer une portion (définie par une emprise, ou *bounding box*) de l'image multipectrale, et réaliser un calcul entre bandes.
Pour finir, on souhaite calculer l'indice NDVI sur une portion de l'image SPOT-6. Il faut donc récupérer une portion (définie par une emprise, ou *bounding box*) de l'image multipectrale, et réaliser un calcul entre bandes.
### 4.2. Chargement d'une portion d'image et calcul du NDVI
### 4.2. Chargement d'une portion d'image et calcul du NDVI
On utilise la bibliothèque `rasterio` pour lire l'image multispectrale (référencée par le `href`). La méthode `mask` associée permet de requêter uniquement sur la portion d'image définie par la bounding box (variable `coords`).
On utilise la bibliothèque `rasterio` pour lire l'image multispectrale (référencée par le `href`). La méthode `mask` associée permet de requêter uniquement sur la portion d'image définie par la bounding box (variable `coords`).
On procède ensuite au calcul du NDVI (*Normalized Difference Vegetation Index*), en suivant l'expression suivante :
On procède ensuite au calcul du NDVI (*Normalized Difference Vegetation Index*), en suivant l'expression suivante :
Il est possible d'ajouter des éléments (*slider*, *progress bar*, *checkbox*, *radio buttons*, etc.) pour interagir avec la visualisation des données. Pour ce faire, charger la librairie `ipywidgets`.
Il est possible d'ajouter des éléments (*slider*, *progress bar*, *checkbox*, *radio buttons*, etc.) pour interagir avec la visualisation des données. Pour ce faire, charger la librairie `ipywidgets`.