После недавнего вопроса вы можете использовать функции, предлагаемые пакетом 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». В противном случае шейп-файл дороги обрезается текущей ячейкой, а общая длина «Пространственные линии» в этой ячейке рассчитывается с использованием 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')
может помочь.