使用R将一个多边形与另一个多边形相交?


9

我正在尝试从Poly2删除到Poly1的相交。以下是2个多边形的坐标。

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

这两个多边形看起来像这样在此处输入图片说明。最后,我想得到的是深蓝色多边形(Poly1),没有浅蓝色(Poly2)区域,即新的东部坐标。

Answers:


7

尝试使用rgeos软件包中的gDifference函数:

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

g差异结果


5

使用的解决方案rgeos::gDifference要快得多,但是它返回一个简单的SpatialPolygons对象。

如果使用2,SpatialPolygonsDataFrame并且要保留数据框信息,则只需执行此操作,结果将是SpatialPolygonsDataFrame

library(raster)

res <- p1 - p2

使用此解决方案,我得到一个错误:“二进制运算符的非数字参数”
Ashe

@Ashe,键入class(my_obj)以检查您的两个对象是否都是SpatialPolygonsDataFrame
rafa.pereira

的确,我SpatialPolygonsDataFrame上课了。
阿什

嗯,奇怪。我不确定为什么会这样。也许您应该打开一个新问题,即如何在保留数据信息的同时删除两个SpatialPolygonsDataFrames的相交
rafa.pereira

1
我已经解决了这个问题。我需要安装raster库才能使此解决方案正常工作。答案的补充会有所帮助。另外,请相信此答案:gis.stackexchange.com/a/169597/93643
Ashe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.