2016-01-24 15 views
5

Esiste un modo per calcolare la densità della strada (km/km²) all'interno di un buffer attorno alle linee spaziali? Le strade sono rappresentate da pixel (1 pixel = 625 m²) in un raster. Così ho iniziato a convertire i pixel stradali in polilinee usando la funzione rasterToContour(package raster). Quindi, sto pensando di calcolare la lunghezza totale delle linee all'interno del buffer (in km) e l'area del buffer (in km²).Calcola la densità di linea all'interno di un buffer da un raster

r <- raster(rast_path) 
x <- rasterToContour(r) 

Ecco un esempio riproducibile:

## To create raster: 
library(raster) 
library(rgeos) 
r <- raster(ncols=90, nrows=50) 
values(r) <- sample(1:10, ncell(r), replace=TRUE) 

## Road raster 
r[r[] < 10] <- 0 
r[r[] >= 10] <- 1 
plot(r) 

## To create spatial lines 
line1 <- rbind(c(-125,0), c(0,60)) 
line2 <- rbind(c(0,60), c(40,5)) 
line3 <- rbind(c(40,5), c(15,-45)) 
line1_sp <- spLines(line1) 
line2_sp <- spLines(line2) 
line3_sp <- spLines(line3) 

## To create buffer around lines 
line2_buff <- gBuffer(line2_sp, width=20) 
plot(line2_sp,add=T) 
plot(line2_buff,add=T) 
+4

domanda Duplicate: http://gis.stackexchange.com/questions/177869/calculate-line-density-within-a-buffer- in -r – RobertH

risposta

5

Stai cercando la lunghezza della strada (chilometri) divisa per area cuscinetto (chilometri quadrati), giusto? Per calcolare la lunghezza della strada, è possibile utilizzare il metodo con rasterToContour(), sebbene ciò non sia riproducibile con l'esempio fornito.

Ma per calcolare l'area del buffer in chilometri quadrati, è possibile effettuare: n <- length(extract(r, line2_buff)) per ottenere il numero di pixel n nel buffer, che sono 625 m^2 ciascuno. Il fattore di conversione di cui hai bisogno è 1 km^2 = 1.000.000 m^2. Tutti insieme, area del buffer in km^2 è data da:

length(extract(r, line2_buff)) * 625/1000000 
+0

Grazie mille rsoren. In particolare, ho un problema nel calcolare la lunghezza della strada (chilometri) perché la funzione 'rasterToContour()' dà bordi della strada con bordi sul lato sinistro e sul lato destro della strada. Preferirei avere una linea che passa attraverso una strada (cioè, passando attraverso il centro dei pixel della strada). – Marine

+0

Non potresti semplicemente dividere per 2, per calcolare la lunghezza di un bordo? – rsoren

+0

come distinguere una strada all'interno del buffer da una strada nel bordo del buffer? in un caso devi dividerlo per 2, nell'altro, non puoi. –

4

La funzione che si sta cercando di ottenere l'intersezione tra una linea e un poligono è gIntersection (si veda questo link http://robinlovelace.net/r/2014/07/29/clipping-with-r.html). Tuttavia, se sommi il confine di una strada che attraversa un buffer, conterai il doppio della lunghezza della strada (lato sinistro + lato destro della strada).

Il problema è che la conversione di un raster in una mappa stradale (linee) non è così semplice come convertirla in un poligono (cosa si otterrà con rasterToContour). E la conversione in un poligono non ti darà il risultato che stai cercando (come spiegato in precedenza). Quindi, dovrai farlo manualmente o impiegare un po 'di tempo in più nella codifica (cerca "scheletro raster", ad esempio Identify a linear feature on a raster map and return a linear shape object using R).

Penso che l'approccio abituale sia lavorare su base area (km2/km2) e si può fare abbastanza facilmente in formato raster. Se la tua risoluzione è abbastanza buona, puoi farlo più tardi (Area delle strade)/(larghezza media di una strada)/(area buffer) per provare ad approssimare il valore a km/km2.

Problemi correlati