Cartes d’occupation du sol et d’utilisation du sol
Produits utilisés: io_lulc_v2, esa_worldcover_2020, esa_worldcover_2021, cgls_landcover, cci_landcover
Mots-clés : données utilisées ; ESRI Land Cover, ensembles de données ; io_lulc_v2, données utilisées ; ESA WorldCover, ensembles de données ; esa_worldcover_2020 données utilisées ; Copernicus Global Land Service, Land Use/Land Cover at 100 m, ensembles de données ; cgls_landcover données utilisées ; ESA Climate Change Initiative Land Cover, ensembles de données ; cci_landcover
Aperçu
Les cartes Let Use/Let Cover (LULC) classent les terres en grandes catégories telles que l’eau, les cultures ou les zones bâties. Elles sont utiles pour visualiser les utilisations dominantes des terres dans une zone donnée. La superficie totale ou la proportion de différentes classes peut également être calculée pour une zone spécifiée.
De nombreuses organisations publient des cartes LULC. DE Africa donne accès aux cartes d’utilisation des terres et de couverture terrestre (LULC) de l’Environmental Systems Research Institute (Esri)/Impact Observatory (IO) <https://www.arcgis.com/home/item.html?id=d3da5dd386d140cf93fc9ecbf8da5e31>, WorldCover de l’Agence spatiale européenne (ESA) <https://esa-worldcover.org/en>, Copernicus Global Land Service (CGLS) Land Use/Land Cover at 100 m <https://land.copernicus.eu/global/content/annual-100m-global-land-cover-maps-available> et à la carte de couverture terrestre de l’Initiative sur les changements climatiques de l’ESA (CCI) <https://www.esa-landcover-cci.org/>. Les produits ESRI/IO et ESA sont dérivés de l’imagerie Sentinel de l’ESA et sont disponibles à une résolution de 10 m chaque année à partir de 2017, 2020 et 2021 respectivement sur l’ensemble du continent africain. Le produit CGLS est disponible à une résolution de 100 m, est mis à jour chaque année et est actuellement disponible de 2015 à 2019. Le produit ESA CCI landcover est disponible à une résolution de 300 m, est mis à jour chaque année et est actuellement disponible de 1992 à 2019.
La précision des cartes d’occupation du sol varie en fonction de l’emplacement et de la classe, il est donc important de comprendre la qualité des cartes. ESRI publie des informations sur la précision du produit LULC 2020 (version 10 classes), qui sont soigneusement résumées dans la matrice de confusion située ici <https://www.arcgis.com/home/item.html?id=d6642f8a4f6d4685a24ae2dc0c73d4ac>`__. La précision globale pour toutes les classes est de 85 %. Gardez à l’esprit que les statistiques de précision dans le lien concernent le globe et non l’Afrique.
Le produit WorldCover de l’ESA est accompagné d’un rapport détaillé sur la qualité du produit, que nous ne reproduirons pas ici. Cependant, le rapport complet de validation du produit est disponible en utilisant le lien suivant : https://esa-worldcover.org/en/data-access. La précision globale du produit 2020 pour l’Afrique est de 73,6 %, et elle s’est améliorée à 76,5 % en 2021.
Le produit Copernicus Global Land Cover 100m a fait l’objet d’une « publication scientifique <https://www.sciencedirect.com/science/article/pii/S0034425721004065?via%3Dihub> » explorant la précision des cartes annuelles de couverture terrestre. La précision globale pour l’Afrique est d’environ 80 %.
Détails importants :
Classes et valeurs
valeur io_lulc |
classe io_lulc |
valeur esa |
classe esa |
valeur cgls |
classe cgls |
valeur cci |
classe cci |
---|---|---|---|---|---|---|---|
0 |
aucune donnée |
0 |
aucune donnée |
0 |
aucune donnée |
0 |
aucune donnée |
1 |
eau |
10 |
couverture d’arbre |
20 |
arbustes |
10 |
terres cultivées, pluviales |
2 |
arbres |
20 |
broussailles |
30 |
végétation herbacée |
11 |
terres cultivées, pluviales, couverture herbacée |
3 |
non utilisé |
30 |
prairie |
40 |
végétation ou agriculture cultivée et gérée |
12 |
terres cultivées, pluviales, couvertes d’arbres ou d’arbustes |
4 |
végétation inondée |
40 |
terres cultivées |
50 |
urbain ou bâti |
20 |
terres cultivées, irriguées ou après inondation |
5 |
cultures |
50 |
construit |
60 |
végétation nue ou clairsemée |
30 |
mosaïque de terres cultivées et de végétation naturelle |
6 |
non utilisé |
60 |
végétation nue/éparsemée |
70 |
neige et glace |
40 |
mosaïque de végétation naturelle/terres cultivées |
7 |
superficie construite |
70 |
neige et glace |
80 |
plans d’eau permanents |
50 |
couvert arboré, feuillu, persistant, fermé à ouvert |
8 |
sol nu |
80 |
plans d’eau permanents |
90 |
zone humide herbacée |
60 |
couvert arboré, feuillu, caduc, fermé à ouvert |
9 |
neige/glace |
90 |
zone humide herbacée |
100 |
mousse et lichen |
61 |
couvert arboré, feuillu, caduc, fermé |
10 |
nuages |
95 |
mangroves |
111 |
forêt fermée, feuilles persistantes en forme d’aiguilles |
62 |
couvert arboré, feuillu, caduc, ouvert |
11 |
pâturage |
100 |
mousse et lichen |
112 |
forêt fermée, persistante, à feuilles larges |
70 |
couvert arboré, à feuilles caduques, à feuilles persistantes, fermé à ouvert |
113 |
forêt fermée, feuillue caduque à feuilles caduques |
71 |
couvert arboré, à feuilles caduques, à feuilles persistantes, fermé |
||||
114 |
forêt dense, feuillue caduque |
72 |
couvert arboré, à feuilles caduques, à feuilles persistantes, ouvert |
||||
115 |
forêt fermée, mixte |
80 |
couvert arboré, à feuilles caduques, fermé à ouvert |
||||
116 |
forêt fermée, inconnue |
81 |
couvert arboré, à feuilles caduques, fermé |
||||
121 |
forêt ouverte, feuilles persistantes en forme d’aiguilles |
82 |
couvert arboré, à feuilles caduques, ouvert |
||||
122 |
forêt ouverte, feuillage persistant à larges feuilles |
90 |
couverture arborée, type de feuilles mixtes |
||||
123 |
forêt ouverte, feuillue caduque à feuilles caduques |
100 |
couverture mosaïque d’arbres et d’arbustes/herbacées |
||||
124 |
forêt ouverte, feuillue caduque |
110 |
couverture herbacée mosaïque/arbre et arbuste |
||||
125 |
forêt ouverte, mixte |
120 |
broussailles |
||||
126 |
forêt ouverte, inconnue |
121 |
broussailles, à feuilles persistantes |
||||
200 |
mer ouverte |
122 |
broussailles, feuillus |
||||
130 |
prairie |
||||||
140 |
lichens et mousses |
||||||
150 |
végétation clairsemée |
||||||
151 |
arbre clairsemé |
||||||
152 |
arbuste clairsemé |
||||||
153 |
couverture herbacée clairsemée |
||||||
160 |
couvert arboré, inondé, eau douce ou saumâtre |
||||||
170 |
couvert forestier, inondé, eau salée |
||||||
180 |
couverture arbustive ou herbacée, inondée, eau douce/salée/saumâtre |
||||||
190 |
zones urbaines |
||||||
200 |
zones nues |
||||||
201 |
zones nues consolidées |
||||||
202 |
zones nues non consolidées |
||||||
210 |
plans d’eau |
||||||
220 |
neige et glace permanentes |
Plage de temps et résolution spatiale
io_lulc |
esa_worldcover |
cgls_landcover |
cci_landcover |
|
---|---|---|---|---|
Plage de temps |
2017-2023 |
2020-2021 |
2015-2019 |
1992-2019 |
Résolution spatiale |
10 m |
10 m |
100 m |
300 m |
Description
Dans ce bloc-notes, nous allons charger les données LULC à l’aide de dc.load()
pour renvoyer une carte des classes d’utilisation et de couverture terrestre pour une zone spécifiée.
Les sujets abordés comprennent :
Inspection du produit LULC disponible dans le datacube
Utilisation de la fonction « dc.load() » pour charger les données LULC
Tracé de LULC à l’aide de la fonction
plot_lulc()
Un exemple d’analyse de la zone des classes LULC dans une zone donnée
Chargement et traçage des « fractions de couverture » dans CGLS
Commencer
Pour exécuter cette analyse, exécutez toutes les cellules du bloc-notes, en commençant par la cellule « Charger les packages ».
Charger des paquets
[1]:
%matplotlib inline
import datacube
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker
from deafrica_tools.plotting import display_map, plot_lulc
Se connecter au datacube
[2]:
dc = datacube.Datacube(app="Landcover_Classification")
Liste des mesures
Nous pouvons inspecter les données disponibles pour LULC en utilisant la fonctionnalité « list_measurements » de datacube. Le tableau ci-dessous répertorie les produits et les mesures disponibles pour les deux ensembles de données LULC indexés dans le datacube de DE Africa. Nous pouvons voir que le produit contient une couche nommée « classification ». Le type de données est un entier, ce qui correspond à une classe LULC.
[3]:
product_name = ['io_lulc_v2', 'esa_worldcover_2020', 'esa_worldcover_2021', 'cgls_landcover', 'cci_landcover']
dc_measurements = dc.list_measurements()
dc_measurements.loc[product_name].drop('flags_definition', axis=1)
[3]:
name | dtype | units | nodata | aliases | ||
---|---|---|---|---|---|---|
product | measurement | |||||
io_lulc_v2 | supercell | supercell | uint8 | 1 | 0.0 | [classification] |
esa_worldcover_2020 | classification | classification | uint8 | 1 | 0.0 | NaN |
esa_worldcover_2021 | classification | classification | uint8 | 1 | 0.0 | NaN |
cgls_landcover | classification | classification | uint8 | 1 | 255.0 | [class] |
forest_type | forest_type | uint8 | percent | 255.0 | [] | |
classification_probability | classification_probability | uint8 | percent | 255.0 | [prob] | |
bare_cover_fraction | bare_cover_fraction | uint8 | percent | 255.0 | [bare] | |
builtup_cover_fraction | builtup_cover_fraction | uint8 | percent | 255.0 | [builtup] | |
crops_cover_fraction | crops_cover_fraction | uint8 | percent | 255.0 | [crops] | |
grass_cover_fraction | grass_cover_fraction | uint8 | percent | 255.0 | [grass] | |
mosslichen_cover_fraction | mosslichen_cover_fraction | uint8 | percent | 255.0 | [mosslichen] | |
permanentwater_cover_fraction | permanentwater_cover_fraction | uint8 | percent | 255.0 | [permanentwater] | |
seasonalwater_cover_fraction | seasonalwater_cover_fraction | uint8 | percent | 255.0 | [seasonalwater] | |
shrub_cover_fraction | shrub_cover_fraction | uint8 | percent | 255.0 | [shrub] | |
snow_cover_fraction | snow_cover_fraction | uint8 | percent | 255.0 | [snow] | |
tree_cover_fraction | tree_cover_fraction | uint8 | percent | 255.0 | [tree] | |
cci_landcover | classification | classification | uint8 | 1 | 0.0 | [class] |
Paramètres d’analyse
Cette section définit les paramètres d’analyse, notamment :
« lat, lon, buffer » : latitude/longitude centrales et taille de la fenêtre d’analyse pour la zone d’intérêt
« résolution » : la résolution en pixels à utiliser pour charger l’ensemble de données LULC. La résolution native du produit est de 10 mètres, soit « (-10,10) »
« mesures » : la « bande » ou la mesure à charger à partir du produit, nous pouvons utiliser les noms de mesure natifs de l’un des alias
L’emplacement par défaut est Madagascar
[4]:
lat, lon = -19.4557, 46.4644
buffer = 5.0
resolution=(-500, 500) #resample so we can view a large area
measurements='classification'
#convert the lat,lon,buffer into a range
lons = (lon - buffer, lon + buffer)
lats = (lat - buffer, lat + buffer)
Charger les ensembles de données LULC
Tout d’abord, nous allons charger la couverture terrestre ESRI. Pour ce produit annuel, la fenêtre temporelle répertoriée dans les métadonnées pour une année s’étend du 1er janvier au 1er janvier de l’année suivante, par exemple, les données de 2020 ont une date de début du 1er janvier 2020 et une date de fin du 1er janvier 2021. Nous définissons donc la requête avec l’année et le mois pour éviter de charger des données d’une année voisine.
[5]:
#create reusable datacube query object
query = {
'time': ('2020-07'),
'x': lons,
'y': lats,
'resolution':resolution,
'output_crs': 'epsg:6933',
'measurements':measurements
}
#load the data
ds_io = dc.load(product='io_lulc_v2', **query).squeeze()
print(ds_io)
<xarray.Dataset> Size: 5MB
Dimensions: (y: 2407, x: 1931)
Coordinates:
time datetime64[ns] 8B 2020-07-01T23:59:59.997500
* y (y) float64 19kB -1.825e+06 -1.826e+06 ... -3.028e+06
* x (x) float64 15kB 4.001e+06 4.001e+06 ... 4.965e+06 4.966e+06
spatial_ref int32 4B 6933
Data variables:
classification (y, x) uint8 5MB 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
Attributes:
crs: epsg:6933
grid_mapping: spatial_ref
Nous pouvons maintenant charger les produits « esa_worldcover_2020 », « esa_worldcover_2021 », « cgls_landcover » et « cci_landcover » sur la même région.
[6]:
ds_esa_2020 = dc.load(product='esa_worldcover_2020', time='2020', measurements=measurements, like=ds_io.geobox).squeeze()
print(ds_esa_2020)
<xarray.Dataset> Size: 5MB
Dimensions: (y: 2407, x: 1931)
Coordinates:
time datetime64[ns] 8B 2020-07-01T12:00:00
* y (y) float64 19kB -1.825e+06 -1.826e+06 ... -3.028e+06
* x (x) float64 15kB 4.001e+06 4.001e+06 ... 4.965e+06 4.966e+06
spatial_ref int32 4B 6933
Data variables:
classification (y, x) uint8 5MB 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
Attributes:
crs: PROJCS["WGS 84 / NSIDC EASE-Grid 2.0 Global",GEOGCS["WGS 8...
grid_mapping: spatial_ref
[7]:
ds_esa_2021 = dc.load(product='esa_worldcover_2021', time='2021', measurements=measurements, like=ds_io.geobox).squeeze()
print(ds_esa_2021)
<xarray.Dataset> Size: 5MB
Dimensions: (y: 2407, x: 1931)
Coordinates:
time datetime64[ns] 8B 2021-07-02
* y (y) float64 19kB -1.825e+06 -1.826e+06 ... -3.028e+06
* x (x) float64 15kB 4.001e+06 4.001e+06 ... 4.965e+06 4.966e+06
spatial_ref int32 4B 6933
Data variables:
classification (y, x) uint8 5MB 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
Attributes:
crs: PROJCS["WGS 84 / NSIDC EASE-Grid 2.0 Global",GEOGCS["WGS 8...
grid_mapping: spatial_ref
[8]:
ds_cgls = dc.load(product='cgls_landcover', time='2019', measurements=measurements, like=ds_io.geobox).squeeze()
print(ds_cgls)
<xarray.Dataset> Size: 5MB
Dimensions: (y: 2407, x: 1931)
Coordinates:
time datetime64[ns] 8B 2019-07-02T11:59:59.500000
* y (y) float64 19kB -1.825e+06 -1.826e+06 ... -3.028e+06
* x (x) float64 15kB 4.001e+06 4.001e+06 ... 4.965e+06 4.966e+06
spatial_ref int32 4B 6933
Data variables:
classification (y, x) uint8 5MB 200 200 200 200 200 ... 200 200 200 200 200
Attributes:
crs: PROJCS["WGS 84 / NSIDC EASE-Grid 2.0 Global",GEOGCS["WGS 8...
grid_mapping: spatial_ref
[9]:
ds_cci = dc.load(product='cci_landcover', time='2019', measurements=measurements, like=ds_io.geobox).squeeze()
print(ds_cci)
<xarray.Dataset> Size: 5MB
Dimensions: (y: 2407, x: 1931)
Coordinates:
time datetime64[ns] 8B 2019-07-02T11:59:59.500000
* y (y) float64 19kB -1.825e+06 -1.826e+06 ... -3.028e+06
* x (x) float64 15kB 4.001e+06 4.001e+06 ... 4.965e+06 4.966e+06
spatial_ref int32 4B 6933
Data variables:
classification (y, x) uint8 5MB 210 210 210 210 210 ... 210 210 210 210 210
Attributes:
crs: PROJCS["WGS 84 / NSIDC EASE-Grid 2.0 Global",GEOGCS["WGS 8...
grid_mapping: spatial_ref
Tracé des données
Nous pouvons tracer le LULC pour Madagascar et ajouter une légende qui correspond aux classes en utilisant la fonction wrapper DE Africa plot_lulc
. Nous pouvons voir que les arbres dominent les zones orientales de l’île, tandis que les broussailles/arbustes sont plus répandus du côté ouest. Nous pouvons également identifier quelques villes/villages avec la classe rouge « zone construite ». Vous remarquerez peut-être également que les différents ensembles de données ne concordent pas toujours.
[10]:
fig, ax = plt.subplots(3, 2, figsize=(22, 20), sharey=True)
plot_lulc(ds_io[measurements], product="IO", legend=True, ax=ax[0, 0])
plot_lulc(ds_esa_2020[measurements], product="ESA", legend=True, ax=ax[0, 1])
plot_lulc(ds_esa_2021[measurements], product="ESA", legend=True, ax=ax[1, 1])
plot_lulc(ds_cgls[measurements], product="CGLS", legend=True, ax=ax[1, 0])
plot_lulc(ds_cci[measurements], product="CCI", legend=True, ax=ax[2, 0])
ax[0, 0].set_title("ESRI/IO Land Cover 2020")
ax[0, 1].set_title("ESA WorldCover 2020")
ax[1, 1].set_title("ESA WorldCover 2021")
ax[1, 0].set_title("CGLS landcover 2019")
ax[2, 0].set_title("CCI landcover 2019")
fig.delaxes(ax[2, 1])
plt.tight_layout();

Exemple d’analyse : Enquête sur la zone des classes
Dans cet exemple, nous allons examiner de plus près la ville d’Antananarivo, la capitale de Madagascar, qui est visible en rouge sur la carte ci-dessus. Nous allons charger tous les ensembles de données LULC, calculer la surface de chaque classe dans chaque produit et comparer la surface des classes entre les produits. Comme nous examinons une zone plus petite, nous pouvons charger les ensembles de données à une résolution de 100 m (il est recommandé de sous-échantillonner les ensembles de données à haute résolution à une résolution plus grossière que l’inverse). Nous utilisons la statistique « mode » pour sous-échantillonner les ensembles de données de 10 m à une résolution de 100 m, ce qui signifie que chaque pixel se verra attribuer la classe la plus courante dans le pixel de 100 m.
Commençons d’abord par définir quelques nouveaux paramètres
[11]:
lat, lon = -18.9028, 47.5203
buffer = 0.1
resolution=(-100,100)
measuremnents='classification'
#add lat,lon,buffer to get bounding box
lon_range = (lon-buffer, lon+buffer)
lat_range = (lat+buffer, lat-buffer)
Afficher l’emplacement sélectionné
[12]:
display_map(x=lon_range, y=lat_range)
[12]:
Charger les données LULC pour Antananarivo
[13]:
query = {
"x": lon_range,
"y": lat_range,
"resolution": resolution,
"output_crs": "epsg:6933",
"measurements": measurements,
}
# load the esri product
ds_io = dc.load(product="io_lulc_v2", resampling='mode',
time='2020-07', **query).squeeze()
# load the esa 2020 product
ds_esa_2020 = dc.load(product="esa_worldcover_2021", resampling='mode',
time='2021', measurements=measurements, like=ds_io.geobox).squeeze()
# load the esa 2021 product
ds_esa_2021 = dc.load(product="esa_worldcover_2020", resampling='mode',
time='2020', measurements=measurements, like=ds_io.geobox).squeeze()
# load the cgls product
ds_cgls = dc.load(
product="cgls_landcover",
time="2019",
measurements=measurements,
like=ds_io.geobox
).squeeze()
# load the cci product
ds_cci = dc.load(
product="cci_landcover",
time="2019",
measurements=measurements,
resampling='nearest',
like=ds_io.geobox
).squeeze()
Tracer les ensembles de données
[14]:
fig,ax = plt.subplots(3,2, figsize=(22,20), sharey=True)
plot_lulc(ds_io[measurements], product='IO', legend=True, ax=ax[0,0])
plot_lulc(ds_esa_2020[measurements], product='ESA', legend=True, ax=ax[0,1])
plot_lulc(ds_esa_2021[measurements], product='ESA', legend=True, ax=ax[1,1])
plot_lulc(ds_cgls[measurements], product='CGLS', legend=True, ax=ax[1,0])
plot_lulc(ds_cci[measurements], product='CCI', legend=True, ax=ax[2,0])
ax[0,0].set_title('ESRI/IO Land Cover')
ax[0,1].set_title('ESA WorldCover 2020')
ax[1,1].set_title('ESA WorldCover 2021')
ax[1,0].set_title('CGLS Classification 2019')
ax[2,0].set_title('CCI Classification 2019')
fig.delaxes(ax[2, 1])
plt.tight_layout();

Calculer l’aire de chaque classe
Nous pouvons utiliser la fonction numpy « np.unique » pour renvoyer le nombre de pixels pour chaque classe.
[15]:
ds_io_counts = np.unique(ds_io[measurements].data, return_counts=True)
ds_esa_2020_counts = np.unique(ds_esa_2020[measurements].data, return_counts=True)
ds_esa_2021_counts = np.unique(ds_esa_2021[measurements].data, return_counts=True)
ds_cgls_counts = np.unique(ds_cgls[measurements].data, return_counts=True)
ds_cci_counts = np.unique(ds_cci[measurements].data, return_counts=True)
print(ds_io_counts)
(array([ 1, 2, 4, 5, 7, 8, 11], dtype=uint8), array([ 1360, 306, 2312, 8052, 23874, 130, 10672]))
Nous pouvons voir ci-dessus que le résultat est un tableau avec les classes 1:11 qui correspondent à « eau » jusqu’à « pâturages », et le nombre de pixels dans ces classes. En utilisant la résolution que nous avons définie dans notre requête de chargement de données, nous pouvons calculer la superficie totale de chaque classe en kilomètres carrés et tracer les résultats. Le tracé correspond-il aux proportions des classes que nous pouvons visualiser sur la carte d’Antananarivo ?
Pour plus d’informations sur les calculs de superficie, consultez la section sur le calcul de l’étendue d’eau du cours de formation Digital Earth Africa Sandbox <https://learn.digitalearthafrica.org/courses/course-v1:digitalearthafrica+DEA101+2021/course/>`__.
[16]:
pixel_length = query["resolution"][1] # in metres, refers to resolution we defined above (-10,10) for Antananarivo
m_per_km = 1000 # conversion from metres to kilometres
area_per_pixel = pixel_length**2 / m_per_km**2
#calculate the area of each class
ds_io_area = np.array(ds_io_counts[1] * area_per_pixel)
ds_esa_2020_area = np.array(ds_esa_2020_counts[1] * area_per_pixel)
ds_esa_2021_area = np.array(ds_esa_2021_counts[1] * area_per_pixel)
ds_cgls_area = np.array(ds_cgls_counts[1] * area_per_pixel)
ds_cci_area = np.array(ds_cci_counts[1] * area_per_pixel)
Tracer l’aire de chaque classe
Dans le graphique ci-dessous, les proportions de classes sont-elles similaires entre les produits ? Quelles sont les classes qui présentent généralement une confusion ?
[17]:
# list of classes actually in the map by extracting from the `flags_definition`
io_classes = [ds_io.classification.flags_definition['data']['values'][str(x)] for x in ds_io_counts[0]]
esa_classes_2020 = [ds_esa_2020.classification.flags_definition['data']['values'][str(x)] for x in ds_esa_2020_counts[0]]
esa_classes_2021 = [ds_esa_2021.classification.flags_definition['data']['values'][str(x)] for x in ds_esa_2021_counts[0]]
cgls_classes = [ds_cgls.classification.flags_definition['data']['values'][str(x)] for x in ds_cgls_counts[0]]
cci_classes = [ds_cci.classification.flags_definition['data']['values'][str(x)] for x in ds_cci_counts[0]]
[18]:
fig,ax=plt.subplots(1,5, figsize=(20,5))
#plot esri
ax[0].bar(io_classes, ds_io_area)
ticks_loc = ax[0].get_xticks()
ax[0].xaxis.set_major_locator(mticker.FixedLocator(ticks_loc))
ax[0].set_xticklabels(io_classes, rotation=90)
ax[0].set_xlabel("LULC class")
ax[0].set_ylabel("Area (Sq. km)")
#plot esa worldcover 2020
ax[1].bar(esa_classes_2020, ds_esa_2020_area)
ticks_1 = ax[1].get_xticks()
ax[1].xaxis.set_major_locator(mticker.FixedLocator(ticks_1))
ax[1].set_xticklabels(esa_classes_2020, rotation=90)
ax[1].set_xlabel("LULC class")
ax[1].set_ylabel("Area (Sq. km)")
#plot esa worldcover 2021
ax[2].bar(esa_classes_2021, ds_esa_2021_area)
ticks_1 = ax[2].get_xticks()
ax[2].xaxis.set_major_locator(mticker.FixedLocator(ticks_1))
ax[2].set_xticklabels(esa_classes_2021, rotation=90)
ax[2].set_xlabel("LULC class")
ax[2].set_ylabel("Area (Sq. km)")
#plot cgls
ax[3].bar(cgls_classes, ds_cgls_area)
ticks_2 = ax[3].get_xticks()
ax[3].xaxis.set_major_locator(mticker.FixedLocator(ticks_2))
ax[3].set_xticklabels(cgls_classes, rotation=90)
ax[3].set_xlabel("LULC class")
ax[3].set_ylabel("Area (Sq. km)")
#plot cci
ax[4].bar(cci_classes, ds_cci_area)
ticks_2 = ax[4].get_xticks()
ax[4].xaxis.set_major_locator(mticker.FixedLocator(ticks_2))
ax[4].set_xticklabels(cci_classes, rotation=90)
ax[4].set_xlabel("LULC class")
ax[4].set_ylabel("Area (Sq. km)")
# Adjust spacing between subplots
plt.subplots_adjust(wspace=0.3)
ax[0].set_title('ESRI/IO Land Cover')
ax[1].set_title('ESA WorldCover 2020')
ax[2].set_title('ESA WorldCover 2021')
ax[3].set_title('CGLS Landcover')
ax[4].set_title('CCI Landcover');

Découvrir la fraction de couverture CGLS
Dans l’analyse ci-dessus, nous pouvons voir que le produit CGLS classe une grande partie de la zone dans nos limites d’Antananarivo comme « urbaine ou construite ». Voyons comment cela se rapporte à la mesure de la fraction de couverture construite dans le produit CGLS.
Les mesures de fraction de couverture dans CGLS expriment le pourcentage du pixel qui est couvert par une classe spécifique de couverture du sol, dans ce cas urbain ou bâti. Nous pouvons voir ci-dessous que le pourcentage de couverture de la zone urbaine ou bâtie correspond spatialement à la classification de la couverture du sol.
[19]:
#load the cgls product
ds_cgls_urbancover = dc.load(product='cgls_landcover', time='2019', measurements='builtup_cover_fraction', like=ds_cgls.geobox).squeeze()
#plot the dataset
fig,ax = plt.subplots(1,2, figsize=(24,9), sharey=True)
ds_cgls_urbancover.builtup_cover_fraction.plot(ax=ax[0])
plot_lulc(ds_cgls[measurements], product='CGLS', legend=True, ax=ax[1])
ax[0].set_title('Built-up cover %')
ax[1].set_title('CGLS Landcover')
plt.tight_layout();

Informations Complémentaires
Licence : Le code de ce carnet est sous licence Apache, version 2.0 <https://www.apache.org/licenses/LICENSE-2.0>. Les données de Digital Earth Africa sont sous licence Creative Commons par attribution 4.0 <https://creativecommons.org/licenses/by/4.0/>.
Contact : Si vous avez besoin d’aide, veuillez poster une question sur le canal Slack Open Data Cube <http://slack.opendatacube.org/>`__ ou sur le GIS Stack Exchange en utilisant la balise open-data-cube
(vous pouvez consulter les questions posées précédemment ici). Si vous souhaitez signaler un problème avec ce bloc-notes, vous pouvez en déposer un sur Github.
Version de Datacube compatible :
[20]:
print(datacube.__version__)
1.8.19
Dernier test :
[21]:
from datetime import datetime
datetime.today().strftime('%Y-%m-%d')
[21]:
'2024-11-22'