如何修复从 GEOS 到 s2 转换引起的球面几何错误
How to fix spherical geometry errors caused by conversion from GEOS to 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.
我尝试了
中的解决方案
你有两个选择:
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.
如您所见,此解决方案对我不起作用。我该如何修复这个球面几何错误?
这不是代码的问题,是数据的问题。 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(我没有个人经验)。
我遇到了与
我以前可以使用的代码现在不适用于从 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.
我尝试了
你有两个选择:
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.
如您所见,此解决方案对我不起作用。我该如何修复这个球面几何错误?
这不是代码的问题,是数据的问题。 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(我没有个人经验)。