A seguito di una domanda recente , potresti voler utilizzare le funzionalità offerte dal pacchetto rgeos per risolvere il tuo problema. Per motivi di riproducibilità, ho scaricato un file di forma delle strade della Tanzania da DIVA-GIS e l'ho inserito nella mia directory di lavoro corrente. Per le attività imminenti, avrai bisogno di tre pacchetti:
- rgdal per la gestione generale dei dati spaziali
- raster per la rasterizzazione dei dati dello shapefile
- rgeos per controllare l'intersezione delle strade con il modello raster e calcolare le lunghezze delle strade
Di conseguenza, le tue prime righe potrebbero apparire così:
library(rgdal)
library(raster)
library(rgeos)
Successivamente, è necessario importare i dati dello shapefile. Si noti che gli shapefile DIVA-GIS sono distribuiti in EPSG: 4326, quindi proietterò lo shapefile su EPSG: 21037 (UTM 37S) per gestire i contatori anziché i gradi.
roads <- readOGR(dsn = ".", layer = "TZA_roads")
roads_utm <- spTransform(roads, CRS("+init=epsg:21037"))
Per la successiva rasterizzazione, sarà necessario un modello raster che copra l'estensione spaziale del file di forma. Il modello raster è composto da 10 righe e 10 colonne per impostazione predefinita, evitando così tempi di calcolo troppo lunghi.
roads_utm_rst <- raster(extent(roads_utm), crs = projection(roads_utm))
Ora che il modello è impostato, passa in rassegna tutte le celle del raster (che attualmente consiste solo di valori NA). Assegnando un valore di '1' alla cella corrente e successivamente eseguendo rasterToPolygons
, il file di forma risultante 'tmp_shp' mantiene automaticamente l'estensione del pixel attualmente elaborato. gIntersects
rileva se questa estensione si sovrappone alle strade. In caso contrario, la funzione restituirà un valore di '0'. In caso contrario, il file di forma della strada viene ritagliato dalla cella corrente e la lunghezza totale di "SpatialLines" all'interno di quella cella viene calcolata utilizzando 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)
}
})
Infine, puoi inserire le lunghezze calcolate (che vengono convertite in chilometri) nel modello raster e verificare visivamente i risultati.
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')
potrebbe aiutare.