【发布时间】:2018-08-25 20:46:36
【问题描述】:
我使用sf 和raster 包对许多空间多边形进行栅格化。它的效果很好,除了这种情况,我对如何解决问题没有任何想法:
我有一个作为简单要素多边形的多边形和一个栅格模板。两者都已转换为等面积贝尔曼投影。多边形存在几何有效性问题,我使用 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,但这也不能解决问题。
【问题讨论】:
-
不确定到底是什么问题,但也许可以试试
sp3 <- st_cast("POLYGON") <- 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 <- st_cast(sp2, "POLYGON")、sp4 <- as(sp3, 'Spatial')和cover <- rasterize(sp4, rasterTemplate, getCover=TRUE),但我通过澳大利亚的酒吧得到了相同的结果。 -
嗯。不为
st_is_valid返回TRUE会阻止rasterize或as('Spatial')工作吗?如果您使用st_buffer(sp, 0.0)而不是st_make_valid的“技巧”怎么办?sp3的剧情是怎样的? -
@CalumYou,尽管存在有效性问题,但实际上一切都使用
sp运行。换句话说,到目前为止,光栅化问题无论如何都会出现。sp3看起来与我上面的 sp2 情节相同。我有点困惑为什么多边形在绘制时看起来很好,但却导致了这些问题。