R语言rasterize栅格化时封闭区域误识别问题求助
解决栅格化shapefile时封闭区域被误填充的问题
这个问题我之前也碰到过!核心原因是raster::rasterize()处理多边形要素时,会默认填充整个多边形的内部区域——如果你的道路要素被误存为闭合多边形(而不是线要素),就会出现把封闭区域全部填满的情况。下面给你几个针对性的解决方案:
1. 先确认你的要素类型
首先要搞清楚shape对象到底是线要素还是多边形要素,这是问题的关键:
# 用sf包检查几何类型(如果还没转成sf对象,先转换) library(sf) shape_sf <- st_as_sf(shape) print(st_geometry_type(shape_sf))
如果输出是POLYGON或者MULTIPOLYGON,那问题就出在这儿——道路应该用线要素(LINESTRING)来存储,而不是多边形。
2. 多边形转线要素(最直接的修复)
如果你的道路本来应该是线,只是被误存为多边形,直接把多边形转成线要素再栅格化即可:
# 将多边形转为线要素 shape_lines <- st_cast(shape_sf, "LINESTRING") # 重新执行栅格化 rasterized_roads <- raster::rasterize(shape_lines, r, field = as.numeric(shape_lines$number))
这样栅格化后只会标记道路线条经过的栅格单元,不会填充封闭区域。
3. 保留多边形但挖空内部区域
如果你确实需要用多边形来表示道路(比如带宽度的道路面),但要避免填充封闭的内部区域,可以给多边形添加内部洞:
# 先修复可能的几何错误 shape_valid <- st_make_valid(shape_sf) # 假设道路宽度为5个投影单位,生成内部洞 road_width <- 5 shape_hole <- st_buffer(shape_valid, -road_width/2) # 用原多边形减去内部洞,得到带空心的道路多边形 shape_road_with_hole <- st_difference(shape_valid, shape_hole) # 栅格化带洞的多边形 rasterized_roads <- raster::rasterize(shape_road_with_hole, r, field = as.numeric(shape_road_with_hole$number))
这个方法会保留道路的宽度,同时排除封闭区域的内部。
4. 提取道路中心线再栅格化
如果你的道路多边形是宽幅面,而你只需要栅格化道路的中心线,可以用中心线提取工具:
# 提取道路多边形的近似中心线 library(lwgeom) shape_centerlines <- st_approx_medial_axis(shape_valid) # 栅格化中心线 rasterized_roads <- raster::rasterize(shape_centerlines, r, field = as.numeric(shape_valid$number))
内容的提问来源于stack exchange,提问作者Daan
相关产品推荐
相关产品推荐

