当前位置: 首页 > 知识库问答 >
问题:

如何处理 R 或 ArcGIS 中面形状文件中的“孤立孔”?

孙博艺
2023-03-14

我正在尝试使用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,这对我来说也很好。

提前非常感谢您的帮助!!

问候,卡斯滕

共有1个答案

戚俊健
2023-03-14

grdrange 都属于 SpatialPolygonsDataFrame 类。

范围有这样的结构:

> 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
 类似资料:
  • 我有一个形状文件,上传路径如下: https://drive.google.com/open?id=0B1ITb_7lHh1EUFVfVWc4ekRfSnc 我使用“shapefiles”包中的“read.shapefiles”函数导入了数据: 我现在需要提取landuse对象中所有形状的横向/纵向质心,并将其添加到landuse$dbf数据框中 我尝试了两件事: 两者都给了我以下错误: 我不知道

  • 我正在创建一个模型,该模型引用第三方包——芹菜(Crontab时间表和周期任务)中的模型。我的模型(让我们称之为SchduledRun)将包含一个周期任务的外键。 我知道,如果我删除外键本身,就会发生级联删除,引用该外键的父级也会被删除。(除非在删除时被覆盖…) 但由于我将ScheduledRun指向PeriodicTask的FK,所以在删除ScheduledRun时,PeriodicTask不会

  • 在TensorFlow FAQ中,它说: 在TensorFlow中,张量既有静态(推断)形状,也有动态(真实)形状。可以使用tf.Sensor读取静态形状。get_shape()方法:此形状是从用于创建张量的操作中推断出来的,可能部分完成。如果静态形状没有完全定义,可以通过计算tf.shape(t)来确定张量t的动态形状。 但我仍然不能完全理解静态形状和动态形状之间的关系。有没有例子表明他们的差异

  • 问题内容: 我有3个表MySQL(MyIsam): 如何删除所有没有消息也没有archivedMessage的用户? 问题答案: 您可以使用:

  • 但是,结果是写在第3行和第5行都以标点符号开始的地方,如PDF输出的图像所示 我可以简单地在适当的地方添加一些新的行,以使它看起来正确,但这将意味着,如果文本在内部重新翻译,我的修复可能不再起作用。有人知道如何确保iText不会以这些标点符号开始一行吗?