Mengikuti pertanyaan terakhir , Anda mungkin ingin menggunakan fungsionalitas yang ditawarkan oleh paket rgeos untuk menyelesaikan masalah Anda. Untuk alasan reproduktifitas, saya mengunduh bentuk jalan Tanzania dari DIVA-GIS dan memasukkannya ke direktori kerja saya saat ini. Untuk tugas yang akan datang, Anda akan membutuhkan tiga paket:
- rgdal untuk penanganan data spasial umum
- raster untuk rasterization dari data shapefile
- rgeos untuk memeriksa persimpangan jalan dengan templat raster dan menghitung panjang jalan
Akibatnya, baris pertama Anda dapat terlihat seperti ini:
library(rgdal)
library(raster)
library(rgeos)
Setelah itu, Anda perlu mengimpor data shapefile. Perhatikan bahwa DIVA-GIS shapefile didistribusikan dalam EPSG: 4326, jadi saya akan memproyeksikan shapefile ke EPSG: 21037 (UTM 37S) untuk menangani meter daripada derajat.
roads <- readOGR(dsn = ".", layer = "TZA_roads")
roads_utm <- spTransform(roads, CRS("+init=epsg:21037"))
Untuk rasterisasi selanjutnya, Anda akan memerlukan templat raster yang mencakup batas spasial dari shapefile Anda. Templat raster terdiri dari 10 baris dan 10 kolom secara default, sehingga menghindari waktu komputasi yang terlalu luas.
roads_utm_rst <- raster(extent(roads_utm), crs = projection(roads_utm))
Sekarang templat sudah diatur, loop melalui semua sel raster (yang saat ini hanya terdiri dari nilai-nilai NA). Dengan menetapkan nilai '1' ke sel saat ini dan kemudian mengeksekusi rasterToPolygons
, shapefile yang dihasilkan 'tmp_shp' secara otomatis menampung luasnya piksel yang saat ini diproses. gIntersects
mendeteksi apakah tingkat ini tumpang tindih dengan jalan. Jika tidak, fungsi akan mengembalikan nilai '0'. Jika tidak, bentuk jalan dipotong oleh sel saat ini dan total panjang 'SpatialLines' dalam sel itu sedang dihitung menggunakan 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)
}
})
Terakhir, Anda dapat memasukkan panjang yang dihitung (yang dikonversi menjadi kilometer) ke dalam templat raster dan secara visual memverifikasi hasil Anda.
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')
bisa membantu.