2013-04-18 30 views
0

我有两个列表;它们都包含gpc.poly类的多边形。使用apply将列表A中的所有多边形与列表B中的所有多边形相交r

第一清单 “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一列矩阵,isect_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 

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

回答

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包。

+0

这工作完美; seq_along函数是我以前从未见过的位。感谢您花费我几个小时的问题的优雅解决方案。 – user2047457