导致不正确光栅化的神秘多边形问题

Cryptic polygon issue leading to incorrect rasterization

我有一些正在栅格化的空间多边形,使用 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 <- as(st_cast(sp, "POLYGON"), 'Spatial')。同样的光栅化问题仍然存在。

我也试过用sp5 <- as(st_buffer(sp, dist = 0), 'Spatial')缓冲0,但这也没有解决问题。

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

fasterize package apparently does not cause the same error. Fasterize will also be incorporated into the stars package (see this issue) 的 fasterize 函数应该很快就会在 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)