【问题标题】:Cryptic polygon issue leading to incorrect rasterization导致不正确光栅化的神秘多边形问题
【发布时间】:2018-08-25 20:46:36
【问题描述】:

我使用sfraster 包对许多空间多边形进行栅格化。它的效果很好,除了这种情况,我对如何解决问题没有任何想法:

我有一个作为简单要素多边形的多边形和一个栅格模板。两者都已转换为等面积贝尔曼投影。多边形存在几何有效性问题,我使用 lwgeom 包中的 st_make_valid 修复了该问题。

library(sf)
library(lwgeom)
library(raster)

spfile <- 'sp.rds'
rasterfile <- 'rasterTemplate_150km.tif'

sp <- readRDS(spfile)
rasterTemplate <- raster(rasterfile)

# are there any geometry validity issues? yes!
st_is_valid(sp)
[1] FALSE
Warning message:
In evalq((function (..., call. = TRUE, immediate. = FALSE, noBreaks. = FALSE,  :
  Ring Self-intersection at or near point 9947244.3466675151 1450099.5373749144


sp2 <- st_make_valid(sp)

st_is_valid(sp2)
[1] TRUE

plot(sp2, col='blue')

从视觉上看,多边形看起来不错。

现在我将其栅格化(我需要转换为 SpatialPolygon 以与栅格兼容):

sp3 <- as(sp2, 'Spatial')

cover <- rasterize(sp3, rasterTemplate, getCover=TRUE)

plot(cover, box=F, axes=F)

问题是有一家酒吧经过澳大利亚。

这是否意味着st_is_valid 未检测到该多边形仍然存在几何有效性问题?如果是这样,这会使此类问题难以处理,因为它不容易检测到,除非在视觉上......

回过头来,我可以确认as(sp, 'Spatial) 发生了光栅化问题,因此st_make_valid 不会产生此问题。

我该如何解决这个问题?

更新

以下建议使用st_cast。我试过sp4 &lt;- as(st_cast(sp, "POLYGON"), 'Spatial')。同样的光栅化问题仍然存在。

我也试过用sp5 &lt;- as(st_buffer(sp, dist = 0), 'Spatial')缓冲0,但这也不能解决问题。

多边形可以下载为 .rds 文件here。 栅格可以下载here

【问题讨论】:

  • 不确定到底是什么问题,但也许可以试试sp3 &lt;- st_cast("POLYGON") &lt;- st_make_valid(),看看光栅会产生什么?我对st_make_valid 的经验是,它可以产生一些非常古怪的输出来通过st_is_valid,我找不到关于它如何工作的好的文档。但至少投射到POLYGON 可能会阻止边界在多边形之间混合?比较plot(st_cast(sp, "POLYGON")[1])plot(st_cast(st_make_valid(sp), "POLYGON")[1]) 的输出
  • 感谢@CalumYou 的建议!按照您的建议,我做了sp3 &lt;- st_cast(sp2, "POLYGON")sp4 &lt;- as(sp3, 'Spatial')cover &lt;- rasterize(sp4, rasterTemplate, getCover=TRUE),但我通过澳大利亚的酒吧得到了相同的结果。
  • 嗯。不为st_is_valid 返回TRUE 会阻止rasterizeas('Spatial') 工作吗?如果您使用st_buffer(sp, 0.0) 而不是st_make_valid 的“技巧”怎么办? sp3的剧情是怎样的?
  • @CalumYou,尽管存在有效性问题,但实际上一切都使用sp 运行。换句话说,到目前为止,光栅化问题无论如何都会出现。 sp3 看起来与我上面的 sp2 情节相同。我有点困惑为什么多边形在绘制时看起来很好,但却导致了这些问题。

标签: r raster sf


【解决方案1】:

fasterize 包中的 fasterize 函数显然不会导致相同的错误。 Fasterize 也将被合并到 stars(see this issue) 中,它应该很快就会在 CRAN 上。

也不需要 st_cast 或 st_make_valid。

library(sf)
library(fasterize)

df <- readRDS('sp.rds') %>% st_sf(field = 1)
template <- raster('rasterTemplate_150km.tif')
r <- fasterize(df, template, field = 'field')
plot(r)

【讨论】:

    猜你喜欢
    • 2021-12-24
    • 2014-02-15
    • 2018-04-29
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2015-11-03
    相关资源
    最近更新 更多