Clip đa giác và giữ lại dữ liệu?


13

Tôi có hai đa giác này:

library(sp); library(rgeos); library(maptools)

coords1 <- matrix(c(-1.841960, -1.823464, -1.838623, -1.841960, 55.663696,
                    55.659178, 55.650841, 55.663696), ncol=2)
coords2 <- matrix(c(-1.822606, -1.816790, -1.832712, -1.822606, 55.657887,
                    55.646806, 55.650679, 55.657887), ncol=2)
p1 <- Polygon(coords1)
p2 <- Polygon(coords2)
p1 <- Polygons(list(p1), ID = "p1")
p2 <- Polygons(list(p2), ID = "p2")
myPolys <- SpatialPolygons(list(p1, p2))
spdf1 = SpatialPolygonsDataFrame(myPolys, data.frame(variable1 = c(232,
                                                                   242), variable2 = c(235, 464), row.names = c("p1", "p2")))
proj4string(spdf1) <- CRS("+proj=longlat +datum=WGS84 +ellps=WGS84
+towgs84=0,0,0")
plot(spdf1, col="red")

coords1a <- matrix(c(-1.830219, -1.833753, -1.821154, -1.830219, 55.647353,
                     55.656629, 55.652122, 55.647353), ncol=2)
p1a <- Polygon(coords1a)
p1a <- Polygons(list(p1a), ID = "p1a")
myPolys1 <- SpatialPolygons(list(p1a))
spdf2 = SpatialPolygonsDataFrame(myPolys1, data.frame(variable1 = c(2),
                                                      variable2 = c(3), row.names = c("p1a")))
proj4string(spdf2) <- CRS("+proj=longlat +datum=WGS84 +ellps=WGS84
+towgs84=0,0,0")
plot(spdf2, col="yellow", add=T)

nhập mô tả hình ảnh ở đây

Tôi muốn cắt bỏ những phần spdf1được giao nhau spdf2. Tuy nhiên, tôi muốn spdf1duy trì như một SpatialPolygonsDataFrame và giữ lại bất kỳ thông tin nào có trong đó spdf1@data.

Tôi đã thử gDifference như sau, cắt bỏ các phần spdf1được giao nhau spdf2, nhưng sau đó chuyển đổi spdf1thành SpatialPolygons (nghĩa là loại bỏ thông tin có trong spdf1@data).

gDifference(spdf1, spdf2, byid=T)

Làm thế nào tôi có thể cắt thành spdf1với spdf2nhưng giữ lại dữ liệu chứa trong spdf1@data? Tôi đã kiểm tra và thử câu hỏi tương tự này mà không làm thế nào để phủ một đa giác trên SpatialPointsDataFrame và bảo quản dữ liệu SPDF?

Câu trả lời:


9

Cách tiếp cận đơn giản nhất sẽ là

  library(raster)
  x <- spdf1 - spdf2

  # or, more formally
  y <- erase(spdf1,  spdf2)

Xem? 'Gói raster' (phần XIV) để biết thêm các chức năng liên quan đến lớp phủ đa giác. Các chức năng này sử dụng các chức năng cơ bản của rgeos dưới mui xe, trong các chức năng 'cấp độ người dùng' (trái ngược với 'cấp độ nhà phát triển').


Bạn có ý nghĩa gì bởi "trong 'cấp độ người dùng' (trái ngược với 'cấp độ nhà phát triển')"?
luciano

rgeoscung cấp các hoạt động hình học nhưng không xử lý các thuộc tính của dữ liệu. Do đó, việc sử dụng các chức năng này đòi hỏi rất nhiều công việc để giữ mọi thứ lại với nhau. Các chức năng raster đơn giản hóa điều này và hoạt động giống như các chức năng tương tự trong phần mềm GIS,
Robert Hijmans

Vâng, nhưng điều này có thể dẫn đến Lỗi trong SpatialPolygonsDataFrame (part2, x @ data [match (row.names (part2) ,: row.names của dữ liệu và ID Polygons không khớp
jitherrnes

Đó sẽ là một lỗi. Bạn có thể cung cấp một ví dụ về điều đó?
Robert Hijmans

4

Một cách giải quyết khác là thêm lại các thuộc tính sau khi thực hiện clip, trong khi chuyển đổi từ SpatialPolygonssang SpatialPolygonsDataFrame.

sp3 <- gDifference(spdf1, spdf2, byid = TRUE)
row.names(sp3) <- row.names(spdf1)

spdf3 <- SpatialPolygonsDataFrame(sp3, data = spdf1@data)

spdf3@data

   variable1 variable2
p1       232       235
p2       242       464

plot(spdf3, col="red")

nhập mô tả hình ảnh ở đây


Điều này có vẻ như là một vấn đề tôi gặp phải, chỉ có clip đầu ra trong trường hợp cụ thể của tôi tạo ra các tên gọi từ spdf1 không tồn tại (vì là một gsub đơn giản để loại bỏ chữ số thứ 2 trong hàng. )
jitherrnes

Lỗi trong SpatialPolygonsDataFrame (clip, data = as.data.frame (all_spdfs_together @ dữ liệu)): Object chiều dài không phù hợp: clip có 1718 Đa giác đối tượng, nhưng as.data.frame (all_spdfs_together @ dữ liệu) có 86 dòng
jebyrnes

Chắc chắn - tôi có một loạt các đa giác của đại dương. Một số được đặt không chính xác trên đất, hoặc chồng chéo với đất. Tôi muốn cắt nó ra để tôi chỉ có những khu vực nằm trong đại dương. Tôi có một shapefile bờ biển để so sánh với. Đây là mã - gist.github.com/jitherrnes/c2e8d2b6c82849dad3a813d952ab8bb0
jitherrnes

1
nevermind - giải pháp raster :: erase hoạt động (trước đây vì một số lý do kỳ lạ)
jitherrnes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.