Interpolation de raster

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Vivien Leonard
Messages : 6
Enregistré le : 04 Avr 2018, 23:15

Interpolation de raster

Messagepar Vivien Leonard » 05 Avr 2018, 08:48

J'ai 6 fichiers.tif. Chaque fichier représente la même zone, mais pour des années différentes :
  • 1990, 1995, 2000, 2005, 2005, 2010, 2015.

Ils ont donc tous les mêmes coordonnées.

J'arrive à extraire x, y, et la valeur correspondant au couple x,y donc pas de problème avec ça.

Maintenant j'ai 6 data.frames, chacun contient x,y et la valeur, pour les années citées au dessus.

Ce que je veux faire est d'utiliser une interpolation linéaire pour déterminer la valeur de chaque cellule, pour les autres années (1991, 1992, ...., 2014).

J'ai testé différente choses. Notamment de passer par un stack de mes rasters, puis de travailler sur ce stack, mais pour l'instant je n'arrive pas à m'en sortir.
Voici un exemple de jeu de donnée :

Code : Tout sélectionner

   
 info      x       y
0.90710944 4525000 4875000
0.90710950 4535000 4875000
2.15048623 4545000 4875000
2.15048623 4555000 4875000
2.15048623 4565000 4875000
2.15048623 4575000 4875000
2.15048623 4585000 4875000
0.23983701 4595000 4875000
0.23983701 4605000 4875000


Voici mon code, qui est très très simple :
fonction "traitement_function"

Code : Tout sélectionner

traitement_function<-function(path_file)
{
  rast<-raster(path_file)
  #On récupère les coordonnees dans un data frame
  coord_data<-as.data.frame(rasterToPoints(rast,spatial=TRUE))
  return (coord_data)
}


Mes appels de fonctions :

Code : Tout sélectionner

lamb1990<-traitement_function("notre_chemin_ici")

lamb1995<-traitement_function("notre_chemin_ici)

lamb2000<-traitement_function("notre_chemin_ici")

lamb2005<-traitement_function("notre_chemin_ici")

lamb2010<-traitement_function("notre_chemin_ici")

lamb2015<-traitement_function("notre_chemin_ici")


Et voici ce que j'ai tenté de faire, sans grande réussite (même aucune) :

Code : Tout sélectionner

sx<-stack(unlist(lamb1990,lamb1995,lamb2000))
sx_bis<-stack(unlist(sx,lamb2005,lamb2010))
s<-stack(unlist(sx_bis,lamb2015))

x <- calc(s, fun=function(y) approx(seq(1,26,5), y, 1:26)$y)


Mais je pense pas que ce soit la bonne solution, car je remarque que je perd de l'information lors du stack, ce qui n'est pas vraiment le but.
Je passe de 3 colonnes à 2, et elles n'ont plus vraiment de sens.
J'ai également regarder du côté de la fonction "approx" mais pas moyen de comprendre comment elle fonctionne, et donc de la faire fonctionner.

Une fois le stack fait voilà un petit extrait de ce que j'obtient :

Code : Tout sélectionner

0.003543756 LAMBfrom1000_10km_gpw.v1.population.density_19901
0.003543756 LAMBfrom1000_10km_gpw.v1.population.density_19902
0.003543756 LAMBfrom1000_10km_gpw.v1.population.density_19903
0.003543756 LAMBfrom1000_10km_gpw.v1.population.density_19904


Même si je pense comprendre, il a "remplacer" x et y par ind (indice de chaque cellule j'imagine), et value, reste value mais les valeurs semblent très différente de celles de départs. Mais je ne dois pas bien saisir ce que fait exactement la fonction stack.


Si quelqu'un a une piste ou quelque chose pour m'aider je suis preneur ! Je ne vois pas du tout comment je pourrais faire.
J'espère qu'il ne manque pas d'information, et que ce n'est pas trop le bazar pour comprendre.

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Interpolation de raster

Messagepar Pierre-Yves Berrard » 05 Avr 2018, 09:12

Bonjour,
Vivien Leonard a écrit :Si quelqu'un a une piste ou quelque chose pour m'aider je suis preneur !

Je commencerais par fusionner (merge) les data.frames pour avoir quelque chose du style :

Code : Tout sélectionner

x   y   info_1990 info_1995 ...
... ... ...       ...

L'interpolation sera ensuite un simple calcul vectoriel sur les colonnes info_.
PY

Vivien Leonard
Messages : 6
Enregistré le : 04 Avr 2018, 23:15

Re: Interpolation de raster

Messagepar Vivien Leonard » 05 Avr 2018, 09:35

Merci de votre réponse !


En utilisant le package qpcR, j'ai réussi à merge les data frames, voilà la structure finale :

Code : Tout sélectionner

  x          y            1990                   1995        2000 2005 2010 2015
3115000   5665000   0.00354375597089529   0.0034868239890784   0   0   0   0
3125000   5665000   0.00354375597089529   0.0034868239890784   0   0   0   0
3135000   5665000   0.00354375597089529   0.0034868239890784   0   0   0   0
3145000   5665000   0.00354375597089529   0.0034868239890784   0   0   0   0
3155000   5665000   0.00354375597089529   0.00348682375624776   0   0   0   0


Néanmoins j'ai du mal à voir ce que vous voulez dire par "un simple calcul vectoriel sur les colonnes info".

Pierre-Yves Berrard
Messages : 1029
Enregistré le : 12 Jan 2016, 23:30

Re: Interpolation de raster

Messagepar Pierre-Yves Berrard » 05 Avr 2018, 10:51

Un exemple avec une boucle for :

Code : Tout sélectionner

donnees <- read.table(header = TRUE, check.names = FALSE,
text = "x y 1990 1995 2000 2005 2010 2015
3115000   5665000   0.00354375597089529   0.0034868239890784    0   0   0   0
3125000   5665000   0.00354375597089529   0.0034868239890784    0   0   0   0
3135000   5665000   0.00354375597089529   0.0034868239890784    0   0   0   0
3145000   5665000   0.00354375597089529   0.0034868239890784    0   0   0   0
3155000   5665000   0.00354375597089529   0.00348682375624776   0   0   0   0")

Code : Tout sélectionner

for (annee in 1990:2014) {
 
  # calculs préparatoires
  debut <- annee %/% 5 * 5
  fin <- debut + 5
  debut_c <- as.character(debut)
  fin_c <- as.character(fin)
  evol_ann <- (donnees[[fin_c]] - donnees[[debut_c]]) / 5
 
  # création de la variable (calcul vectoriel)
  donnees[[as.character(annee)]] <- donnees[[debut_c]] + evol_ann * (annee - debut)
 
}


Une méthode alternative est d'utiliser une combinaison de approx() et apply().
PY

Vivien Leonard
Messages : 6
Enregistré le : 04 Avr 2018, 23:15

Re: Interpolation de raster

Messagepar Vivien Leonard » 05 Avr 2018, 15:26

Merci beaucoup de votre réponse ! Très astucieux je n'y avais pas penser.

Ca marche, et les données semblent cohérente donc merci beaucoup ! Vous m'enlevez un poids de la tête !


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

cron