ฉันจะสร้าง SpatialLinesDataFrame จาก dataframe ได้อย่างไร


9

ฉันได้สร้าง data.frame ใน R ฉันต้องการรับ SpatialLinesDataFrame ดังนั้นฉันเข้าใจว่าฉันต้องแปลง data.frame เป็นบรรทัดบรรทัดลงใน SpatialLines และ SpatialLines เป็น SpatialLinesDataFrame ฉันทำอย่างนี้

filedata.frame=data.frame(matrix(file),ncol=14, byrow=T))
file=Lines(filedata.frame)

ฉันได้รับ data.frame ที่ฉันต้องการ แต่ไม่ใช่บรรทัด ฉันแน่ใจว่าพื้นฐาน แต่ทำไมฉันไม่สามารถรับสายได้


ไฟล์ข้อมูลของคุณมีลักษณะอย่างไร พิกัดถูกเก็บไว้อย่างไร? คุณตรวจสอบ?Linesไหม บรรทัดต้องใช้พารามิเตอร์สองตัวเป็นอินพุตLines(slinelist, ID)
Iris

ดังนั้นทุกบรรทัดมีจุดเริ่มต้นและจุดสุดท้าย คุณพูดถูกเกี่ยวกับ Lines ฉันทำแล้ว: สำหรับ (i ใน seq_along (lines)) {lines [[i]] <- Lines (รายการ (Line (rbind (c (ไฟล์ $ x_f [i], ไฟล์ $ y_f [ i]), c (ไฟล์ $ x_tr [i], ยื่น $ y_tr [i])))), as.character (i))}}
58

คำตอบ:


11

นี่คือตัวอย่างเพิ่มเติมจากบทความสั้น ๆspที่แสดงวิธีการสร้าง 'SpatialLinesDataFrame' จากวัตถุ 'data.frame' สามัญ ผมใช้ข้อมูลตัวอย่างบางส่วนที่สร้างขึ้นจากความยาวของ 'SpatialLines' เดียวผ่านgLengthจากrgeos โปรดทราบว่าrownamesชุดข้อมูลที่สร้างขึ้นจะSpatialLinesDataFrameต้องเหมือนกันกับ ID บรรทัดที่กำหนดไว้ก่อนหน้า (ในกรณีนี้คือ "a" และ "b")

library(sp)

## from the sp vignette:
l1 <- cbind(c(1, 2, 3), c(3, 2, 2))
l2 <- cbind(c(1, 2, 3), c(1, 1.5, 1))

Sl1 <- Line(l1)
Sl2 <- Line(l2)

S1 <- Lines(list(Sl1), ID = "a")
S2 <- Lines(list(Sl2), ID = "b")

Sl <- SpatialLines(list(S1, S2))

## sample data: line lengths
library(rgeos)
df <- data.frame(len = sapply(1:length(Sl), function(i) gLength(Sl[i, ])))
rownames(df) <- sapply(1:length(Sl), function(i) Sl@lines[[i]]@ID)


## SpatialLines to SpatialLinesDataFrame
Sldf <- SpatialLinesDataFrame(Sl, data = df)

plot(Sldf, col = c("red", "blue"))
text(labels = paste0("length = ", round(Sldf@data$len, 2)), 
     x = gCentroid(Sldf, byid = TRUE)$x,
     y = gCentroid(Sldf, byid = TRUE)$y)

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.