ตามคำถามล่าสุดคุณอาจต้องการใช้ฟังก์ชันที่เสนอโดยแพ็คเกจrgeosเพื่อแก้ปัญหาของคุณ ด้วยเหตุผลของการทำซ้ำฉันดาวน์โหลดรูปร่างของถนนแทนซาเนียจากDIVA-GISและวางไว้ในไดเรกทอรีการทำงานปัจจุบันของฉัน สำหรับงานที่จะเกิดขึ้นคุณจะต้องมีสามแพ็คเกจ:
- rgdalสำหรับการจัดการข้อมูลเชิงพื้นที่ทั่วไป
- rasterสำหรับการแรสเตอร์ของข้อมูล shapefile
- rgeosเพื่อตรวจสอบจุดตัดของถนนที่มีแม่แบบแรสเตอร์และคำนวณความยาวของถนน
ดังนั้นบรรทัดแรกของคุณควรมีลักษณะเช่นนี้:
library(rgdal)
library(raster)
library(rgeos)
หลังจากนั้นคุณต้องนำเข้าข้อมูลรูปร่าง โปรดทราบว่า DIVA-GIS shapefiles ถูกกระจายใน 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' มิฉะนั้น shapefile ถนนถูกตัดโดยเซลล์ปัจจุบันและความยาวรวมของ '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')
อาจจะช่วย