Después de una pregunta reciente , es posible que desee utilizar las funcionalidades que ofrece el paquete rgeos para resolver su problema. Por razones de reproducibilidad, descargué un archivo shape de carreteras de Tanzania desde DIVA-GIS y lo puse en mi directorio de trabajo actual. Para las próximas tareas, necesitará tres paquetes:
- rgdal para manejo de datos espaciales generales
- ráster para rasterizar los datos del archivo de forma
- rgeos para verificar la intersección de carreteras con plantilla ráster y calcular longitudes de carretera
En consecuencia, sus primeras líneas de podría debería verse así:
library(rgdal)
library(raster)
library(rgeos)
Después de eso, debe importar los datos del archivo de forma. Tenga en cuenta que los archivos de forma DIVA-GIS se distribuyen en EPSG: 4326, por lo que proyectaré el archivo de forma a EPSG: 21037 (UTM 37S) para tratar metros en lugar de grados.
roads <- readOGR(dsn = ".", layer = "TZA_roads")
roads_utm <- spTransform(roads, CRS("+init=epsg:21037"))
Para la posterior rasterización, necesitará una plantilla de trama que cubra la extensión espacial de su shapefile. La plantilla ráster consta de 10 filas y 10 columnas de forma predeterminada, lo que evita tiempos de cálculo demasiado extensos.
roads_utm_rst <- raster(extent(roads_utm), crs = projection(roads_utm))
Ahora que la plantilla está configurada, recorra todas las celdas del ráster (que actualmente consta solo de valores de NA). Al asignar un valor de '1' a la celda actual y luego ejecutarlo rasterToPolygons
, el archivo de forma resultante 'tmp_shp' mantiene automáticamente la extensión del píxel procesado actualmente. gIntersects
detecta si esta extensión se superpone con las carreteras. Si no, la función devolverá un valor de '0'. De lo contrario, la celda actual recorta el archivo de forma de la carretera y se calcula usando la longitud total de 'SpatialLines' dentro de esa celda 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)
}
})
Finalmente, puede insertar las longitudes calculadas (que se convierten en kilómetros) en la plantilla ráster y verificar visualmente sus resultados.
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')
pueda ayudar.