r - sf::st_intersection:几乎随机的错误操作

标签 r spatial intersection r-sf

我在 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作品。一个例子( 蓝色补丁,绿色土地覆盖):enter image description
here

    sf::st_intersection (focal_patch, focal_landcover) : enter image description here

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

    sf::st_difference (patch, non-focal_landcover) enter image
description here

  • 使用 sf::st_intersection 都无法保持焦点土地覆盖(绿色)类型的“困难”情况也不排除使用 sf::st_difference 的非重点土地覆盖类型(红色)工作 - 这两种方法我都遇到类似的错误: enter image description here

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

最佳答案

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

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

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

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

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

关于r - sf::st_intersection:几乎随机的错误操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66584191/

相关文章:

mysql - 如何使用 yii 模型插入 mysql 空间点?

algorithm - 使用近点坐标在集合中查找对象的最快方法

python - 按列对两个不同维度的 numpy 数组进行交集

r - 向 ggplot 添加一个点会弄乱图例

r - 使用 R 从现有列创建新列

elasticsearch - 多边形查询中的Elasticsearch点

3d - 无限锥面*AABB相交测试

arrays - 寻找超快数据存储来执行相交操作

r - 将多个函数应用于 data.table 中的多列

r - 如何在我呈现的文档之外修改 yaml 指令