รวมรายการวัตถุรูปหลายเหลี่ยมเชิงพื้นที่ใน R


16

ฉันมีรายชื่อของบัฟเฟอร์เชิงพื้นที่ (30,000 บัฟเฟอร์) ที่ฉันสร้างขึ้นด้วยฟังก์ชั่นlapply:

buff.pts <- lapply(1:nrow(pts.prj), FUN=function(l){
  buff <- gBuffer(pts.prj[l,], width=1000) ## 1km
  return(buff)
}))

> head(buff.pts)
[[1]]
class       : SpatialPolygons 
features    : 1 
extent      : 307941.8, 311941.8, 4994518, 4998518  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs +towgs84=0,0,0 

[[2]]
class       : SpatialPolygons 
features    : 1 
extent      : 307226, 311226, 4991153, 4995153  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=tmerc +lat_0=0 +lon_0=-73.5 +k=0.9999 +x_0=304800 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs +towgs84=0,0,0 

จากรายการนี้ฉันจะรวมบัฟเฟอร์เชิงพื้นที่ทั้งหมดเพื่อรับ Shapefile กับบัฟเฟอร์ 30000 (หรือคุณลักษณะ) ได้อย่างไร (รูปร่างนี้จะถูกใช้ในฟังก์ชันaggregateเพื่อรวมรูปหลายเหลี่ยมเชิงพื้นที่โดยแอตทริบิวต์)

ฉันทดสอบโค้ดนี้ แต่ฉันได้รับข้อความแสดงข้อผิดพลาดนี้:

test <- as.data.frame(do.call("rbind", buff.pts))
Error in as.data.frame(do.call("rbind", buff.pts)) : 
  error in evaluating the argument 'x' in selecting a method for function 'as.data.frame': Error in validObject(res) : 
  invalid class SpatialPolygons object: non-unique Polygons ID slot values

3
เหตุผลใดที่คุณต้องสร้างบัฟเฟอร์ด้วยlapplyแทนที่จะใช้gBufferกับbyid = TRUE?
cengel

คำตอบ:


12

รับรายการSpatialPolygonsวัตถุต่อไปนี้เป็นวิธีสร้างกรอบข้อมูลรูปหลายเหลี่ยมเชิงพื้นที่ด้วยหนึ่งคุณลักษณะต่อSpatialPolygonsคุณลักษณะดั้งเดิม

ข้อมูลตัวอย่าง: splเป็นรายการของSpatialPolygonsวัตถุ12 ชิ้น - ตรวจสอบให้แน่ใจว่าวัตถุของคุณให้ผลลัพธ์แบบเดียวกันและทดสอบตัวอย่างขนาดเล็กก่อนที่จะเรียกใช้บน 30,000 รายการ:

> length(spl)
[1] 12
> class(spl)
[1] "list"
> class(spl[[1]])
[1] "SpatialPolygons"
attr(,"package")
[1] "sp"

คุณต้องการสร้างSpatial Polygonsวัตถุเดียวที่มีคุณสมบัติทั้งหมดในนั้นเพื่อสร้างกรอบข้อมูล Spatial Polygons Data:

> joined = SpatialPolygons(lapply(spl, function(x){x@polygons[[1]]}))
> plot(joined)

การดำเนินการนี้จะใช้polygonsช่องแรกจากวัตถุ (และควรมีเพียงช่องเดียวเนื่องจากองค์ประกอบแต่ละรายการในปัจจุบันเป็นฟีเจอร์เดียว) จากนั้นจึงสร้างรายการวัตถุรูปหลายเหลี่ยมซึ่งเป็นสิ่งที่คุณป้อนSpatialPolygonsเพื่อสร้างคุณสมบัติหลายSpatialPolygonsอย่าง ลงจุดนี้และคุณควรเห็นคุณสมบัติทั้งหมดของคุณ ถัดไปหากคุณต้องการบันทึกเป็น a shapefileคุณต้องเพิ่มข้อมูลบางอย่าง ในกรณีที่ไม่มีอย่างอื่นฉันจะสร้างคอลัมน์ 1 ถึง 12 ID แบบง่าย:

> jdata = SpatialPolygonsDataFrame(Sr=joined, data=data.frame(i=1:12),FALSE)

การFALSEตั้งค่าสถานะเพียงหยุด R พยายามจัดเรียงข้อมูลเชิงพื้นที่และไม่ใช่เชิงพื้นที่เพื่อจับคู่ คุณอาจต้องการใส่ขนาดบัฟเฟอร์ใน data frame หรืออะไรบางอย่าง

งานเสร็จแล้ว


18

ในการรวมรายการวัตถุอวกาศคุณสามารถทำสิ่งต่อไปนี้

library(raster)
m <- do.call(bind, buff.pts) 

2

คุณสามารถใช้อาร์กิวเมนต์ makeUniqueID ใน rbind หากรูปหลายเหลี่ยมของคุณไม่มีรหัสที่ไม่ซ้ำกัน

 library(purrr)

list(buff.pts, makeUniqueIDs = T) %>% 
  flatten() %>% 
  do.call(rbind, .)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.