Sau một câu hỏi gần đây , bạn có thể muốn sử dụng các chức năng được cung cấp bởi gói rgeos để giải quyết vấn đề của bạn. Vì lý do tái sản xuất, tôi đã tải xuống một shapefile của đường Tanzania từ DIVA-GIS và đưa nó vào thư mục làm việc hiện tại của tôi. Đối với các tác vụ sắp tới, bạn sẽ cần ba gói:
- rgdal để xử lý dữ liệu không gian chung
- raster cho rasterization dữ liệu shapefile
- rgeos để kiểm tra giao lộ của đường với mẫu raster và tính chiều dài đường
Do đó, các dòng đầu tiên của bạn có thể trông như thế này:
library(rgdal)
library(raster)
library(rgeos)
Sau đó, bạn cần nhập dữ liệu shapefile. Lưu ý rằng các shapefile DIVA-GIS được phân phối trong EPSG: 4326, vì vậy tôi sẽ chiếu shapefile thành EPSG: 21037 (UTM 37S) để xử lý các mét thay vì độ.
roads <- readOGR(dsn = ".", layer = "TZA_roads")
roads_utm <- spTransform(roads, CRS("+init=epsg:21037"))
Đối với rasterization tiếp theo, bạn sẽ cần một mẫu raster bao gồm phạm vi không gian của shapefile của bạn. Mẫu raster bao gồm 10 hàng và 10 cột theo mặc định, do đó tránh thời gian tính toán quá rộng.
roads_utm_rst <- raster(extent(roads_utm), crs = projection(roads_utm))
Bây giờ mẫu đã được thiết lập, lặp qua tất cả các ô của raster (hiện chỉ bao gồm các giá trị NA). Bằng cách chỉ định giá trị '1' cho ô hiện tại và sau đó thực thi rasterToPolygons
, shapefile 'tmp_shp' kết quả sẽ tự động giữ phạm vi của pixel hiện đang được xử lý. gIntersects
phát hiện xem mức độ này trùng với đường. Nếu không, hàm sẽ trả về giá trị '0'. Mặt khác, shapefile đường bị cắt bởi ô hiện tại và tổng chiều dài của 'SpatialLines' trong ô đó đang được tính bằng cách sử dụng 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)
}
})
Cuối cùng, bạn có thể chèn độ dài tính toán (được chuyển đổi thành km) vào mẫu raster và xác minh trực quan kết quả của bạn.
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')
có thể giúp đỡ.