【问题标题】:How can I handle an "orphaned hole" in a polygon shapefile in R or ArcGIS?如何处理 R 或 ArcGIS 中多边形 shapefile 中的“孤立洞”?
【发布时间】:2012-07-11 02:17:09
【问题描述】:

我正在尝试使用 over 函数 (rgeos) 在两个多边形(“grd”和“range”)之间进行空间叠加。

此代码适用于除一个以外的所有文件:

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

我知道 shapefile 中某处有一个没有周围多边形的孔,但我不知道如何解决它。 我可以简单地删除索引 9 处的孔吗?如何 ? 如果您有解决方案来修复 ArcGIS 中的 shapefile,这对我来说也很好。

非常感谢您的帮助!!

问候, 卡斯滕

【问题讨论】:

  • 没有人能帮上忙,因为我们不知道 grd 或 range 的结构。许多对象可能有一个@data$grdID 槽。这需要做一个可重复的例子。但是,使用带有几何工具的(免费)QGIS 或带有拓扑工厂的(负担得起的)歧管用于交互式几何检查器。
  • 听起来删除索引 9 处的孔应该可行。当你尝试时会发生什么?如果您没有更好的方法,taRifx 包中的 subset 应该这样做(这些天我不了解我的空间方法)。
  • 好的,我明白了,抱歉我的问题没有很具体:
  • @ari-b-friedman taRifx 似乎不再具有子集函数..
  • 关于 gis stackechange 的相关问题与答案:gis.stackexchange.com/questions/113964/…;提到修复几何错误的包(也会发现孤立的孔):cran.r-project.org/web/packages/cleangeo/vignettes/…

标签: r overlay gis polygon


【解决方案1】:

grd 和 range 都属于 SpatialPolygonsDataFrame 类。

range 的结构如下:

> str(range)
Formal class 'SpatialPolygonsDataFrame' [package "sp"] with 5 slots
  ..@ 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" ...
  ..@ polygons   :List of 3
  .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots
  .. .. .. ..@ Polygons :List of 138
  .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
  .. .. .. .. .. .. ..@ labpt  : num [1:2] 178.6 51.8
  .. .. .. .. .. .. ..@ area   : num 4.58
  .. .. .. .. .. .. ..@ hole   : logi FALSE
  .. .. .. .. .. .. ..@ ringDir: int 1
  .. .. .. .. .. .. ..@ coords : num [1:49, 1:2] 180 180 179 179 179 ...
  .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
  .. .. .. .. .. .. ..@ labpt  : num [1:2] -172.2 52.6

...等等。

grd 的结构如下:

> str(grd)
Formal class 'SpatialPolygonsDataFrame' [package "sp"] with 5 slots
  ..@ 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" ...
  ..@ polygons   :List of 40680
  .. ..$ :Formal class 'Polygons' [package "sp"] with 5 slots
  .. .. .. ..@ Polygons :List of 1
  .. .. .. .. ..$ :Formal class 'Polygon' [package "sp"] with 5 slots
  .. .. .. .. .. .. ..@ labpt  : num [1:2] -179.5 79.1
  .. .. .. .. .. .. ..@ area   : num 5.3
  .. .. .. .. .. .. ..@ hole   : logi FALSE
  .. .. .. .. .. .. ..@ ringDir: int 1
  .. .. .. .. .. .. ..@ coords : num [1:13, 1:2] -179 -180 -180 -180 -180 ...
  .. .. .. ..@ plotOrder: int 1
  .. .. .. ..@ 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 2012-12-05
    • 2016-08-27
    • 2022-07-08
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多