如何修复由转换从GEOS到s2引起的球面几何错误

4

我遇到了和如何解决加入空间数据时的球形几何故障相同的问题。

我的代码在从GEOS转换为s2后就不能正常工作了。

我不确定如何创建一个可重现此错误的示例。由于我确信它们已经被更新以与s2包一起使用,因此sf软件包附带的样本数据集可以在这个代码中正常运行。最好的

ranges <- st_read("Data/Range maps/PRISM_shorebird_ranges_breeding/PRISM_shorebird_ranges_breeding.shp")

ranges2 <- ranges %>%
  group_by(binomial) %>%
  select(-seasonal, -Shape_Area) %>%
  summarize()

Error in s2_geography_from_wkb(x, oriented = oriented, check = check) : 
  Evaluation error: Found 2 features with invalid spherical geometry.
[1] Loop 0 is not valid: Edge 319 has duplicate vertex with edge 322
[2] Loop 0 is not valid: Edge 53052 has duplicate vertex with edge 53055.

我尝试了在如何解决加入空间数据时的球面几何失败中提供的解决方案。

你有两个选择:

1. 在你的脚本中通过sf::sf_use_s2(FALSE)关闭s2处理;理论上,该行为应恢复到1.0版本之前的状态。

这个方法是可行的,但不是一个好的长期解决方案。我会遇到其他代码的同样问题吗?如何防止发生此问题并充分使用更新的sf软件包功能?

2. 更正多边形对象的球形几何;这将取决于你的错误的具体性质。”

ranges$geometry <- ranges$geometry %>%
  s2::s2_rebuild() %>%
  sf::st_as_sfc()

Error in s2_geography_from_wkb(x, oriented = oriented, check = check) : 
  Evaluation error: Found 22 features with invalid spherical geometry.
[1] Loop 2 is not valid: Edge 846 has duplicate vertex with edge 853
[2] Loop 10 is not valid: Edge 0 has duplicate vertex with edge 4
... and 20 more.

如您所见,这个解决方案对我并没有起作用。我该如何修复这个球面几何错误?


1
我想指出包的一位作者建议我现在最好的选择是使用sf::sf_use_s2(FALSE)。虽然下面的答案在技术上是正确的,但最终我还是采用了这种方法。 - canderson156
1个回答

7

这并不是代码问题,而是数据问题。S2在多边形符合性方面更加严格,在遇到无效的多边形时会抛出这些错误。

这里的多边形似乎存在自相交的情况,例如:

A--B
|  |
D--C--E
   |  |
   G--F

这个形状应该被描述为两个多边形,ABCDA和CEFGC。但通常会将其描述为单个多边形ABCEFGCDA(请注意,C重复了两次)-这也可能发生在这里。一些库可以轻松接受此类输入,但S2在非连续边BC和GC中的顶点C重复时会引发错误。
如果可以,请在加载数据之前修复数据。我知道PostgreSQL / PostGIS通常可以解决这些问题-它可以接受输入的WKB,并具有ST_MakeValid函数,可将其拆分为多个多边形。R似乎也有st_make_valid函数https://rdrr.io/cran/sf/man/valid.html (我个人没有使用过)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接