我有同样的问题如何解决球面几何失败时加入空间数据
我的代码以前可以工作,现在不能从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(我没有个人经验)。