Yakın tarihli bir soruyu takiben , sorununuzu çözmek için rgeos paketi tarafından sunulan işlevlerden faydalanmak isteyebilirsiniz . Tekrarlanabilirlik nedeniyle, DIVA- GIS'ten Tanzanya yollarının şekil dosyasını indirdim ve mevcut çalışma dizinime koydum. Gelecek görevler için üç pakete ihtiyacınız olacak:
- Genel konumsal veri işleme için rgdal
- şekil dosyası verilerinin rasterleştirilmesi için raster
- Raster şablonu ile yolların kesişimini kontrol etmek ve yol uzunluklarını hesaplamak için rgeos
Sonuç olarak, ilk satırlarınız şöyle görünmelidir:
library(rgdal)
library(raster)
library(rgeos)
Bundan sonra şekil dosyası verilerini içe aktarmanız gerekir. DIVA-GIS şekil dosyalarının EPSG: 4326'da dağıtıldığını, bu nedenle şekil dosyasını derece yerine metre ile başa çıkmak için EPSG: 21037'ye (UTM 37S) yansıtacağım.
roads <- readOGR(dsn = ".", layer = "TZA_roads")
roads_utm <- spTransform(roads, CRS("+init=epsg:21037"))
Sonraki rasterleştirme için, şekil dosyanızın uzamsal boyutunu kapsayan bir raster şablonuna ihtiyacınız olacaktır. Raster şablonu varsayılan olarak 10 satır ve 10 sütundan oluşur, bu nedenle çok kapsamlı hesaplama sürelerinden kaçınır.
roads_utm_rst <- raster(extent(roads_utm), crs = projection(roads_utm))
Şablon ayarlandığına göre, rasterdeki tüm hücreler arasında döngü yapın (şu anda yalnızca NA değerlerinden oluşmaktadır). Geçerli hücreye '1' değeri atayarak ve daha sonra çalıştırarak rasterToPolygons
, elde edilen 'tmp_shp' şekil dosyası o anda işlenen pikselin boyutunu otomatik olarak tutar. gIntersects
bu boyutun yollarla örtüşüp örtüşmediğini tespit eder. Değilse, işlev '0' değerini döndürür. Aksi takdirde, yol şekil dosyası geçerli hücre tarafından kırpılır ve o hücre içindeki toplam 'SpatialLines' uzunluğu kullanılarak hesaplanır 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)
}
})
Son olarak, hesaplanan uzunlukları (kilometreye dönüştürülen) raster şablonuna ekleyebilir ve sonuçlarınızı görsel olarak doğrulayabilirsiniz.
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')
yardımcı olabilir.