Il modo più veloce per convertire grandi raster in polilinee usando R o Python?


14

Ho un grande file raster (129600 per 64800 pixel) con corpi idrici globali (1 bit valori 0 e 1) e provo ad estrarre le coste oceaniche e interne.

Ho provato con ArcGIS e QGIS per convertire da raster a polilinea, ma ci vogliono anni.

Qualcuno conosce un modo migliore / più veloce (Python o R) o uno strumento migliore per questo compito?

Aggiornare

  • R: rasterToContour potrebbe essere veloce e preciso ma se hai un set di dati molto grande come il mio (8.398.080.000 pixel) hai bisogno di una quantità molto grande di RAM (più di 16 GB) o costringi R a fare più elaborazioni sul disco rigido e richiederà anche secoli.
  • Python / GDAL: gdal_poligonize crea poligoni invece di polilinee

Aggiornamento 2

  • RasterToContour: rasterToContour non fornisce i risultati desiderati. Rispetto ad ArcGIS (raster a poligono seguito da feature to line) non estrae il contorno esatto dei pixel, come mostrato negli esempi seguenti.

risultato rasterToContour risultato rasterToContour

Risultato ArcGIS Risultato ArcGIS

AGGIORNAMENTO 3

Python / GDAL: ho eseguito gdal_polygonize dalla riga di comando contro ArcGIS su un set di dati di test e i risultati sono stati estremamente chiari:

  • gdal: 49 secondi
  • ArcGIS: 1,84 secondi

Fatto ciò, vedi Aggiornamento 3.
Generic Wevers,

Potete fornire quel set di dati di prova, in modo da poter vedere se le alternative proposte sono più veloci e / o producono i risultati richiesti?
Kersten,

Per un raster così grande, saresti molto meglio usare C / C ++ con la libreria gdal.
Rodrigo,

Risposte:


8

Sto lavorando con R e usato rasterToPolygonsdal rasterpacchetto in passato, ma ora preferisco gdal_polygonizeRJohn Baumgartner. Si basa su gdal_polygonize.pyed è molto più veloce. John Baumgartner ha pubblicato il codice e ha fornito un esempio da utilizzare nel suo blog .

Se hai familiarità con Python, puoi usarlo gdal_polygonize.pydirettamente, ovviamente.


1
Ci proverò. L'ultima volta che ho usato gdal_polygonize.py ArcGIS era ancora più veloce.
Generic Wevers,

Non mi aspettavo che ArcGis potesse essere più veloce di quel gdal. @Generic Militzer
Iris

Ah aspetta, questo creerà poligoni ma ho bisogno di polilinee.
Generic Wevers,

Se inserisci i tuoi dati in un file geodatabase è piuttosto veloce. Ma non è ancora abbastanza veloce. Ecco perché sto cercando alternative.
Wevers generico il

2
Non è necessariamente un problema che tu ottenga poligoni, puoi sempre convertirli in polilinee (anche se, con così tanti, potrebbe ovviamente richiedere anche un po 'di tempo).
Martin,

7

Per i posteri, ho avuto successo con il stars::pacchetto Rper aver fatto questo tipo di operazione rapidamente.

library(raster)
library(stars)
library(sf)
library(magrittr)

f <- system.file("external/test.grd", package="raster")
r <- raster(f)
r[r[] < 750] <- 0
r[r[] >= 750] <- 1

x <- st_as_stars(r) %>% 
  st_as_sf() %>% # this is the raster to polygons part
  st_cast("MULTILINESTRING") # cast the polygons to polylines

plot(x)

inserisci qui la descrizione dell'immagine

plot(r)
plot(x, add = TRUE)

inserisci qui la descrizione dell'immagine


5

Prova rasterToContourdal pacchetto raster .

f <- system.file("external/test.grd", package="raster")
r <- raster(f)
r[r[] < 750] <- 0
r[r[] >= 750] <- 1

x <- rasterToContour(r)
class(x)
> [1] "SpatialLinesDataFrame"
> attr(,"package")
> [1] "sp"

plot(r)
plot(x, add=TRUE)

inserisci qui la descrizione dell'immagine

È quindi possibile scrivere facilmente i file in una cartella locale, ad esempio come "Shapefile ESRI" (.shp), utilizzando il codice seguente. Date un'occhiata a ogrDriversda rgdal per scoprire quali driver il sistema è compatibile con.

library(rgdal)
writeOGR(x, dsn = getwd(), layer = "coastlines", driver = "ESRI Shapefile")

Proverò a tenere le dita incrociate non ucciderà la mia RAM. Anche se ho 16 GB, che si spera sia abbastanza, R a volte non è così efficiente con file raster di grandi dimensioni. Ma vediamo.
Generic Wevers,

La conversione ha funzionato in qualche modo, ma non sono stato in grado di controllare in dettaglio. Dato che di solito sono più interessato all'elaborazione di dati raster, puoi dirmi come posso trasferire SpatialLineDataFrame in un file di forma o qualcosa di simile. Ho cercato su Google e sto ancora lottando, poiché non conosco il nome del livello (OGRwrite).
Generic Wevers,

Haha, vedo sicuramente il tuo punto. Vedi aggiornamento sopra.
fdetsch,

2
Un altro suggerimento: prova a impostare "maxpixels" rasterToContoursu un valore più alto, ad esempio 1e + 9. Finirai con maggiori dettagli allora. L'impostazione predefinita crea linee di contorno abbastanza generalizzate.
fdetsch,

1
Se non sei disposto a resamplefornire i tuoi dati a una risoluzione spaziale più grossolana, l'unica soluzione che posso immaginare sarebbe quella di dividere i dati in più riquadri (ad es. 16 sottotrapper), quindi eseguire rasterToContoursu ogni riquadro separatamente in modo iterativo e , infine, mergegli shapefile risultanti in un enorme shapefile. Nel caso siate interessati, il pacchetto del nostro gruppo di lavoro Rsenal offre una funzione chiamata splitRasterper creare più sub-raster da un enorme raster.
fdetsch,

2

Anche se sono un grande fan di GDAL, lo strumento poligonale era troppo lento per le mie applicazioni.

Un'alternativa veloce è gdal_trace_outlinedagli script Dans GDAL che ha anche più opzioni per quanto riguarda tolleranza, ciambelle, ecc.

In gdal_polygonizequesto modo produce anche poligoni con cui dovrai convertire in seguito ogr2ogr -nlt MULTILINESTRING.

Unico inconveniente è che devi compilarlo tu stesso, a meno che tu non sia su un sistema OsX Linux o Mac.


Purtroppo non è riuscito con il messaggio di errore: "Errore di segmentazione (core dumped)". Immagino che il mio file sia troppo grande o più preciso produrrà troppi piccoli poligoni.
Wevers generico
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.