使用apply将列表A中的所有多边形与r中列表B中的所有多边形相交

时间:2013-04-18 21:15:38

标签: r list polygons

我有两个清单;它们都包含类gpc.poly的多边形。

第一个列表是" ptareas":

    > ptareas
    $AG00035
    GPC Polygon
       Num. Contours:  1 
       Num. Vertices:  2000 
       BBox (X):  5.999999 --> 6.000001 
       BBox (Y):  11 --> 11 

    $AG00036
    GPC Polygon
       Num. Contours:  1 
       Num. Vertices:  2000 
       BBox (X):  9.999999 --> 10 
       BBox (Y):  4.999999 --> 5.000001

第二个列表是" isect_polys":

> isect_polys
[[1]]
GPC Polygon
   Num. Contours:  2 
   BBox (X):  4.928932 --> 25.07107 
   BBox (Y):  -2.071068 --> 25.07107 

[[2]]
GPC Polygon
   Num. Contours:  1 
   Num. Vertices:  1028 
   BBox (X):  4.928932 --> 11.23867 
   BBox (Y):  3.953478 --> 12.02995 

[[3]]
GPC Polygon
   Num. Contours:  2 
   BBox (X):  4.928932 --> 25.07107 
   BBox (Y):  -2.071068 --> 25.07107 

[[4]]
GPC Polygon
   Num. Contours:  1 
   Num. Vertices:  1028 
   BBox (X):  4.928932 --> 11.23867 
   BBox (Y):  3.953478 --> 12.02995 

[[5]]
GPC Polygon
   Num. Contours:  2 
   BBox (X):  4.928932 --> 25.07107 
   BBox (Y):  -2.071068 --> 25.07107 

[[6]]
GPC Polygon
   Num. Contours:  1 
   Num. Vertices:  1028 
   BBox (X):  4.928932 --> 11.23867 
   BBox (Y):  3.953478 --> 12.02995 

我正在尝试(并且失败)的事情非常简单。我希望将ptareas中的每个多边形与isect_polys中的每个多边形相交。实际上,每次运行脚本时每个列表的长度都会有所不同,但是对于这个例子,我试图找到一种方法来自动执行以下操作:

intersect(ptareas[[1]],isect_polys[[1]])
intersect(ptareas[[1]],isect_polys[[2]])
intersect(ptareas[[1]],isect_polys[[3]])
intersect(ptareas[[1]],isect_polys[[4]])
intersect(ptareas[[1]],isect_polys[[5]])
intersect(ptareas[[1]],isect_polys[[6]])
intersect(ptareas[[2]],isect_polys[[1]])
intersect(ptareas[[2]],isect_polys[[2]])
intersect(ptareas[[2]],isect_polys[[3]])
intersect(ptareas[[2]],isect_polys[[4]])
intersect(ptareas[[2]],isect_polys[[5]])
intersect(ptareas[[2]],isect_polys[[6]])

如果我正在处理矩阵,我只需将ptareas作为一个列矩阵,并将aect_polys作为一行矩阵,然后执行类似于下面的矩阵乘法的操作:

> m1<- matrix(c(1,2),2,1)
> m1
     [,1]
[1,]    1
[2,]    2
> m2<- matrix(c(1:6),1,6)
> m2
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    2    3    4    5    6
> m1 %*% m2
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    1    2    3    4    5    6
[2,]    2    4    6    8   10   12

不幸的是,我不能强迫让我以同样的方式处理多边形列表,所以我希望有人可以解释如何使用其中一个实现相同类型的成对交互功能。作为新手用户,我发现在处理多个列表时很难实现这些功能。由于我在之前的帖子中找不到类似的例子,其他人必须能够轻松地解决类似的双列表问题,而且我相当肯定我错过了一些非常基本的东西。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果没有可重复的示例,很难使用它。但我猜你想要从2个列表中做出所有多边形的外部交叉。

## First I generate combinations of the supplied
dd <- expand.grid(seq_along(ptareas),seq_along(isect_polys))
## Using mapply to test intersection (1-1,2-2,...
mapply(function(x,y)intersect(ptareas[[x]],isect_polys[[y]]),
       dd$Var1,dd$Var2)

注意方面:gpclib的许可证太棒了,也许您应该使用rgeos包。