Calcul de l’indice de végétation NDVI avec PostgeSQL/Postgis

En télédétection, les indices font parties des méthodes de traitement que l’on appelle les transformations multispectrales. Ils consistent à convertir les luminances mesurées au niveau du capteur satellitaire en grandeurs ayant une signification dans le domaine de l’environnement.

Basés sur le caractère multispectral des données satellitaires, ils permettent de décrire l’état d’un phénomène. Un indice de végétation par exemple, peut rendre compte du stade de croissance végétale à un moment donné.
Tous les indices, que ce soient les indices de végétation, les indices des sols, les indices relatifs à la colonne d’eau, etc., reposent sur une approche empirique basée sur des données expérimentales. Les indices de végétation sont très utilisés d’une part, pour identifier et suivre la dynamique de la végétation, mais aussi pour estimer certains paramètres biophysiques caractéristiques des couverts végétaux, comme la biomasse, l’indice de surface foliaire, la fraction de rayonnement photosynthétique actif, etc.

L’indice le plus connu et le plus utilisé est l’indice de végétation par différence normalisé ou indice de Tucker (NDVI en anglais) (Rouse and Haas, 1973 ; Tucker, 1979). Son expression est la suivante :

(pir-rouge)/(pir+rouge)

Je suppose que vous vous êtes déjà familiarisés avec Postgis ,Qgis et Gdal.

Les données : Images Quickbird (Visible +proche infrarouge)

composition colorée DIOUCK

Composition colorée Rouge +PIR

Assemblage des données avec Gdal

Pour faciliter les traitements, j’ai assemblé les bandes du rouge et du proche infra-rouge dont nous aurons besoin pour calculer le NDVI. Si vous n’avez pasGdal je vous conseille d’intaller FWtools

–Stack Bande
gdal_merge -separate  bande3.tif bande4.tif -o bande34.tif

Pour vérifier notre stack voici la commande gdalinfo bande34.tif

gdalinfo_bande

 gdalinfo sur le stack

Et là on distingue bien nos deux bandes : La bande 1 correspond au rouge et la bande 2 au PIR

Importation des données dans Postgis :

J’ai créé un script bat pour l’intégration des données

REM Paramètres de connections
set PGPORT=5432
set PGHOST=localhost
set PGUSER=postgres
set PGPASSWORD=postgres
REM on traite le raster en le transformant en une suite de commandes SQL pour le schema ‘raster’ . Le –t permet de tuiler la donnée et le –I une indexation pour  gagner en performance
« C:\Program Files\PostgreSQL\9.3\bin\raster2pgsql »  -s 4326 -C -I -r -M -F -t 100×100  « D:\Postgis Raster\Satellite\QuickBird\ bande34.tif »  raster. bande34> bande34.sql
REM on crée la table raster dans notre base BDU de donnée via psql
« C:\Program Files\PostgreSQL\9.3\bin\psql » -d bdu -f bande34.sql
 
 
 
 

Calcul de l’indice de végétation  NDVI

L’indice le plus connu et le plus utilisé est l’indice de végétation par différence normalisé ou indice de Tucker (NDVI en anglais) (Rouse and Haas, 1973 ; Tucker, 1979). Son expression est la suivante :

La formule est la suivante (pir-rouge)/(pir+rouge)

Voici la requête dans postgis

create table ndvi as
select ST_MapAlgebra(a.rast, 2, a.rast, 1, ‘([rast1] – [rast2])/([rast1] + [rast2])::float’, ’32BF’) as rast
FROM raster.bande34 a

 

Visualisation dans QGIS

Comme vous pouvez le constater nous avons bien les valeurs du NDVI comprises entre -0.9 à 0.68.
Une simple classification permet de visualiser les différentes classes d’occupation du sol qui sont pareilles que la classification que j’ai fait avec les mêmes données à partir de QGIS

NDVI avec POSTGIS

NDVI POSTGIS DIOUCK
NDVI avec QGIS
NDVI QGIS DIOUCK

 

 

Publicités

Coupe du monde 2014: Selection de l’équipe de France

Bonjour tout le monde

Me voici de nouveau pour vous présenter une façon très simple de d’exploiter les données de la coupe du monde.

Pour se mettre au diapason, je décide de créer une application sur la sélection de l’équipe de France 2014 en fonction de leur ville de naissance.

L’application est disponible ici

Coupe du monde selection de l'equipe de france 2014

La source des données de la liste des joueurs très provient de Wikipédia puis géolocalisation des villes en produisant un KML avec google map.

La seconde étape une jointure attributaire entre mon fichier Xsl et le KML dans QGIS et le tours est joué.

 

Quelques CSS plus tard et hop j’ai une carte

 

coupe du monde

Donc rien de plus simple à première vue! La sélection de l’équipe de France en fonction de leur lieu de naissance.

 

Intéressant mais on aimerai bien créer des cluster pour éviter d’avoir les jours serrer contre eux comme devant coup franc!

Pour ce faire,rien de plus simple

On appelle la données geojson puis on le clusterise
var points_rand = L.geoJson(points,{onEachFeature:onEachFeature}/*, {
onEachFeature: function (feature, layer) //functionality on click on feature
{
layer.bindPopup(« hi! I am one of thousands »); //just to show something in the popup. could be part of the geojson as well!
}
}*/);

markers.addLayer(points_rand); // add it to the cluster group
map.addLayer(markers); // add it to the map
map.fitBounds(markers.getBounds()); //set view on the cluster extend

var MarkerCluster = new L.MarkerClusterGroup({
spiderfyOnMaxZoom: true,
showCoverageOnHover: false,
zoomToBoundsOnClick: true,
disableClusteringAtZoom: 16
});
map.addLayer(MarkerCluster);
Quelques codes plus tard !

selection équipe de france

Maintenant pour styliser les cluster par des photos on crée des styles pour chaque joueur

du genre

var cabella = L.icon({
iconUrl: ‘joueurs/cabella.jpg’,
iconSize: [32, 37],
iconAnchor: [16, 37],
popupAnchor: [0, -37]
});

Et enfin on fait le lien avec la donnée . Exemple si l’identifiant cabaye =1 alors on lui attribut le style cabaye qui correspond à sa photo

var markers = L.markerClusterGroup();
var points_rand = L.geoJson(points,{
pointToLayer: function (feature, latlng) {
switch (feature.properties.id) {
case ‘1’: return L.marker(latlng, {icon: cabaye});
case ‘2’: return L.marker(latlng, {icon: ruffier});
}
},onEachFeature:onEachFeature});

markers.addLayer(points_rand); // add it to the cluster group
map.addLayer(markers);        // add it to the map
//map.fitBounds(markers.getBounds()); //set view on the cluster extend

var MarkerCluster = new L.MarkerClusterGroup({
spiderfyOnMaxZoom: false,
showCoverageOnHover: false,
zoomToBoundsOnClick: false,
disableClusteringAtZoom: 16
});
map.addLayer(MarkerCluster);

map world fifa cup brasil franceEt enfin ca serait encore plus sympas de rajouter la phtoto des joueur et un controle pour récupérer le popup dans un css à gauche.