Vorrei identificare le caratteristiche lineari, come strade e fiumi, su mappe raster e convertirle in un oggetto territoriale lineare (classe) utilizzando RIdentificare una caratteristica lineare su una mappa raster e restituire un oggetto forma lineare utilizzando R
I pacchetti raster
e sp
possono essere utilizzati per convertire le funzioni dai raster agli oggetti vettoriali poligono (classe SpatialPolygons
). rasterToPolygons()
estrarrà celle di un certo valore da un raster e restituirà un oggetto poligono. Il prodotto può essere semplificato utilizzando l'opzione dissolve=TRUE
, che chiama le routine nel pacchetto rgeos
per farlo.
Questo funziona tutto bene, ma preferirei che fosse un oggetto . Come posso fare questo?
Considerate questo esempio:
## Produce a sinuous linear feature on a raster as an example
library(raster)
r <- raster(nrow=400, ncol=400, xmn=0, ymn=0, xmx=400, ymx=400)
r[] <- NA
x <-seq(1, 100, by=0.01)
r[cellFromRowCol(r, round((sin(0.2*x) + cos(0.06*x)+2)*100), round(x*4))] <- 1
## Quick trick to make it three cells wide
r[edge(r, type="outer")] <- 1
## Plot
plot(r, legend=FALSE, axes=FALSE)
## Convert linear feature to a SpatialPolygons object
library(rgeos)
rPoly <- rasterToPolygons(r, fun=function(x) x==1, dissolve=TRUE)
plot(rPoly)
Sarebbe il miglior approccio essere quello di trovare una linea mediana del poligono?
Oppure esiste un codice esistente per farlo?
EDIT: Grazie a @mdsumner per aver sottolineato che questo è chiamato scheletrizzazione.
Bel lavoro! L'ho eseguito su un sistema di coordinate con una risoluzione molto più grezza e ho dovuto aumentare il parametro wb per farlo funzionare. Ma quando l'ho fatto, ha funzionato magnificamente. Come si nota, l'aumento manuale di wb funziona bene per gestire gli artefatti nei caratteri finali di linea. – digitalmaps
Coppia di suggerimenti: modifica per aggiungere: 'else {xy = xyP}' sotto il blocco 'if (! Missing (denso))', altrimenti fallisce quando non è dato denso. Modifica anche per rimuovere 'if (! Missing (wb)) {' e obbligarlo a eseguire 'gBuffer()'. Se non è stato specificato 'wb', non è stato possibile eseguire il buffering e trovare il limite e non la linea centrale. Bello quello che si toglieva _prima del weekend. – digitalmaps
Alcune modifiche nell'ultima modifica, inclusa la sostituzione del buffering con il rilevamento della distanza. – Spacedman