Suite

Algorithme pour le calcul de la texture du sol


J'ai des valeurs en pourcentage de sable/limon/argile pour 30 points d'échantillonnage sur la grille. J'ai utilisé ces valeurs pour créer 3 rasters IDW interpolés. Je veux en quelque sorte (je pense dans la calculatrice raster) créer un code en utilisant des instructions if/then pour prendre les valeurs de chaque IDW et produire une texture.

Exemple : si valeur raster "sand_IDW" > 50 et < 70 et valeur raster "clay_IDW" > 20 et <40 alors, "Texture" = Argile sableuse.


Grass 7 a un module complémentaire appelé r.soils.texture qui calcule la texture du sol à partir d'une couche d'argile et de sable.

Cependant, cela ne fonctionnait pas (encore) sur mon ordinateur.


Je ne sais pas pourquoi ça a été bousculé, mais ça m'a fait réfléchir, alors.

Si vous allez classer dans Arc, vous avez probablement besoin (au minimum) d'une table de recherche avec des colonnes clay|silt|sand|texture. Chaque ligne devrait contenir toutes les combinaisons possibles de trois entiers positifs qui s'ajoutent à 100 %, puis une classe pour ce combo, définie en référence à un triangle de texture existant. Ensuite, vous devrez arrondir tous vos rasters à un nombre entier avant d'utiliser la table de recherche dans la calculatrice raster. Une précision plus élevée nécessiterait une table beaucoup plus longue, pas que vous auriez la peine de dépasser 2 décimales. C'est toujours une approche limitée et brutale.

J'ai un workflow pour une carte de texture rapide à l'aide de R sur mon blog, si vous êtes heureux de vous éloigner d'ArcGIS. Il repose sur un package qui a été écrit exactement dans ce but, dont les fondements sont bien plus sophistiqués qu'une table de recherche (accessoires fous de l'auteur, Julien Moeys).

Vos rasters d'entrée devront être correctement projetés et dans un format que GDAL peut gérer.

Version courte:

library(sp) library(rgdal) library(raster) library(soltexture) clay_src <- 'path/to/clay/raster' silt_src <- 'path/to/silt/raster' sand_src <- 'path/to/sand/ raster' input <- c(clay_src, silt_src, sand_src) # lire dans les rasters, empiler et promouvoir en SpatialPixelsDataFrame SSC <- stack() for (i in 1:length(inputs)) { rn <- input[i] r < - raster(rn) SSC <- addLayer(SSC, r) } SSCP <- as(SSC, 'SpatialPixelsDataFrame')

Le SpatialPixelsDataFrame est cool car il vous permet de suspendre une liste d'attributs à chaque pixel et de traiter ces listes comme un tableau. Tout reste organisé et en séquence pendant que vous effectuez votre traitement. L'inconvénient est que tout se trouve en mémoire, il y a donc des limitations de taille.

# faire un peu de rangement sur les noms ([email protected]) <- c('CLAY', 'SILT', 'SAND') [email protected] <- round([email protected], 2) [email protected]$raw_totals <- rowSums(SSCP @data[, 1:3]) # cela normalise les trois ensembles de données afin qu'ils restent proportionnels mais s'ajoutent à 100 % : SSCP_norm <- TT.normalise.sum(tri.data = [email protected], résidus = T)

vérifiez certainement les résidus. Si vous trouvez qu'une trop grande partie de votre jeu de données est en dehors de 95-105%, vous avez un problème avec vos rasters krigeants - plus la variation est grande, plus c'est un problème. S'ils ont l'air ok :

# ajouter les données normalisées à l'ensemble d'origine - il est recommandé de conserver les deux colnames(SSCP_norm)[1:3] <- paste0(colnames(SSCP_norm)[1:3], "_n") [email protected] <- cbind( [email protected], round(SSCP_norm, 2)) rm(SSCP_norm) # ce qui suit produit une nouvelle colonne avec la classification pour chaque pixel (à peu près !) # vérifiez la vignette de la texture du sol pour choisir un triangle de texture adapté à votre région # et ensemble de données (les limites de taille de classe comptent !), il y a un tas de [email protected] prédéfinis <- cbind([email protected], "TEXCLASS" = TT.points.in.classes(tri.data = [email protected][, c(' CLAY_n', 'SILT_n', 'SAND_n')], css.names = c('CLAY_n', 'SILT_n', 'SAND_n'), class.sys = "AU2.TT", PiC.type = "t", effondrement = ', ') )

la sortie peut nécessiter un peu de rangement pour gérer les données qui tombent juste au bord de la classe de texture > 1, mais après cela, il est assez facile de convertir en numérique et d'exporter un raster classé final.


S'il vous plaît, essayez r.soils.texture dans l'herbe. dans GRASS 7.0, vous pouvez installer r.soils.texture avec cette ligne de commande : g.extension extension=r.soils.texture operation=add

vous pouvez exécuter l'addon r.soils.texture pour obtenir le fichier raster de texture avec cette ligne de commande : r.soils.texture sand=name clay=name schema=name output=name

Vous pouvez récupérer des exemples de données ou de fichiers de texture de schéma sur ce site : http://maplab.alwaysdata.net/soilstools.html

S'il y a des problèmes, demandez-moi de l'aide.