Після останнього запитання ви можете скористатися функціями, запропонованими пакетом rgeos, щоб вирішити вашу проблему. З метою відтворюваності я завантажив з DIVA-GIS форм-файл танзанійських доріг і помістив його у свій поточний робочий каталог. Для майбутніх завдань вам знадобляться три пакети:
- rgdal для загальної обробки просторових даних
- растр для растерізації даних форм-файлів
- rgeos перевірити перехрестя доріг за допомогою растрового шаблону та обчислити довжину дороги
Отже, ваші перші рядки можуть виглядати так:
library(rgdal)
library(raster)
library(rgeos)
Після цього вам потрібно імпортувати дані форми файлу. Зауважте, що файли форм DIVA-GIS поширюються у форматі EPSG: 4326, тому я спроектую файл форми в EPSG: 21037 (UTM 37S) для вирішення метрів, а не градусів.
roads <- readOGR(dsn = ".", layer = "TZA_roads")
roads_utm <- spTransform(roads, CRS("+init=epsg:21037"))
Для подальшої растерізації вам знадобиться шаблон растра, який охоплює просторовий обсяг вашого файлу форм. Растровий шаблон складається з 10 рядків і 10 стовпців за замовчуванням, таким чином уникаючи занадто великого часу обчислень.
roads_utm_rst <- raster(extent(roads_utm), crs = projection(roads_utm))
Тепер, коли шаблон налаштований, проведіть через усі комірки растра (який наразі складається лише із значень NA). Призначаючи поточній комірці значення "1" та згодом виконуючи rasterToPolygons
, отриманий формуляр 'tmp_shp' автоматично утримує ступінь оброблюваного пікселя. gIntersects
виявляє, чи збігається ця ступінь з дорогами. Якщо ні, функція поверне значення "0". В іншому випадку файл форми дороги обрізається поточною коміркою і загальна довжина 'SpatialLines' у цій комірці обчислюється за допомогою 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)
}
})
Нарешті, ви можете вставити обчислені довжини (які перетворюються на кілометри) у растровий шаблон і візуально перевірити свої результати.
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')
може допомогти.