2016-01-24 5 views
5

Gibt es eine Möglichkeit, die Straßendichte (km/km²) innerhalb eines Puffers um räumliche Linien zu berechnen? Die Straßen werden durch Pixel (1 Pixel = 625 m²) in einem Raster dargestellt. Also habe ich begonnen, die Straßenpixel mit Hilfe der Funktion rasterToContour(package raster) in Polylinien umzuwandeln. Dann denke ich über die Berechnung der Gesamtlänge der Linien innerhalb des Puffers (in km) und des Pufferbereichs (in km²) nach.Berechnen Liniendichte innerhalb eines Puffers aus einem Raster

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

Hier ist ein reproduzierbares Beispiel:

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

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

Antwort

5

Sie suchen nach Straßenlänge (Kilometer) geteilt durch Pufferfläche (Quadratkilometer), richtig? Um die Straßenlänge zu berechnen, können Sie Ihre Methode mit rasterToContour() verwenden, obwohl das mit dem von Ihnen bereitgestellten Beispiel nicht reproduzierbar ist.

Aber um die Fläche des Puffers in Quadratkilometern zu berechnen, können Sie: n <- length(extract(r, line2_buff)) die n Anzahl der Pixel im Puffer, die jeweils 625 m^2 sind. Der Umrechnungsfaktor, den Sie benötigen, ist 1 km^2 = 1.000.000 m^2. Insgesamt Bereich des Puffers in km^2 gegeben durch:

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

Vielen Dank rsoren. Insbesondere habe ich ein Problem, die Straßenlänge (Kilometer) zu berechnen, da die Funktion "rasterToContour()" Straßenkanten mit Kanten auf der linken Seite und der rechten Seite der Straße gibt. Ich würde es vorziehen, eine Linie zu haben, die durch eine Straße verläuft (d.h. durch die Mitte von Straßenpixeln verläuft). – Marine

+0

Können Sie nicht einfach durch 2 teilen, um die Länge einer Kante zu berechnen? – rsoren

+0

Wie unterscheiden Sie eine Straße innerhalb des Puffers von einer Straße am Rand des Puffers? in einem Fall musst du es durch 2 teilen, in dem anderen kannst du nicht. –

4

Die Funktion, die Sie schauen, um die Kreuzung zwischen einer Linie zu bekommen und ein Polygon ist gIntersection (siehe diesen Link http://robinlovelace.net/r/2014/07/29/clipping-with-r.html). Wenn Sie jedoch die Grenze einer Straße addieren, die einen Puffer überquert, zählen Sie die doppelte Länge der Straße (linke Seite + rechte Seite der Straße).

Das Problem besteht darin, dass das Konvertieren eines Rasters in eine Straßenkarte (Linien) nicht so einfach ist wie das Konvertieren in ein Polygon (was Sie mit RasterToContour erhalten). Und wenn Sie in ein Polygon konvertieren, erhalten Sie nicht das gewünschte Ergebnis (wie zuvor erklärt). Sie müssen das also manuell tun oder etwas mehr Zeit in die Programmierung investieren (suchen Sie nach "skelettierendes Raster", zum Beispiel Identify a linear feature on a raster map and return a linear shape object using R).

Ich denke, der übliche Ansatz ist, auf einer Flächenbasis (km2/km2) zu arbeiten, und Sie können es ziemlich leicht im Rasterformat tun. Wenn Ihre Auflösung gut genug ist, können Sie später (Straßenbreite)/(Durchschnittsbreite einer Straße)/(Pufferbereich) versuchen, den Wert auf km/km2 anzunähern.

Verwandte Themen