Làm thế nào để thực hiện một clip GIS thực sự của lớp đa giác bằng cách sử dụng lớp đa giác trong R?


16

Tôi muốn thực hiện một Clip GIS thực sự trong R của đa giác đất bằng cách sử dụng một loạt các đa giác ranh giới đơn, nhưng tôi không thể tìm thấy hàm R để thực hiện đúng. Nó sẽ hoạt động giống như clipchức năng trong ArcMap của ESRI. Tôi đã thử overphương pháp trong spgói nhưng có vẻ như nó không hoạt động đối với polys trên polys.

Một đề xuất là sử dụng gói gIntersectiontrong rgeosnhư một clip sử dụng mã sau:

#------------------------------------
library(rgeos)
library(maptools)

#Read layers as SpatialPolygonsDataFrame (both the same Albers projection)
Soils_poly = readShapePoly("Soils_polygons")  #Note - Has 400 polygons
clipper_poly = readShapePoly("clipper_polygon")  #Note - Has 1 polygon

#Try gintersection as clip 
Clipped_polys = gIntersection(Clipper_Tile_poly, Soils_poly)

#-----------------------------------

Điều này mất 5 phút để chạy (cách quá chậm) và lỗi với điều này:

Lỗi trong RGEOSBinTopoFunc (spgeom1, spgeom2, byid, id, drop_not_poly, "rgeos_intersection"): TopologyException: không tìm thấy dirEdge tại -721459.77681285271 2009506.5980

Tôi cũng đã thử mã này để kiểm tra sự chồng chéo:

gIntersects(Clipper_Tile_poly, Soils_poly)

và kết quả là ĐÚNG. clipHàm trong ESRI ArcMap hoạt động tốt cho dữ liệu này.

Bất cứ ai cũng biết về một chức năng R để thực hiện một clip trên đa giác không gian bằng cách sử dụng đa giác không gian?


Hãy thử gIntersection với byid = TRUE (Tôi nghĩ rằng đó là vấn đề với các cấu trúc liên kết lơ lửng đối với một số clip nhất định và đôi khi thực hiện theo cách này giúp), để kiểm tra tốc độ gUnarySTRtreeQuery () hoặc gBinarySTRtreeQuery () để xác định các hộp đa giác của các cặp đa giác và chỉ cắt nhau những cặp đó. Không có trình bao bọc cấp cao dễ dàng cho tất cả afaik này
mdsumner

Câu trả lời:


20

Gợi ý được cung cấp bởi @mdsummer về việc sử dụng byid=TRUEhoạt động chính xác.

Xem ví dụ tái sản xuất, dưới đây:

library(rgeos)
library(sp)

#Create SpatialPlygons objects
polygon1 <- readWKT("POLYGON((-190 -50, -200 -10, -110 20, -190 -50))") #polygon 1
polygon2 <- readWKT("POLYGON((-180 -20, -140 55, 10 0, -140 -60, -180 -20))") #polygon 2

par(mfrow = c(1,2)) #in separate windows
plot(polygon1, main = "Polygon1") #window 1
plot(polygon2, main = "Polygon2") #window 2

đa giác cạnh nhau

polygon_set <- readWKT(paste("POLYGON((-180 -20, -140 55, 10 0, -140 -60, -180 -20),",
                     "(-190 -50, -200 -10, -110 20, -190 -50))"))

par(mfrow = c(1,1)) #now, simultaneously
plot(polygon_set, main = "Polygon1 & Polygon2")

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

clip <- gIntersection(polygon1, polygon2, byid = TRUE, drop_lower_td = TRUE) #clip polygon 2 with polygon 1
plot(clip, col = "lightblue")

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

GT <- GridTopology(c(-175, -85), c(10, 10), c(36, 18))
gr <- as(as(SpatialGrid(GT), "SpatialPixels"), "SpatialPolygons")
plot(gr)

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

clip2 <- gIntersection(clip, gr, byid = TRUE, drop_lower_td = TRUE)
plot(clip2, col = "pink")

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


1
Làm việc một giấc mơ - nhanh không thể tin được. Tôi đang sử dụng điều này để clip polylines. Tôi muốn tạo ra các tập hợp con của shapefile cho các con sông của Anh, bởi vì nó hoạt động nhanh hơn với một tập hợp dữ liệu nhỏ hơn.
CJB

1
@AndreSilva, nghĩ rằng tôi đã có, nhưng đoán tôi đã không! Re: cộng đồng, tôi muốn cộng đồng nhà phát triển R GIS lớn hơn một chút TBH. Tôi có thể sẽ phải quay lại ArcMap để số hóa và các quy trình khác nhanh chóng trong GUI.
Rich Pauloo

3

Bạn cũng có thể sử dụng gói raster raster::intersect(spdf1, spdf2). Nó có lợi thế là duy trì các thuộc tính trong trường hợp bạn có SpatialPolygonsDataFrame.

library(sp); library(rgeos)

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")))
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")))

# works but drop the attributes
#gIntersection(spdf1, spdf2, byid=T)

#better to keep attributes
inter1=raster::intersect(spdf1, spdf2)

plot(spdf1, col="red")
plot(spdf2, col="yellow", add=T)
plot(inter1,col="blue", add=T)

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

Nhờ câu hỏi này để chỉ ra rằng và cho mã mẫu.

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.