Loại bỏ giao điểm của một đa giác với một đa giác bằng R?


9

Tôi đang cố gắng loại bỏ giao điểm từ Poly2 lên Poly1. Dưới đây là các coords của 2 đa giác.

> coords1
          [,1]     [,2]
 [1,] 992.0161 7462.531
 [2,] 950.1962 7413.532
 [3,] 902.3632 7421.207
 [4,] 706.1985 7472.378
 [5,] 654.0139 7711.760
 [6,] 657.5960 7726.950
 [7,] 786.2667 7844.380
 [8,] 789.5935 7842.925
 [9,] 981.7046 7498.659
[10,] 983.4246 7493.271
[11,] 990.6680 7469.888
[12,] 992.0161 7462.531
> coords2
         [,1]     [,2]
[1,] 930.3464 7607.313
[2,] 979.3528 7502.470
[3,] 865.8662 7484.337
[4,] 850.5665 7594.947
[5,] 930.3464 7607.313

Poly1<-Polygon(coords1)
Poly2<-Polygon(coords2)

Hai đa giác trông như thế này nhập mô tả hình ảnh ở đâyĐiều tôi muốn nhận được ở cuối là đa giác màu xanh đậm (Poly1) không có vùng màu xanh nhạt (Poly2), tức là tọa độ phía đông mới.

Câu trả lời:


7

Hãy thử gDifferencechức năng từ gói rgeos :

coords1 <- as.matrix(read.table(textConnection("
992.0161 7462.531
950.1962 7413.532
902.3632 7421.207
706.1985 7472.378
654.0139 7711.760
657.5960 7726.950
786.2667 7844.380
789.5935 7842.925
981.7046 7498.659
983.4246 7493.271
990.6680 7469.888
992.0161 7462.531
")))

coords2 <- as.matrix(read.table(textConnection("
930.3464 7607.313
979.3528 7502.470
865.8662 7484.337
850.5665 7594.947
930.3464 7607.313
")))

library("sp")
poly1 <- Polygon(coords1)
poly2 <- Polygon(coords2)
# create SpatialPolygons objects
p1 <- SpatialPolygons(list(Polygons(list(poly1), "p1")))
p2 <- SpatialPolygons(list(Polygons(list(poly2), "p2")))

library("rgeos")
res <- gDifference(p1, p2)
plot(res, col="blue")

kết quả gDifference


5

Giải pháp sử dụng rgeos::gDifferencenhanh hơn nhiều, nhưng nó trả về một SpatialPolygonsđối tượng đơn giản .

Nếu bạn đang làm việc với hai SpatialPolygonsDataFramegiây và bạn muốn giữ thông tin khung dữ liệu, bạn chỉ cần làm điều này và kết quả sẽ là SpatialPolygonsDataFrame:

library(raster)

res <- p1 - p2

Sử dụng giải pháp này, tôi gặp lỗi: "đối số không phải là số đối với toán tử nhị phân"
Ashe

@Ashe, nhập class(my_obj)để kiểm tra xem cả hai đối tượng của bạn có phải khôngSpatialPolygonsDataFrame
rafa.pereira 17/03/2017

Thật vậy, tôi nhận được SpatialPolygonsDataFramenhư là lớp học.
Ashe

Hừm lạ. Tôi không chắc tại sao điều này sẽ xảy ra. Có lẽ bạn nên mở một câu hỏi mới về cách Xóa giao điểm của hai SpatialPolygonsDataFrames trong khi giữ thông tin dữ liệu
rafa.pereira 17/03/2017

1
Tôi đã khắc phục vấn đề. Tôi cần phải cài đặt rasterthư viện để giải pháp này hoạt động. Ngoài ra câu trả lời sẽ hữu ích. Ngoài ra, tín dụng cho câu trả lời này: gis.stackexchange.com/a/169597/93643
Ashe
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.