R 光栅化错误:多边形到光栅的转换生成水平线

R 光栅化错误:多边形到光栅的转换生成水平线,r,vector,mapping,gis,raster,R,Vector,Mapping,Gis,Raster,我正在使用R中的形状文件,需要将其从多边形转换为光栅。虽然矢量在打印时看起来很完美,但当使用“光栅化”转换为光栅时,它们会产生错误的水平线。以下是问题的一个示例: 下面是我正在使用的代码的一般示例(很抱歉,我无法上载数据本身,因为它是专有的): spdf.dat为了使其正式化,以便该问题被认为已得到回答,我将在此处复制我的评论回复。你可以接受 当我看你的图时,在我看来,光栅中出现问题的线条位于某些岛屿的同一纬度。尝试从数据集中删除这些孤岛。如果问题消失了,您将知道您的数据就是问题所在,以及问

我正在使用R中的形状文件,需要将其从多边形转换为光栅。虽然矢量在打印时看起来很完美,但当使用“光栅化”转换为光栅时,它们会产生错误的水平线。以下是问题的一个示例:

下面是我正在使用的代码的一般示例(很抱歉,我无法上载数据本身,因为它是专有的):


spdf.dat为了使其正式化,以便该问题被认为已得到回答,我将在此处复制我的评论回复。你可以接受


当我看你的图时,在我看来,光栅中出现问题的线条位于某些岛屿的同一纬度。尝试从数据集中删除这些孤岛。如果问题消失了,您将知道您的数据就是问题所在,以及问题所在


另一个选项是尝试gdalUtils包,该包有一个函数:
gdal\u rasterize
。也许gdal对输入数据的要求不太高。

我在光栅化华盛顿州圣胡安群岛以及毛伊岛的老虎区域水域数据时遇到了类似的问题-这两个空间多边形数据帧都是使用lat/lon间隔1弧秒的点定义的光栅,以包Tigris返回的默认分辨率。从海岸线的急弯处开始有几条水平条纹。各种简化算法有所帮助,但不可预测,也不完美

试试Velox包,它需要一些时间来适应它使用的引用类。它可能有大小限制,因为它使用Boost几何体库并在内存中工作。你不需要全部理解,我不需要。与raster::rasterize(特别是对于大型和复杂的空间线数据帧)相比,它速度很快,尽管我没有经历过声称的100倍的加速,但我不会抱怨仅仅是10或20倍的加速。最重要的是,velox$rasterize()不会在我找到的raster::rasterize所在的位置留下条纹


我发现它会留下大量内存垃圾,当转换从velox$rasterize派生的大型Rasterlayer时,在以原生R.grd格式(INT1S格式以节省磁盘空间)写入光栅之前,运行gc()会很有帮助

根据我的经验,作为这个问题的后续


水平线是上述“岛屿”的结果。但是,仅当多边形是“多部分”时才会发生。如果“孤岛”是不同的多边形,而不是一个多边形的单独部分,则raster:rasterize()可以正常工作。

我已经用我的数据尝试了您的代码,它的性能良好。我觉得你的代码很好。也许你的数据有问题?试着使用另一个数据集。当我看到你的图形时,我觉得光栅中出现问题的线条位于某些岛屿的同一纬度。尝试从数据集中删除这些孤岛。如果问题消失,您将知道您的数据就是问题所在,问题出在您的数据中。您可能希望尝试gdalUtils软件包,该软件包具有以下功能:
gdal\u rasterize
太好了,谢谢@Bastien!我没有注意到它与岛屿重合,但现在看到你是绝对正确的。我会试试这个软件包。因为这是基于另一个答案的补充信息,它可能更适合作为对该答案的评论或编辑。
spdf.dat <- readOGR("directory here", "layer here")

# Plot polygon
plot(spdf.dat, col = 'dimgrey', border = 'black')

# Extract boundaries
ext <- extent(spdf.dat)

# Set resolution for rasterization
res <- 1 

# determine no. of columns from extents and resolution
yrow <- round((ext@ymax - ext@ymin) / res)
xcol  <- round((ext@xmax - ext@xmin) / res)

# Rasterize base
rast.base <- raster(ext, yrow, xcol, crs = projection(spdf.dat))

# Rasterize substrate polygons
rast <- rasterize(spdf.dat, rast.base, field = 1, fun = 'min', progress='text')
plot(rast, col = 'dimgrey')