我有一个包含大量多边形,点和线的列表。现在我想检查每个多边形之间交叉的区域。我知道我可以使用gIntersect
,但我的数据是在data.frame中而不是在spatialpolygon文件中。有没有聪明的方法呢?
lon lat ID
127.0167 29.14449 1
127.0148 29.14507 1
123.8638 17.63341 2
123.8593 17.62754 2
123.8568 17.63601 2
123.8528 17.65023 2
127.6790 49.01934 3
127.2719 49.12513 6
127.0249 49.14633 7
127.6763 49.02139 8
127.6710 49.02426 8
127.6684 49.02668 8
127.4648 49.07208 13
127.3757 49.08205 13
127.4198 30.04310 14
127.4259 40.04974 14
127.3136 39.09050 15
127.3197 29.09516 15
127.2360 39.16492 16
127.2099 49.16787 16
127.2266 29.01800 17
128.2771 48.36411 18
128.1930 28.44411 18
128.1925 18.44530 18
128.1928 28.44553 18
128.1932 48.44598 18
128.1953 38.44774 18
128.1978 28.44532 18
125.7947 28.71272 19
125.7982 28.72078 19
125.8402 18.74029 19
125.8572 18.74141 19
这是清单。它包含原始文件中的更多数据点。具有相同ID的坐标属于同一个多边形,点或线。我需要检查每个多边形与列表中所有其他多边形的交集。
答案 0 :(得分:1)
您可以将data.frame
转换为SpatialPolygons
。
library(sp)
polys <- lapply(unique(coords$ID), function(i) {
Polygons(list(Polygon(coords[coords$ID==i, 1:2])), ID=i)
})
spa_polys <- SpatialPolygons(polys)
另外,我发现gIntersects
对点(单点空间多边形)或线(两点空间多边形)不起作用。
library(rgeos)
> gIntersects(spa_polys[13], spa_polys[1])
Error in RGEOSBinPredFunc(spgeom1, spgeom2, byid, func) :
IllegalArgumentException: Invalid number of points in LinearRing found 3 - must be 0 or >= 4
> gIntersects(spa_polys[13], spa_polys[2])
[1] FALSE
> gIntersects(spa_polys[13], spa_polys[3])
Error in RGEOSBinPredFunc(spgeom1, spgeom2, byid, func) :
IllegalArgumentException: point array must contain 0 or >1 elements
> gIntersects(spa_polys[13], spa_polys[13])
[1] TRUE