R语言ggplot+geom_sf合并绘制两个sf空间地图异常问题
geom_sf多图层叠加失败(单图层可正常绘制、CRS一致)的排查方案
两个sf对象单画正常、叠加异常,且确认CRS完全一致时,按以下优先级排查:
- 最高发原因:底层图层不透明填充覆盖上层要素
绝大多数行政边界ward_boundaries是面(polygon)要素,geom_sf对面要素默认带实色填充,如果先绘制边界层,不透明的填充会把后加的final_data_sf要素完全盖住,看起来就像绘制异常。
直接运行以下测试代码验证:把边界层填充设为全透明,仅保留边框,同时明确图层绘制顺序(边界放最底层)ggplot() + # 底层:行政边界,无填充、仅显示黑色边框 geom_sf(data = ward_boundaries, fill = NA, color = "black", linewidth = 0.5) + # 上层:业务数据,可自行设置颜色、大小等样式 geom_sf(data = final_data_sf, color = "#d62728", size = 1) - 第二高发原因:CRS标签一致但实际坐标范围不匹配
不要只看CRS字符串是否相同,要直接核对两个对象的实际坐标范围,单独运行以下命令查看边界框:
如果两个对象返回的x/y坐标值差出1个以上数量级(比如一个是-180~180的经纬度值,一个是几十万到上百万的投影坐标米值),说明其中一个对象的CRS只是标签被误设为一致,实际坐标参考系根本不匹配。单图层绘制时ggplot会自动适配单图层的坐标范围所以显示正常,叠加时会取两个图层的合并边界框,坐标量级小的图层会被缩成几乎不可见的点/线。sf::st_bbox(final_data_sf) sf::st_bbox(ward_boundaries)
这种情况不要直接修改CRS标签,用坐标正确的对象做参考做坐标转换即可:# 假设ward_boundaries坐标是正确的,转换final_data_sf final_data_sf <- sf::st_transform(final_data_sf, crs = sf::st_crs(ward_boundaries)) - 次要原因:存在无效几何
单图层绘制时geom_sf会自动容错修正轻微的几何错误,多图层叠加时几何校验逻辑更严格,会出现显示异常。运行以下命令修复两个对象的无效几何即可:ward_boundaries <- sf::st_make_valid(ward_boundaries) final_data_sf <- sf::st_make_valid(final_data_sf)
优先测试第一个填充透明的方案,80%以上的同类问题都是不透明填充遮挡导致的。
内容的提问来源于stack exchange,提问作者Dilpreet Singh
相关产品推荐
相关产品推荐

