【发布时间】: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_difference可以用作焦点时的解决方法 土地覆盖被非焦点土地覆盖所取代。一个例子( 蓝色的补丁,红色的非焦点土地覆盖: -
既不使用
sf::st_intersection保持焦点土地覆盖(绿色)类型,也不使用sf::st_difference排除非焦点土地覆盖类型(红色)的“困难”情况 - 两种方法都出现类似错误:
我无法制作可重现的示例,因此我希望可以从示例图像中弄清楚这里发生了什么。我在那里看不到任何模式,所以也许只有对st_intersection 和st_difference 有深刻见解的人才能指出解决方案...
【问题讨论】:
-
报错说输入拓扑无效。您是否检查了两个输入的有效性?我不明白为什么您不能为操作失败的示例提供数据。从某种意义上说,它必须是确定性的,相同的两个输入会发生相同的结果,对吧?
标签: r spatial intersection sf