2013-04-18 48 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