Rasterize error: Polygon to raster conversion produces horizontal lines
Rasterize error: Polygon to raster conversion produces horizontal lines
我在 R 中使用 shapefile,我需要将其从多边形转换为栅格。虽然绘制时矢量看起来很完美,但当使用 'rasterize' 转换为光栅时,它们会产生错误的水平线。这是问题的示例:
这是我正在使用的代码的通用示例(抱歉,我无法上传数据本身,因为它是专有的):
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')
这似乎是源数据或栅格化功能的问题?有没有人见过这种错误?感谢您提供的任何建议。
为了使其正式化以便问题被视为已回答,我将在此处复制我的评论回复。因此你可以接受它。
当我看你的图时,在我看来,光栅中出现问题的线位于某些岛屿的同一纬度。尝试从您的数据集中删除这些岛屿。如果问题消失,您就会知道问题出在您的数据上,以及问题出在数据的哪个位置。
另一种选择是尝试具有以下功能的 gdalUtils 包:gdal_rasterize
。也许 gdal 在输入数据中不那么紧急。
我在栅格化华盛顿州圣胡安群岛以及毛伊岛的 TIGER 区域水数据时遇到了类似的问题 - 这两个空间多边形数据帧均采用由 Tigris 包使用定义的栅格返回的默认分辨率相隔 lat/lon 的 1 弧秒。有几条水平条纹从似乎是海岸线的急转弯处开始。各种简化算法有所帮助,但不是可预测的,也不是完美的。
试试 Velox 包,它在使用参考文献 类 时需要一些时间来适应。它可能有大小限制,因为它使用 Boost 几何库并在内存中工作。你不需要了解这一切,我不需要。它比 raster::rasterize 快(特别是对于大型和复杂的空间线数据帧),虽然我没有体验到声称的百倍加速,但我不会抱怨仅仅 10 或 20 倍的加速。最重要的是,velox$rasterize() 不会在我找到 raster::rasterize 的位置留下条纹!
我发现它会留下很多内存垃圾,并且在转换从 velox$rasterize 派生的大型 rasterLayers 时,运行 gc() 在以本机 R .grd 格式(在 INT1S 中)写入栅格之前很有帮助格式保存磁盘space)。
根据我的经验,作为对这个问题的跟进。
水平线是上述 'islands' 的结果。但是,仅当多边形为 'multi-part' 时才会发生。如果 'islands' 是不同的多边形而不是一个多边形的单独部分,则 raster:rasterize() 可以正常工作。
我在 R 中使用 shapefile,我需要将其从多边形转换为栅格。虽然绘制时矢量看起来很完美,但当使用 'rasterize' 转换为光栅时,它们会产生错误的水平线。这是问题的示例:
这是我正在使用的代码的通用示例(抱歉,我无法上传数据本身,因为它是专有的):
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')
这似乎是源数据或栅格化功能的问题?有没有人见过这种错误?感谢您提供的任何建议。
为了使其正式化以便问题被视为已回答,我将在此处复制我的评论回复。因此你可以接受它。
当我看你的图时,在我看来,光栅中出现问题的线位于某些岛屿的同一纬度。尝试从您的数据集中删除这些岛屿。如果问题消失,您就会知道问题出在您的数据上,以及问题出在数据的哪个位置。
另一种选择是尝试具有以下功能的 gdalUtils 包:gdal_rasterize
。也许 gdal 在输入数据中不那么紧急。
我在栅格化华盛顿州圣胡安群岛以及毛伊岛的 TIGER 区域水数据时遇到了类似的问题 - 这两个空间多边形数据帧均采用由 Tigris 包使用定义的栅格返回的默认分辨率相隔 lat/lon 的 1 弧秒。有几条水平条纹从似乎是海岸线的急转弯处开始。各种简化算法有所帮助,但不是可预测的,也不是完美的。
试试 Velox 包,它在使用参考文献 类 时需要一些时间来适应。它可能有大小限制,因为它使用 Boost 几何库并在内存中工作。你不需要了解这一切,我不需要。它比 raster::rasterize 快(特别是对于大型和复杂的空间线数据帧),虽然我没有体验到声称的百倍加速,但我不会抱怨仅仅 10 或 20 倍的加速。最重要的是,velox$rasterize() 不会在我找到 raster::rasterize 的位置留下条纹!
我发现它会留下很多内存垃圾,并且在转换从 velox$rasterize 派生的大型 rasterLayers 时,运行 gc() 在以本机 R .grd 格式(在 INT1S 中)写入栅格之前很有帮助格式保存磁盘space)。
根据我的经验,作为对这个问题的跟进。
水平线是上述 'islands' 的结果。但是,仅当多边形为 'multi-part' 时才会发生。如果 'islands' 是不同的多边形而不是一个多边形的单独部分,则 raster:rasterize() 可以正常工作。