Após uma pergunta recente , convém usar as funcionalidades oferecidas pelo pacote rgeos para resolver seu problema. Por motivos de reprodutibilidade, baixei um arquivo de forma das estradas da Tanzânia do DIVA-GIS e o coloquei no meu diretório de trabalho atual. Para as próximas tarefas, você precisará de três pacotes:
- rgdal para manipulação geral de dados espaciais
- rasterização para rasterização dos dados do shapefile
- rgeos para verificar a interseção de estradas com modelo raster e calcular comprimentos de estrada
Conseqüentemente, suas primeiras linhas de could devem ficar assim:
library(rgdal)
library(raster)
library(rgeos)
Depois disso, você precisa importar os dados do shapefile. Observe que os shapefiles do DIVA-GIS são distribuídos no EPSG: 4326, então projetarei o shapefile no EPSG: 21037 (UTM 37S) para lidar com medidores e não com graus.
roads <- readOGR(dsn = ".", layer = "TZA_roads")
roads_utm <- spTransform(roads, CRS("+init=epsg:21037"))
Para rasterização subsequente, você precisará de um modelo raster que cubra a extensão espacial do seu shapefile. O modelo de varredura consiste em 10 linhas e 10 colunas por padrão, evitando assim tempos de computação muito extensos.
roads_utm_rst <- raster(extent(roads_utm), crs = projection(roads_utm))
Agora que o modelo está configurado, percorra todas as células da varredura (que atualmente consiste apenas em valores de NA). Ao atribuir um valor de '1' à célula atual e subsequentemente executar rasterToPolygons
, o shapefile resultante 'tmp_shp' mantém automaticamente a extensão do pixel processado no momento. gIntersects
detecta se essa extensão se sobrepõe às estradas. Caso contrário, a função retornará um valor '0'. Caso contrário, o shapefile da estrada é cortado pela célula atual e o comprimento total de 'SpatialLines' nessa célula está sendo calculado usando 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)
}
})
Por fim, você pode inserir os comprimentos calculados (que são convertidos em quilômetros) no modelo de varredura e verificar visualmente seus 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')
possa ajudar.