Nach einer kürzlich gestellten Frage möchten Sie möglicherweise die Funktionen des rgeos- Pakets nutzen, um Ihr Problem zu lösen. Aus Gründen der Reproduzierbarkeit habe ich ein Shapefile der tansanischen Straßen von DIVA-GIS heruntergeladen und in mein aktuelles Arbeitsverzeichnis gestellt. Für die anstehenden Aufgaben benötigen Sie drei Pakete:
- rgdal für den allgemeinen Umgang mit Geodaten
- Raster zur Rasterung der Shapefile-Daten
- rgeos , um die Kreuzung von Straßen mit einer Rastervorlage zu überprüfen und die Straßenlängen zu berechnen
Folglich sollten Ihre ersten Zeilen von could so aussehen:
library(rgdal)
library(raster)
library(rgeos)
Danach müssen Sie die Shapefile-Daten importieren. Beachten Sie, dass DIVA-GIS-Shapefiles in EPSG: 4326 verteilt sind. Daher projiziere ich das Shapefile in EPSG: 21037 (UTM 37S), um Meter statt Grad zu verarbeiten.
roads <- readOGR(dsn = ".", layer = "TZA_roads")
roads_utm <- spTransform(roads, CRS("+init=epsg:21037"))
Für die anschließende Rasterung benötigen Sie eine Rastervorlage, die die räumliche Ausdehnung Ihres Shapefiles abdeckt. Die Rastervorlage besteht standardmäßig aus 10 Zeilen und 10 Spalten, wodurch zu lange Rechenzeiten vermieden werden.
roads_utm_rst <- raster(extent(roads_utm), crs = projection(roads_utm))
Nachdem Sie die Vorlage eingerichtet haben, durchlaufen Sie alle Zellen des Rasters (das derzeit nur aus NA-Werten besteht). Durch Zuweisen eines Werts von '1' zu der aktuellen Zelle und anschließende Ausführung rasterToPolygons
wird im resultierenden Shapefile 'tmp_shp' automatisch die Ausdehnung des aktuell verarbeiteten Pixels gespeichert. gIntersects
Erkennt, ob sich diese Ausdehnung mit Straßen überschneidet. Wenn nicht, gibt die Funktion den Wert '0' zurück. Andernfalls wird das Straßen-Shapefile von der aktuellen Zelle abgeschnitten und die Gesamtlänge von "SpatialLines" in dieser Zelle wird mit berechnet gLength
.
lengths <- sapply(1:ncell(roads_utm_rst), function(i) {
tmp_rst <- roads_utm_rst
tmp_rst[i] <- 1
tmp_shp <- rasterToPolygons(tmp_rst)
if (gIntersects(roads_utm, tmp_shp)) {
roads_utm_crp <- crop(roads_utm, tmp_shp)
roads_utm_crp_length <- gLength(roads_utm_crp)
return(roads_utm_crp_length)
} else {
return(0)
}
})
Zuletzt können Sie die berechneten Längen (die in Kilometer umgerechnet werden) in die Rastervorlage einfügen und Ihre Ergebnisse visuell überprüfen.
roads_utm_rst[] <- lengths / 1000
library(RColorBrewer)
spplot(roads_utm_rst, scales = list(draw = TRUE), xlab = "x", ylab = "y",
col.regions = colorRampPalette(brewer.pal(9, "YlOrRd")),
sp.layout = list("sp.lines", roads_utm),
par.settings = list(fontsize = list(text = 15)), at = seq(0, 1800, 200))
vignette('over', package = 'sp')
könnte helfen.