【问题标题】:Rasterize error: Polygon to raster conversion produces horizontal lines栅格化错误:多边形到栅格转换会产生水平线
【发布时间】:2016-12-15 15:51:51
【问题描述】:

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

这是我正在使用的代码的通用示例(抱歉,我无法上传数据本身,因为它是专有的):

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
  • 太好了,谢谢@Bastien!我没有注意到它与岛屿重合,但现在看到你是绝对正确的。我会试试那个包。

标签: r vector mapping gis raster


【解决方案1】:

为了将其正式发布,以便将问题视为已回答,我将在此处复制我的评论回复。因此,您可以接受它。

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

另一种选择是尝试具有以下功能的 gdalUtils 包:gdal_rasterize。也许 gdal 对输入数据的要求不高。

【讨论】:

    【解决方案2】:

    我在对华盛顿州圣胡安群岛和毛伊岛的 TIGER 区域水数据进行栅格化时遇到了类似的问题 - 这两个空间多边形数据帧均采用由 Tigris 包返回的默认分辨率,使用由点定义的栅格纬度/经度相差 1 角秒。从似乎是陡峭的海岸线弯曲处开始有几条水平条纹。各种简化算法有所帮助,但不是可预测的,也不是完美的。

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

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

    【讨论】:

      【解决方案3】:

      根据我的经验,作为对这个问题的跟进。

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

      【讨论】:

      • 由于这是基于另一个答案的补充信息,它可能更适合作为对该答案的评论或编辑。
      猜你喜欢
      • 1970-01-01
      • 2016-06-07
      • 1970-01-01
      • 2019-03-21
      • 2021-10-19
      • 1970-01-01
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多