如何修复从 GEOS 转换为 s2 引起的球面几何误差

can*_*156 4 r polygon geos r-sf s2

我遇到了与连接空间数据时如何解决球面几何故障相同的问题

我以前可以使用的代码现在不能用于从 GEOS 到 s2 的转换。

我不确定如何创建此错误的可重现示例。sf 包附带的示例数据集可以很好地使用此代码,因为我确信它们也已更新为可以与 s2 包一起使用。最好的

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.
Run Code Online (Sandbox Code Playgroud)

我尝试了如何解决连接空间数据时的球面几何故障中的解决方案

您有两个选择:

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.
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*tin 7

这不是代码的问题,而是数据的问题。S2 只是对多边形一致性更加严格,当遇到无效多边形时会抛出此错误。

这里的多边形似乎有自相交,就像

A--B
|  |
D--C--E
   |  |
   G--F
Run Code Online (Sandbox Code Playgroud)

该形状应描述为两个多边形:ABCDA 和CEFGC。但通常它被描述为单个多边形 ABCEFGCDA (注意 C 重复两次) - 这也可能发生在这里。一些库会很乐意接受这一点,但 S2 抱怨C非连续边 BC 和 GC 中存在重复顶点。

如果可以的话,请在加载数据之前修复数据。我知道 PostgreSQL/PostGIS 通常可以修复这些问题 - 它会接受输入 WKB,并将ST_MakeValid其分割成多个多边形。R 似乎也有st_make_valid https://rdrr.io/cran/sf/man/valid.html(我没有个人经验)。