Estrai il raster dal raster usando il file di forma poligonale in R


13

Sono nuovo di R e utilizzo il pacchetto raster. Ho un problema nell'estrarre i poligoni da un file raster esistente. Se io uso

extract(raster, poly_shape)

funzione sul raster crea sempre un elenco con i dati. Quello che voglio veramente è estrarre un altro file raster che posso caricare di nuovo con ArcGIS. Dopo aver letto un po 'di più, penso che la funzione di ritaglio sia ciò di cui ho veramente bisogno. Ma quando provo ad usare questa funzione

crop(raster, poly_shape)

Ottengo questo errore:

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

I file raster e poly_shape sono gli stessi per entrambe le funzioni. Puoi dirmi cosa potrebbe esserci di sbagliato qui? È giusto che la funzione di ritaglio crei un altro raster e non un elenco?

EDIT : la funzione di estensione () non funziona per me. Ottengo ancora lo stesso errore. Ma sono sicuro che i 2 set di dati si sovrappongono! Con il

extract(raster, poly_shape)

Ne ricavo i dati giusti. Proprio come un elenco e non come un raster come voglio averlo. Ho appena caricato i set di dati in ArcGIS prima e si adattano molto bene, quindi non ho verificato la proiezione. Adesso ci ho provato

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"

e puoi vedere che le proiezioni non si adattano. La funzione di estrazione sembra essere in grado di trasformare automaticamente i file nel modo giusto. Lo so perché ho fatto quanto segue:

  • Ho ritagliato la parte esatta del poligono che ho estratto in R anche in ArcGIS
  • Ho calcolato la somma di tutti i valori del poligono R estratto (elenco)
  • Ho calcolato la somma di tutte le celle raster che ho ritagliato in ArcGIS

I 2 hanno lo stesso identico risultato, quindi immagino che la conclusione dovrebbe essere che la funzione di estrazione ha funzionato correttamente. Ora ho 2 opzioni immagino:

  1. Ho bisogno di un modo per far uscire di nuovo un raster dall'elenco estratto o
  2. I 2 set di dati (raster + poly_shape) devono utilizzare la stessa previsione e la funzione di ritaglio dovrebbe funzionare

Cosa consiglieresti di fare qui?


E se fosse un rgbi raster a 4 bande? Le bande si sono perse finora ...
Doris

Benvenuti in GIS SE! Come nuovo utente, assicurati di fare un breve tour . Quindi prendere in considerazione la modifica della risposta per fornire ulteriori informazioni e riferimenti. Vedi Come posso scrivere una buona risposta? per maggiori informazioni.
Andy,

Se hai una nuova domanda, chiedila facendo clic sul pulsante Poni domanda . Includere un collegamento a questa domanda se aiuta a fornire un contesto. - Dalla recensione
Erik,

Risposte:


19

La funzione di estrazione si comporta esattamente come dovrebbe. È possibile forzare la funzione di ritaglio per utilizzare l'estensione del poligono e quindi mascherare l'oggetto per restituire l'esatto raster che rappresenta l'area del poligono. Se continui a ricevere l'errore significa che i tuoi dati, infatti, non si sovrappongono.

Tieni presente che R non esegue la proiezione "al volo", quindi controlla le tue proiezioni. Puoi verificare se le tue estensioni si sovrappongono usando la funzione "extension ()".

Ecco un esempio di ritaglio usando l'estensione del poligono e quindi mascherando il raster risultante usando il poligono "rasterizzato".

# 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)

4
estratto () non eseguire sul riproiezione fly, ma raccolto () non lo fa. Ciò potrebbe spiegare un po 'di confusione
mdsumner

@Jefferey crop () e mask () ritagliano il raster solo in base alle estensioni rettangolari del poligono, ma non lo ritagliano all'interno del confine del poligono. Qualche idea di quali comandi potrebbero tagliare il raster entro il limite del poligono specificato?
csheth,

1
@Chintan Sheth, per la maschera da sottoinsieme all'interno del poligono è necessario disporre di un raster che rappresenti i valori all'interno del poligono. Ecco perché rasterizzi il poligono del sottoinsieme e poi ti maschera. La fase di ritaglio consiste nel ridurre l'estensione del raster allo stesso del poligono del sottoinsieme, che in passato, se ignorato, genererebbe un errore di mancata corrispondenza dell'estensione.
Jeffrey Evans,

spTransformdal sppacchetto (che a volte viene caricato automaticamente con altri pacchetti R spaziali) consente la riproiezione in modo che entrambi i file siano nella stessa proiezione, ad es. good_poly=spTransform(spolygon, CRSobj=crs(raster_file))
user3386170

@ user3386170, eh? Non sono sicuro di cosa stai arrivando. Questa domanda si è verificata in un momento in cui il pacchetto raster ha appena aggiunto "al volo" all'interno di alcune se le sue funzioni. Queste funzioni avevano precedentemente generato un errore quando le proiezioni non corrispondevano, ma questo post era del 2014. Dovresti anche essere consapevole di caricare sempre rgdal quando usi sp :: spTransform () in quanto aggiunge funzionalità aggiuntive, importanti, dietro le quinte.
Jeffrey Evans,

8

Quello che ho effettivamente cercato è stata la mask()funzione.

mask(raster, poly_shape)

funziona senza errori e restituisce ciò che ho cercato.


2
Riproiettare i dati in modo che siano nello stesso spazio di proiezione. Anche in ArcGIS, dove la proiezione al volo è automatica, è una cattiva pratica condurre analisi in diverse proiezioni. Con i dati in diverse proiezioni i tuoi dati non condivideranno le estensioni comuni, che è l'errore che stai ricevendo.
Jeffrey Evans,

Usa projectExtent () per ottenere solo l'estensione per ritagliare il raster.
mdsumner,

Per adattarsi al formato di domande e risposte del sito, questo dovrebbe essere inserito nel corpo principale della domanda come modifica / aggiornamento (e quindi aggiungere un commento alla risposta a cui è in "risposta" in modo che sappiano che c'è altro da guardare).
matt wilkie

@mattwilkie Ci scusiamo per non aver adattato il formato ma il mio testo era troppo lungo per pubblicarlo come commento qui. @JeffreyEvans Ho provato la seguente: projection(raster) = projection(poly_shape)e viceversa projection(poly_shape) = projection(raster), ma in entrambi i sensi produrre lo stesso errore: Error in .local(x, y, ...) : extents do not overlap In addition: Warning message: In intersect(extent(x), extent(y)) : Objects do not overlap. C'è un modo in cui posso vedere quale proiezione viene utilizzata al volo usando la funzione extract () (perché quella ovviamente funziona)?
Lars,

1
Quello che ho effettivamente cercato è stata la funzione mask (). mask(raster, poly_shape)funziona senza errori e restituisce ciò che ho cercato.
Lars,

-1

L'estensione funziona bene ... Penso che la tua estensione Xmin, Xmax, Ymin e Ymax siano diverse dalle X e Y del tuo raster - cioè sono poste di fronte

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.