Extraire le raster du raster à l'aide du fichier de formes Polygon dans R

13

Je suis nouveau sur R et j'utilise le package raster. J'ai un problème pour extraire les polygones d'un fichier raster existant. Si j'utilise

extract(raster, poly_shape)

fonction sur le raster, il crée toujours une liste avec les données. Ce que je veux vraiment, c'est extraire un autre fichier raster que je peux charger à nouveau avec ArcGIS. Après avoir lu un peu plus, je pense que la fonction de recadrage est ce dont j'ai vraiment besoin. Mais quand j'essaie d'utiliser cette fonction

crop(raster, poly_shape)

Je reçois cette erreur:

Error in .local(x, y, ...) : extents do not overlap
In addition: Warning message:
In intersect(extent(x), extent(y)) : Objects do not overlap

Les fichiers raster et poly_shape sont les mêmes pour les deux fonctions. Pouvez-vous me dire ce qui pourrait mal se passer ici? Est-il même exact que la fonction de recadrage crée un autre raster et non une liste?

EDIT : La fonction extend () ne fonctionne pas pour moi. Je reçois toujours la même erreur. Mais je suis sûr que les 2 jeux de données se chevauchent! Avec le

extract(raster, poly_shape)

J'en tire les bonnes données. Juste comme une liste et non comme un raster comme je veux l'avoir. Je viens de charger les jeux de données dans ArcGIS auparavant et ils s'adaptent très bien, donc je n'ai pas vérifié la projection. Maintenant j'ai essayé

projection(raster) # "+proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +units=m +no_defs"
projection(poly_shape) # "+proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs"

et vous pouvez voir que les projections ne correspondent pas. La fonction d'extraction semble être capable de transformer automatiquement les fichiers de la bonne manière. Je le sais parce que j'ai fait ce qui suit:

  • J'ai découpé la partie exacte du polygone que j'ai extrait dans R également dans ArcGIS
  • J'ai calculé la somme de toutes les valeurs du polygone R extrait (liste)
  • J'ai calculé la somme de toutes les cellules raster que j'ai découpées dans ArcGIS

Les 2 ont exactement le même résultat, donc je suppose que la conclusion devrait être que la fonction d'extraction a fonctionné correctement. Maintenant, j'ai deux options:

  1. J'ai besoin d'un moyen d'extraire à nouveau un raster de la liste extraite ou
  2. Les 2 jeux de données (raster + poly_shape) doivent utiliser la même projection et la fonction de recadrage devrait fonctionner

Que suggéreriez-vous de faire ici?

Lars
la source
Et si c'est un raster rgbi 4 bandes? Les bandes sont perdues jusqu'à présent ...
Doris
Bienvenue dans GIS SE! En tant que nouvel utilisateur, assurez-vous de faire le petit tour . Pensez ensuite à modifier votre réponse pour fournir des informations et des références supplémentaires. Voir Comment écrire une bonne réponse? pour plus d'informations.
Andy
Si vous avez une nouvelle question, veuillez la poser en cliquant sur le bouton Poser une question . Incluez un lien vers cette question si cela permet de fournir un contexte. - De l'avis
Erik

Réponses:

19

La fonction d'extraction se comporte exactement comme elle le devrait. Vous pouvez forcer la fonction de recadrage à utiliser l'étendue du polygone, puis masquer l'objet pour renvoyer le raster exact représentant la zone du polygone. Si vous continuez à recevoir l'erreur, cela signifie que vos données, en fait, ne se chevauchent pas.

N'oubliez pas que R n'effectue pas de projection "à la volée", vérifiez donc vos projections. Vous pouvez vérifier si vos extensions se chevauchent en utilisant la fonction "extend ()".

Voici un exemple de recadrage en utilisant l'étendue du polygone, puis en masquant le raster résultant en utilisant le polygone "tramé".

# Add required packages
require(raster)
require(rgeos)
require(sp)

# Create some data using meuse 
data(meuse)
  coordinates(meuse) <- ~x+y
    proj4string(meuse) <- CRS("+init=epsg:28992")
data(meuse.grid)
  coordinates(meuse.grid) = ~x+y
    proj4string(meuse.grid) <- CRS("+init=epsg:28992")
      gridded(meuse.grid) = TRUE    
        r <- raster(meuse.grid) 
          r[] <- runif(ncell(r))

# Create a polygon
f <- gBuffer(meuse[10,], byid=FALSE, id=NULL, width=250, 
                         joinStyle="ROUND", quadsegs=10)   

# Plot full raster and polygon                       
plot(r)
  plot(f,add=T)

# Crop using extent, rasterize polygon and finally, create poly-raster
#          **** This is the code that you are after ****  
cr <- crop(r, extent(f), snap="out")                    
  fr <- rasterize(f, cr)   
    lr <- mask(x=cr, mask=fr)

# Plot results
plot(lr)
  plot(f,add=T)
Jeffrey Evans
la source
4
extract () n'effectuer sur le reprojection à la mouche, mais la culture () ne fonctionne pas. Cela pourrait expliquer une certaine confusion
mdsumner
@Jefferey crop () et mask () écrêtent uniquement le raster en fonction de l'étendue rectangulaire du polygone, il ne l'écrase pas de l'intérieur de la limite du polygone. Avez-vous une idée des commandes qui pourraient découper le raster dans la limite du polygone donné?
csheth
1
@Chintan Sheth, pour que le masque soit sous-ensemble dans le polygone, vous devez avoir un raster représentant les valeurs dans le polygone. C'est pourquoi vous pixellisez le polygone de sous-ensemble, puis vous y masquez. L'étape de recadrage consiste à réduire l'étendue du raster au même niveau que le polygone de sous-ensemble, qui dans le passé, s'il était ignoré, générait une erreur de non-concordance d'étendue.
Jeffrey Evans
spTransformà partir du sppackage (qui est parfois automatiquement chargé avec d'autres packages spatiaux R) permet une reprojection afin que les deux fichiers soient dans la même projection, par exemple. good_poly=spTransform(spolygon, CRSobj=crs(raster_file))
user3386170
@ user3386170, Hein? Je ne sais pas à quoi tu veux en venir. Cette question est survenue à un moment où le package raster venait d'ajouter "à la volée" dans certaines de ses fonctions. Ces fonctions avaient précédemment généré une erreur lorsque les projections ne correspondaient pas, mais ce message date de 2014. Vous devez également être conscient de toujours charger rgdal lors de l'utilisation de sp :: spTransform () car, il ajoute des fonctionnalités supplémentaires importantes en coulisses.
Jeffrey Evans
8

Ce que j'ai recherché, c'est la mask()fonction.

mask(raster, poly_shape)

fonctionne sans erreur et renvoie ce que j'ai recherché.

Lars
la source
2
Reprojetez vos données pour qu'elles se trouvent dans le même espace de projection. Même dans ArcGIS, où la projection à la volée est automatique, il est très mauvais de procéder à l'analyse dans différentes projections. Avec des données dans différentes projections, vos données ne partageront pas l'étendue commune, ce qui est l'erreur que vous recevez.
Jeffrey Evans
Utilisez projectExtent () pour obtenir uniquement l'étendue du recadrage du raster.
mdsumner
Pour s'adapter au format Q&A du site, cela devrait être placé dans le corps principal de la question en tant que modification / mise à jour (puis ajouter un commentaire à la réponse qui se trouve dans la "réponse" afin qu'ils sachent qu'il y a plus à regarder).
matt wilkie
@mattwilkie Désolé de ne pas avoir adapté le format mais mon texte était trop long pour le poster ici en commentaire. @JeffreyEvans J'ai essayé ce qui suit: projection(raster) = projection(poly_shape)et dans l'autre sens , projection(poly_shape) = projection(raster)mais les deux sens produire la même erreur: Error in .local(x, y, ...) : extents do not overlap In addition: Warning message: In intersect(extent(x), extent(y)) : Objects do not overlap. Existe-t-il un moyen de voir quelle projection est utilisée à la volée en utilisant la fonction extract () (car celle-ci fonctionne évidemment)?
Lars
1
Ce que j'ai recherché, c'est la fonction mask (). mask(raster, poly_shape)fonctionne sans erreur et renvoie ce que j'ai recherché.
Lars
-1

L'étendue fonctionne très bien ... Je pense que les Xmin, Xmax, Ymin et Ymax de votre étendue sont différents des X et Y de votre raster - c'est-à-dire qu'ils sont opposés

ToNoY
la source