2012-07-11 36 views
14

我正在尝试使用over函数(rgeos)在两个多边形(“grd”和“range”)之间进行空间叠加。如何在R或ArcGIS中处理多边形shape文件中的“孤立孔”?

此代码适用于所有的文件,但一个:

range.grd.overlay <- grd[!is.na(over(grd, range)), ]@data$grdID # get gridcells that overlap with range 

,并得到该错误消息:

Error in createPolygonsComment(p) : 
    rgeos_PolyCreateComment: orphaned hole, cannot find containing polygon for hole at index 9 

我明白,有没有在shape文件的某处周围的多边形孔,但我无法弄清楚如何解决它。 我可以简单地删除索引9处的孔吗?怎么样 ? 如果您有解决方案来修复ArcGIS中的shapefile,那也适用于我。

非常感谢您的帮助!

问候, 卡斯滕

+0

没有人会对此有所帮助,因为我们有对GRD或结构不知道范围。许多对象可能有一个@ data $ grdID插槽。这需要做一个可重现的例子。但是,使用(免费)QGIS与几何工具或(负担得起的)与拓扑工厂的歧管交互式几何检查。 – mdsumner 2012-07-11 13:31:08

+0

这听起来像删除索引9的洞应该工作。当你尝试时会发生什么? 'taRifx'包中的'subset'应该做到这一点,如果你没有更好的方法(我现在还没有使用空间方法)。 – 2012-07-11 13:32:12

+0

好吧,我明白了,对不起,我的问题没有具体说明: – user1012744 2012-07-11 15:01:16

回答

2

两个grdrange是类SpatialPolygonsDataFrame的。

range具有这样的结构:

> str(range) 
Formal class 'SpatialPolygonsDataFrame' [package "sp"] with 5 slots 
    [email protected] data  :'data.frame': 3 obs. of 17 variables: 
    .. ..$ OBJECTID : int [1:3] 725 726 727 
    .. ..$ SPCRECID : int [1:3] 3313 3313 3313 
    .. ..$ DATE_  : Factor w/ 1 level "19/10/2009": 1 1 1 
    .. ..$ SCINAME : Factor w/ 1 level "Synthliboramphus antiquus": 1 1 1 
    .. ..$ SOURCE : Factor w/ 1 level "Gaston & Jones, 1998; Brazil, 2009": 1 1 1 
    .. ..$ PRESENCE : int [1:3] 1 1 1 
    .. ..$ ORIGIN : int [1:3] 1 1 1 
    .. ..$ SEASONAL : int [1:3] 2 1 3 
    .. ..$ DATA_SENS : Factor w/ 0 levels: NA NA NA 
    .. ..$ SENS_COMM : Factor w/ 0 levels: NA NA NA 
    .. ..$ COMPILER : Factor w/ 1 level "Philip Taylor (BirdLife International)": 1 1 1 
    .. ..$ TAX_COM : Factor w/ 0 levels: NA NA NA 
    .. ..$ DIST_COM : Factor w/ 0 levels: NA NA NA 
    .. ..$ REVIEWERS : Factor w/ 0 levels: NA NA NA 
    .. ..$ CITATION : Factor w/ 1 level "BirdLife International and Natureserve (2011) Bird species distribution maps of the world.": 1 1 1 
    .. ..$ SHAPE_Leng: num [1:3] 190 209 1240 
    .. ..$ SHAPE_Area: num [1:3] 39 16.6 600.8 
    .. ..- attr(*, "data_types")= chr [1:17] "N" "N" "C" "C" ... 
    [email protected] polygons :List of 3 
    .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots 
    .. .. .. [email protected] Polygons :List of 138 
    .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots 
    .. .. .. .. .. .. [email protected] labpt : num [1:2] 178.6 51.8 
    .. .. .. .. .. .. [email protected] area : num 4.58 
    .. .. .. .. .. .. [email protected] hole : logi FALSE 
    .. .. .. .. .. .. [email protected] ringDir: int 1 
    .. .. .. .. .. .. [email protected] coords : num [1:49, 1:2] 180 180 179 179 179 ... 
    .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots 
    .. .. .. .. .. .. [email protected] labpt : num [1:2] -172.2 52.6 

...等等。

grd具有这样的结构:

> str(grd) 
Formal class 'SpatialPolygonsDataFrame' [package "sp"] with 5 slots 
    [email protected] data  :'data.frame': 40680 obs. of 12 variables: 
    .. ..$ ID  : int [1:40680] 361 362 363 364 365 366 367 368 369 370 ... 
    .. ..$ X_COORD : num [1:40680] -180 -178 -178 -176 -176 ... 
    .. ..$ Y_COORD : num [1:40680] 79.1 79.1 79.1 79.1 79.1 ... 
    .. ..$ ID_1  : Factor w/ 13713 levels "10","10000","10001",..: NA NA NA NA NA NA NA NA NA NA ... 
    .. ..$ grdID  : int [1:40680] 1 2 3 4 5 6 7 8 9 10 ... 
    .. ..$ ROW  : int [1:40680] 1 1 1 1 1 1 1 1 1 1 ... 
    .. ..$ COL  : int [1:40680] 1 2 3 4 5 6 7 8 9 10 ... 
    .. ..$ AREA  : num [1:40680] 12364 12364 12364 12364 12364 ... 
    .. ..$ PERIMETER : num [1:40680] 445 445 445 445 445 ... 
    .. ..$ MAJORITY : int [1:40680] 0 0 0 0 0 0 0 0 0 0 ... 
    .. ..$ PROP0_0062: num [1:40680] 0 0 0 0 0 0 0 0 0 0 ... 
    .. ..$ AREA_KM2 : num [1:40680] 0 0 0 0 0 0 0 0 0 0 ... 
    .. ..- attr(*, "data_types")= chr [1:12] "N" "N" "N" "C" ... 
    [email protected] polygons :List of 40680 
    .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots 
    .. .. .. [email protected] Polygons :List of 1 
    .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots 
    .. .. .. .. .. .. [email protected] labpt : num [1:2] -179.5 79.1 
    .. .. .. .. .. .. [email protected] area : num 5.3 
    .. .. .. .. .. .. [email protected] hole : logi FALSE 
    .. .. .. .. .. .. [email protected] ringDir: int 1 
    .. .. .. .. .. .. [email protected] coords : num [1:13, 1:2] -179 -180 -180 -180 -180 ... 
    .. .. .. [email protected] plotOrder: int 1 
    .. .. .. [email protected] labpt : num [1:2] -179.5 79.1 

...等等。

我发现这帮助从Roger Bivand这工作了三分之二的有问题的文件:

>slot(shape.input, "polygons") <- lapply(slot(shape.input, "polygons"), checkPolygonsHoles) 
>range.grd.overlay <- grd[!is.na(over(grd, range)), ]@data$grdID # get gridcells of that overlay with range polygon 

但对于第三档的固定没有工作。 R.将冻结,直到我最终按下Esc键,之后试图使空间叠加时,我会得到同样的错误信息:

Error in createPolygonsComment(p) : 
    rgeos_PolyCreateComment: orphaned hole, cannot find containing polygon for hole at index 13