【问题标题】:sf::st_intersection: virtually random error actionsf::st_intersection:几乎随机的错误动作
【发布时间】:2021-06-09 13:03:02
【问题描述】:

我有一个相对简单的任务要在 R 中完成:我有两个多边形层,一个包含 39 个焦点多边形的“补丁”层和一个包含一个焦点土地覆盖类型的多面体的“土地覆盖”层。我需要剪裁这两个图层,以便仅在焦点多边形内保留焦点土地覆盖类型的范围。有时,这适用于sf::st_intersection,有时这适用于sf::st_difference 和“负”土地覆盖层(包含所有非焦点土地覆盖类型的范围),有时这两种方法都不起作用。起初,我认为这些不同的行为取决于最终的地形复杂性,但事实似乎并非如此。

我得到的错误是形式

Error in CPL_geos_op2(op, st_geometry(x), st_geometry(y)) :    
Evaluation error: TopologyException: Input geom 1 is invalid: Ring Self-intersection at or near point 
4372482.6526834015 5297568.4303682083 at 4372482.6526834015 5297568.4303682083.

所以我使用sf:: st_is_simple ('patch') 检查了土地覆盖多边形和每个焦点多边形,在所有情况下都产生了TRUE

考虑这三种情况:

  • sf::st_intersection 工作的“简单”案例。一个例子( 蓝色补丁,绿色土地覆盖):

    sf::st_intersection (focal_patch, focal_landcover):

  • “中间”情况,sf::st_intersection 不起作用 但是sf::st_difference 可以用作焦点时的解决方法 土地覆盖被非焦点土地覆盖所取代。一个例子( 蓝色的补丁,红色的非焦点土地覆盖:

    sf::st_difference (patch, non-focal_landcover)

  • 既不使用sf::st_intersection 保持焦点土地覆盖(绿色)类型,也不使用sf::st_difference 排除非焦点土地覆盖类型(红色)的“困难”情况 - 两种方法都出现类似错误:

我无法制作可重现的示例,因此我希望可以从示例图像中弄清楚这里发生了什么。我在那里看不到任何模式,所以也许只有对st_intersectionst_difference 有深刻见解的人才能指出解决方案...

【问题讨论】:

  • 报错说输入拓扑无效。您是否检查了两个输入的有效性?我不明白为什么您不能为操作失败的示例提供数据。从某种意义上说,它必须是确定性的,相同的两个输入会发生相同的结果,对吧?

标签: r spatial intersection sf


【解决方案1】:

您描述的错误不是随机的;环自相交意味着无效的几何形状。您应该可以通过sf::st_is_valid() 对其进行测试。

在使用源自 ESRI 产品领域的空间对象时会发生此错误,该产品使用的有效性标准与 OGC 领域略有不同。

要解决这个问题,您有多种选择:

  • 过滤掉有问题的几何体(通过基于sf::st_is_valid() 的结果对空间对象进行子集化 = 只保留有效的几何体)
  • 尝试通过 sf::st_make_valid() 更正几何图形 - 请注意,这可能会导致几何图形改变,并且可能需要安装 {lwgeom} 软件包
  • 通过sf::st_buffer(your_ object, 0) 在无效空间对象上应用零宽度缓冲区的“魔法尘埃”。此 hack 将强制创建新几何,可能会克服原始几何中的错误。

有关更多信息,请参阅 sf 包文档:https://r-spatial.github.io/sf/reference/valid.html

【讨论】:

  • 我有点知道这里是 ESRIS 的错...我使用的数据来自国家权威机构,所以我猜他们使用的是 ESRI 产品。我认为sf::st_is_simple 也会检查有效性(?)。很奇怪:我不能再重现错误了。我没有更改我的数据和我的脚本,但现在它工作正常。
  • 我真的很喜欢自行消失的问题...虽然很少见 :) 在我们的姊妹网站上查看这个答案,它更详细地解释了不一致之处 @987654322 @
猜你喜欢
  • 2018-06-25
  • 2011-01-09
  • 2012-07-16
  • 2020-12-29
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 2014-04-08
  • 1970-01-01
相关资源
最近更新 更多