【问题标题】:R sf: Points of LinearRing do not form a closed linestringR sf:LinearRing 的点不形成闭合线串
【发布时间】:2020-05-02 02:29:22
【问题描述】:

我正在尝试计算一组多边形的质心。

我的数据集geodata 包含五列,其中一列geometry 属于sfc_GEOMETRY 类,共有45759 行。

当我运行 sf::st_centroid(geodata) 时,我收到以下消息

CPL_geos_op("centroid", x, numeric(0), integer(0), numeric(0), 中的错误:评估错误:IllegalArgumentException:LinearRing 的点不形成闭合线串。

另外:警告信息:

1:在 st_centroid.sf(geodata) 中: st_centroid 假设属性在 x 的几何图形上是恒定的

2:在 st_centroid.sfc(st_geometry(x), of_largest_polygon = of_largest_polygon) 中: st_centroid 没有为经度/纬度数据提供正确的质心

  • 我应该运行一个循环来检测哪个几何图形没有闭合吗?
  • 这是我的几何类的问题吗?应该是sfc_MULTIPOLYGON吗?

可能的解决方案:

我在通过循环读取文件列表时遇到了这个问题。循环会读入文件,然后将rbind 它们一起放入geodata,然后然后计算质心:

for(i in 1:length(list)){
  file <- st_read(list[i])
  geodata <- rbind(geodata, file) #geodata is here a void sf object
}
geocent <- st_centroid(geodata)

当我计算循环中的质心 时(对于列表中的每个文件),错误消失了。

for(i in 1:length(list)){
  file <- st_read(list[i])
  file <- st_centroid(file)
  geocent <- rbind(geodata, file) #geodata is here a void sf object
}

因此,我认为问题在于绑定操作。

  • 也许我没有以正确的方式定义我的 void sf 对象。
  • 也许rbind 不是合适的函数,或者我应该指定它的参数。

【问题讨论】:

  • 在您的数据子集上是否会像这样失败?在每一行?在一排还是几排?这些行有什么不同?没有你的数据很难说,所以你应该自己调查一下。

标签: r sf


【解决方案1】:

无需运行循环来查找哪个几何图形不好。 st_is_valid() 函数应该告诉您哪些行有问题。

看起来您的某个几何图形可能由不正确数量的点组成。

有关在 r-spatial 中查找和解决问题的更多信息:https://www.r-spatial.org/r/2017/03/19/invalid.html

【讨论】:

  • 当我运行any(is.na(st_is_valid(geodata))) 时,我得到FALSE。这是来自st_is_valid 的错误,因为未安装lwgeomsf_extSoftVersion()['lwgeom'] 产生NA)?
  • 我不知道如何回答您的具体问题而不会出现可重现的错误。
猜你喜欢
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
  • 2021-08-05
  • 2016-01-07
  • 1970-01-01
  • 2021-02-13
相关资源
最近更新 更多