Suite à une question récente , vous souhaiterez peut-être utiliser les fonctionnalités offertes par le package rgeos pour résoudre votre problème. Pour des raisons de reproductibilité, j'ai téléchargé un fichier de formes de routes tanzaniennes à partir de DIVA-GIS et l'ai mis dans mon répertoire de travail actuel. Pour les tâches à venir, vous aurez besoin de trois packages:
- rgdal pour la gestion générale des données spatiales
- raster pour la rastérisation des données du fichier de formes
- rgeos pour vérifier l'intersection des routes avec un modèle raster et calculer les longueurs des routes
Par conséquent, vos premières lignes de pourraient ressembler à ceci:
library(rgdal)
library(raster)
library(rgeos)
Après cela, vous devez importer les données du fichier de formes. Notez que les fichiers de formes DIVA-GIS sont distribués en EPSG: 4326, donc je projetterai le fichier de formes en EPSG: 21037 (UTM 37S) pour traiter les mètres plutôt que les degrés.
roads <- readOGR(dsn = ".", layer = "TZA_roads")
roads_utm <- spTransform(roads, CRS("+init=epsg:21037"))
Pour la pixellisation ultérieure, vous aurez besoin d'un modèle de tramage qui couvre l'étendue spatiale de votre fichier de formes. Le modèle raster se compose de 10 lignes et 10 colonnes par défaut, évitant ainsi des temps de calcul trop longs.
roads_utm_rst <- raster(extent(roads_utm), crs = projection(roads_utm))
Maintenant que le modèle est configuré, parcourez toutes les cellules du raster (qui se compose actuellement de valeurs NA uniquement). En attribuant une valeur de «1» à la cellule actuelle et en l'exécutant par la suite rasterToPolygons
, le fichier de formes résultant «tmp_shp» contient automatiquement l'étendue du pixel actuellement traité. gIntersects
détecte si cette étendue chevauche des routes. Sinon, la fonction renverra une valeur de «0». Sinon, le fichier de formes de route est rogné par la cellule actuelle et la longueur totale des «SpatialLines» dans cette cellule est calculée à l'aide de 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)
}
})
Enfin, vous pouvez insérer les longueurs calculées (qui sont converties en kilomètres) dans le modèle raster et vérifier visuellement vos résultats.
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')
- être que ça pourrait aider.