IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

R Discussion :

Aide Fonction Rasterize et autre


Sujet :

R

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Chargée de mission télédétection
    Inscrit en
    Janvier 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Chargée de mission télédétection

    Informations forums :
    Inscription : Janvier 2016
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Aide Fonction Rasterize et autre
    Bonjour à tous,

    Je dois actuellement reprendre un script qui permet, dans un premier temps, de rasteriser des polygones et d’extraire des pixels. Pour cela des fonctions ont été créees pour contourner la lenteur des temps de traitements des fonctions incluent dans les packages.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    library(sp)
    library(rgdal)
    library(raster) ; rasterOptions(tmpdir = 'D://TEMP')
    library(data.table)
    library(colorspace)  # HLS
    library(rgl)
    library(png)
    library(sm)  # Density
    library(FactoMineR)  # ACP
    library(MASS)
    library(cluster)
     
    library(tree)
    library(randomForest)
    library(e1071)  # SVM
     
    library(caret)
    library(leaps)
     
     
    rasterize.gdal <- function(x, rast, attr) {
      grid.extent <- extent(rast)
      resolution  <- res(rast)
     
      command.base       <- "gdal_rasterize -ot Byte -a_nodata 255"
      command.attr       <- paste("-a", attr)
      command.extent     <- paste("-te", grid.extent@xmin, grid.extent@ymin, grid.extent@xmax, grid.extent@ymax)
      command.resolution <- paste("-tr", res(rast)[1], res(rast)[2])
      command.src        <- x
      command.dst        <- paste(x, ".tif", sep = "")
     
      command <- paste(command.base, command.attr, command.extent, command.resolution, command.src, command.dst)
      system(command)
     
      raster(command.dst)
    }
     
     
    extract.pixels <- function(x, repository) {
      file.name     <- basename(x)
     
      # Build search pattern from shapefile name
      layername     <- sub("\\.[^.]+$", "", file.name)
      file.basename <- sub(".CLASS.+$", "-TOA", file.name)
      file.pattern  <- paste(file.basename, ".*\\.TIF$", sep = "")
     
      # Look for matching rasters
      file.images   <- list.files(repository, full.names = T, recursive = T, pattern = file.pattern) ; print(file.images)
     
      # Shapefile class attribute name
      classes.attr  <- "class_code"
     
     
      # Load rasters
     # beginCluster()
      layers         <- stack(file.images)
     
      classes.vector <- readOGR(f, layername)
      classes.raster <- rasterize(f, layers, classes.attr) # Affecte la classe à chaque pixel
     
      # Shorten variable names
      names(layers) <- sub(gsub("-", ".", file.basename), "", names(layers))
      names(layers) <- sub("^.",  "",   names(layers))
      names(layers) <- sub("\\.", "_",  names(layers))
     
      names(layers) <- sub("^S_", "s", names(layers))
      names(layers) <- sub("^W_", "w", names(layers))
      names(layers) <- sub("^V_", "v", names(layers))
      names(layers) <- sub("^T_", "t", names(layers))
     
      names(layers) <- sub("HLS_1", "H", names(layers))
      names(layers) <- sub("HLS_2", "L", names(layers))
      names(layers) <- sub("HLS_3", "S", names(layers))
     
      names(layers) <-  sub("^X[^0-9]", "X", names(layers)) #; print(names(layers))
     
      # Scale reflectance to [0, 1]
      layers[["X1"]] <- layers[["X1"]]/1000.0
      layers[["X2"]] <- layers[["X2"]]/1000.0
      layers[["X3"]] <- layers[["X3"]]/1000.0
      layers[["X4"]] <- layers[["X4"]]/1000.0 #; print("Scaled reflectance.")
     
     
      # Pixel centers
      point <- rasterToPoints(classes.raster, spatial = TRUE, progress = "text") #; print("Computed pixel centers.")
      names(point@data)[[1]] <- classes.attr
     
      # Load class pixel variable values as point attributes
      print("Extracting variable values...")
      point <- extract(layers, point, sp = TRUE, progress = "text")
     # endCluster()
      print("Done.")
      rm(layers)
     
      # Retrieve attribute table as a dataframe
      point.data <- point@data ; print(paste("Exported dataframe. Length:", nrow(point.data)))
      return(point.data)
    }
     
    repo    <- "/SEAS/02-Images"  # Répertoire
    pattern <- "-CLASS-RD\\.shp$"  # R&D
    files <- list.files(repo, full.names = T, recursive = T, pattern = pattern) ; print(files) #, ignore.case = T) # files <- rev(files)
    rm(pattern)
     
    rm(dataset)
    for (f in files) {
      print(f)
     
      if (exists("dataset")){  #print("Extracting new data...")
        dataset.new <- extract.pixels(f, repo)  #; print("Extracted new data.")
        dataset.new <- cbind(dataset.new, basename(f)) ; print(colnames(dataset)) ; print(colnames(dataset.new))
        dataset     <- rbind(dataset, dataset.new)  #; print("Appending new data.")
        rm(dataset.new)  #; print("Removing temp new data.")
      } else {  #print("Creating data...")
        dataset     <- extract.pixels(f, repo)  #; print("Created data.")
        dataset     <- cbind(dataset, basename(f))
      }
    }
    Tous les fichiers sont bien retrouvés dans le dossier. Toutefois, j'ai ceci comme erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Error in (function (classes, fdef, mtable)  : 
      unable to find an inherited method for function ‘rasterize’ for signature ‘"character", "RasterStack"
    Pourriez-vous m'aider à comprendre ce qui engendre ce genre d'erreur ? Je suis novice et je ne comprends pas ce qui cloche. De plus, si je souhaite continuer le script, "dataset" n'est pas reconnue après cette partie de script, pourquoi?

    Je vous remercie d'avance pour votre aide,

    Sarah

  2. #2
    Modératrice

    Femme Profil pro
    Statisticienne, Fondatrice de la société DACTA
    Inscrit en
    Juin 2010
    Messages
    893
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Statisticienne, Fondatrice de la société DACTA

    Informations forums :
    Inscription : Juin 2010
    Messages : 893
    Points : 2 673
    Points
    2 673
    Par défaut
    Bonjour,

    Je dois avouer que je ne me suis pas plongée dans le détail de votre script mais la ligne 105 : rm(dataset) , pourrait peut-être être la cause de la "disparition" de l'élément dataset.

    Bon courage pour la suite !


    Cordialement,


    A.D.

    Forum R
    Fournir le code utilisé (pensez aux balises code !), les packages nécessaires, ainsi qu'un court mais représentatif extrait du jeu de données et les éventuels messages d'erreur.
    Recherche d'informations concernant R : RSiteSearch / tutoriels : http://r.developpez.com/cours/ .

    Pensez également au bouton "Résolu" et à voter (en bas à droite des messages) lorsque vous avez obtenu une réponse satisfaisante.

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Chargée de mission télédétection
    Inscrit en
    Janvier 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Chargée de mission télédétection

    Informations forums :
    Inscription : Janvier 2016
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour A.D.

    Le de la ligne 105 ne fait que supprimer l’éventuel dataset déjà présent, dans le cas où l'on fait tourner le script en boucle. Le dataset est recréé juste après.

    Mais merci de votre réponse!

    Sarah

  4. #4
    Membre actif
    Homme Profil pro
    Bioinformaticien
    Inscrit en
    Octobre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 126
    Points : 296
    Points
    296
    Par défaut
    Citation Envoyé par SarahB7 Voir le message
    [...]
    Error in (function (classes, fdef, mtable)  : 
      unable to find an inherited method for function ‘rasterize’ for signature ‘"character", "RasterStack"’
    Pourriez-vous m'aider à comprendre ce qui engendre ce genre d'erreur ? [...]
    Les trois lignes suivantes y répondent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    library("raster")
    isGeneric("rasterize")
    showMethods("rasterize")
    [1] TRUE
    
    Function: rasterize (package raster)
    x="data.frame", y="Raster"
    x="Extent", y="Raster"
    x="matrix", y="Raster"
    x="SpatialLines", y="Raster"
    x="SpatialPoints", y="Raster"
    x="SpatialPolygons", y="Raster"
    La bibliothèque (ou le package) raster définit une méthode générique appelée rasterize. Actuellement, cette générique a six implémentations qui viennent avec la bibliothèque. Chacune des six méthodes a sa propre signature (i.e. des paramètres formels, leurs types, leur nombre, etc.). Parmi toutes les signatures disponibles, aucune ne supporte que le paramètre formel x soit de type character et le paramètre formel y de type RasterStack.

    À vous donc de
    • soit définir une nouvelle méthode dont la générique sera rasterize et dont la signature sera x="character", y="RasterStack"
    • soit utiliser une des méthodes existantes avec de bons paramètres effectifs.


    À noter qu'il s'agit ici du style (système) S4 de programmation orientée objet. Dans le script, la fonction rasterize.gdal donne l'impression d'avoir été conçue pour le style S3, ce qui serait une piste à explorer : si cela s'avère vrai, alors cela signifiera que dans une version antérieure, rasterize était une générique S3 et a plus tard été réécrite en S4.

    Mais il n'y a pas beaucoup d'espoirs que cette piste soit la bonne car même si ces suppositions étaient vraies, la signature ("character", "RasterStack") reste inapplicable : rasterize.gdal signifierait plutôt une implémentation de rasterize valable si le premier argument est de type gdal.

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Chargée de mission télédétection
    Inscrit en
    Janvier 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Chargée de mission télédétection

    Informations forums :
    Inscription : Janvier 2016
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Merci de votre réponse et de m'avoir éclairé. Je comprends mieux ce que l'erreur renvoyée signifie.

    soit définir une nouvelle méthode dont la générique sera rasterize et dont la signature sera x="character", y="RasterStack"
    Ayant, une raster stack c'est ce qu'il faut que je fasse. Toutefois, comment fait-on pour définir la générique de la fonction comme une RasterStack ou tout autre signature?

    Cordialement,

    Sarah

  6. #6
    Membre actif
    Homme Profil pro
    Bioinformaticien
    Inscrit en
    Octobre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 126
    Points : 296
    Points
    296
    Par défaut
    Citation Envoyé par SarahB7 Voir le message
    [...] Ayant, une raster stack c'est ce qu'il faut que je fasse. Toutefois, comment fait-on pour définir la générique de la fonction comme une RasterStack ou tout autre signature? [...]
    C'est de la programmation orienté objet en R, à l'aide su système S4. Il y a une fonction générique prédéfinie, vous souhaitez en ajouter une méthode. C'est alors setMethod qu'il faut utiliser. Deux tutoriels sur le sujet :

    La bibliothèque raster utilise beaucoup S4. Étant donné que globalement, vous cherchez à personnaliser certaines de ses fonctionnalités, vous documentez sur S4 me paraît être un pré-requis à l'accomplissement de vos objectifs. Cependant, si on se borne sur l'erreur signalée plus haut, vous pourrez mettre de côté S4 pour le moment ; deux points à signaler à propos du script :

    1. aux lignes 58 et 59, les appels de fonctions utilisent un paramètre appelé f. Celui-ci n'est défini nulle part dans la fonction extract.pixels et il sera donc considéré comme une variable globale. Appeler des variables globales dans des fonctions est une pratique à éviter au maximum possible. Dans le cas présent, peut-être que c'est x et non pas f qui est le bon argument à utiliser, x étant le premier argument formel de extract.pixels.
    2. à partir de la ligne 102, les noms des fichiers peuvent être stockés dans une matrice à deux colonnes, de type matrix ou data.frame en vue de respecter les signatures de rasterize. À voir si la logique de votre application le permet. Si c'est possible, il suffira d'appeler rasterize en lui donnant comme premier argument cette matrice. En effet,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    library(raster)
    showMethods("rasterize")
    extends("RasterStack", "Raster")
    getClass("RasterStack")
    Function: rasterize (package raster)
    x="data.frame", y="Raster"
    x="Extent", y="Raster"
    x="matrix", y="Raster"
    x="SpatialLines", y="Raster"
    x="SpatialPoints", y="Raster"
    x="SpatialPolygons", y="Raster"
    
    > extends("RasterStack", "Raster")
    [1] TRUE
    > getClass("RasterStack")
    Class "RasterStack" [package "raster"]
    
    Slots:
                                                                                
    Name:   filename    layers     title    extent   rotated  rotation     ncols
    Class: character      list character    Extent   logical .Rotation   integer
                                                  
    Name:      nrows       crs   history         z
    Class:   integer       CRS      list      list
    
    Extends: 
    Class "Raster", directly
    Class "RasterStackBrick", directly
    Class "BasicRaster", by class "Raster", distance 2
    le code ci-haut et ses sorties montrent que la classe RasterStack hérite de Raster (et d'autres classes). Alors, les signatures qui s'attendent à ce que y soit une instance de Raster peuvent en accepter une de RasterStack. Pour x, matrix et data.frame sont des options.

    Tout ça est basé sur « un regard syntaxique » sur le code. Peut-être que ça résoudra le problème. Mais quelqu'un qui analysera sémantiquement le code sera à même de mieux vous aider. Je pourrais m'y coller mais pas dans les jours qui viennent.

  7. #7
    Nouveau Candidat au Club
    Femme Profil pro
    Chargée de mission télédétection
    Inscrit en
    Janvier 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Chargée de mission télédétection

    Informations forums :
    Inscription : Janvier 2016
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Suite à votre message,je me suis documentée sur le système S4 afin de changer les signatures de rasterize.
    Toutefois, je ne suis pas sûr de mon code et R ressort plusieurs erreurs.

    Code changement signature rasterize:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    setClass( "BB", representation
    	(x="data.frame", y="Raster", field="character", fun="character",background="numeric", mask="logical", update="logical", updateValue="logical", filename="character", getCover="logical", silent="logical"
    	)
    )
    setMethod("rasterize",
    		signature(x="data.frame", y="RasterStack",field="character", fun="character",background="numeric", mask="logical", update="logical", updateValue="logical", filename="character", getCover="logical", silent="logical"
    		),
    		function(x,y,fiels, fun, background, mask, update, updateValue, filename, getCover, silent
    		)
    )
    La première erreur concerne des parenthèses:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Error: unexpected ')' in:
    "          )
    )"
    La deuxième erreur concerne toujours la signature qui n'est pas bonne - ce qui me fait dire que mon code n'est pas bon!:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Error in (function (classes, fdef, mtable)  : 
      unable to find an inherited method for function ‘rasterize’ for signature ‘"character", "RasterStack"
    Pouvez-vous m'aider à identifier la ou les erreurs dans mon code de changement de signature?

  8. #8
    Membre actif
    Homme Profil pro
    Bioinformaticien
    Inscrit en
    Octobre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Bioinformaticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 126
    Points : 296
    Points
    296
    Par défaut
    Bonjour,
    La définition de la méthode n'est pas allée au bout : la fonction manque de corps. Ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function(x,y,fiels, fun, background, mask, update, updateValue, filename, getCover, silent)
    n'est pas une définition complète d'une fonction. Par exemple, faire plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function(x,y,fiels, fun, background, mask, update, updateValue, filename, getCover, silent) {}
    afin de créer une fonction qui ne fait rien : son corps existe mais il est vide.

    Cela fait, il restera à bien définir la méthode. La fonction générique ne définit que deux arguments faisant partie de la signature. Ainsi, la méthode à créer ne doit-elle définir que deux arguments dans la signature, x et y ; le reste peut-être passé à la fonction sans être dans la signature. Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    library("raster")
    cat("\nMéthodes AVANT la définition d'une nouvelle: \n")
    showMethods("rasterize")
     
    setMethod("rasterize",
              signature = signature(
                  x = "character",
                  y = "RasterStack"
              ), definition = function(
                  x, y, fiels, fun, background, mask, update, updateValue, filename, getCover, silent) {
                  cat("\nSorties de la méthode : ", x)
              })
     
    cat("\nMéthodes APRÈS la définition d'une nouvelle: \n")
    showMethods("rasterize")
     
    # Usage
    rasterize("Écrire le corps de la méthode à ce niveau.\n", new("RasterStack"))
     
    # La signature ne recquiert que les arguments x et y.
    xxx <- getAnywhere("rasterize")
    cat("\nLes arguments faisant partie de la signature sont : ", xxx$objs$`package:raster`@signature, "\n\n")
    Loading required package: sp
    
    Méthodes AVANT la définition d'une nouvelle: 
    Function: rasterize (package raster)
    x="data.frame", y="Raster"
    x="Extent", y="Raster"
    x="matrix", y="Raster"
    x="SpatialLines", y="Raster"
    x="SpatialPoints", y="Raster"
    x="SpatialPolygons", y="Raster"
    
    
    Méthodes APRÈS la définition d'une nouvelle: 
    Function: rasterize (package raster)
    x="character", y="RasterStack"
    x="data.frame", y="Raster"
    x="Extent", y="Raster"
    x="matrix", y="Raster"
    x="SpatialLines", y="Raster"
    x="SpatialPoints", y="Raster"
    x="SpatialPolygons", y="Raster"
    
    
    Sorties de la méthode :  Écrire le corps de la méthode à ce niveau.
    
    Les arguments faisant partie de la signature sont :  x y

Discussions similaires

  1. Besoin d'aide avec la fonction height() et autre
    Par petit-scarabee dans le forum jQuery
    Réponses: 3
    Dernier message: 07/09/2012, 20h09
  2. [XL-2010] Besoin d'aide : contenu d'une cellule en fonction d'une autre
    Par Lisa91 dans le forum Excel
    Réponses: 2
    Dernier message: 08/02/2011, 16h49
  3. besoin d'aide fonction avec fichier (debutant)
    Par boby61 dans le forum Débuter
    Réponses: 9
    Dernier message: 14/03/2005, 11h22
  4. Réponses: 3
    Dernier message: 12/03/2005, 21h30
  5. Contraite NULL sur une colonne en fonction d'une autre colon
    Par speedy1496 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/04/2004, 19h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo