如何叠加三个Shapefile制作地图及解决新西兰地图显示问题
解决Shapefile图层叠加与新西兰地图显示问题
(i) 分层叠加三个Shapefile图层
用ggplot2配合sf包就能实现图层叠加,核心是按顺序调用geom_sf()添加每个图层,同时通过样式参数区分不同图层。示例代码如下:
library(ggplot2) library(sf) # 二次确认所有图层坐标参考系一致(你已转成EPSG:2193) qmasp <- st_transform(qmasp, crs = 2193) statShp <- st_transform(statShp, crs = 2193) NE_countries <- st_transform(NE_countries, crs = 2193) # 绘制叠加地图 ggplot() + # 底层:全球国家(后续可优化为仅新西兰) geom_sf(data = NE_countries, fill = "lightgray", color = "black") + # 中层:岩龙虾统计区域 geom_sf(data = statShp, fill = "transparent", color = "blue", linetype = 2) + # 上层:岩龙虾QMA区域 geom_sf(data = qmasp, fill = "orange", alpha = 0.3, color = "darkorange") + labs(title = "新西兰岩龙虾相关区域叠加图") + theme_minimal()
- 图层顺序:先添加的图层在底层,后添加的在上层,可根据需求调整顺序
- 样式参数:通过
fill(填充色)、color(边界色)、alpha(透明度)、linetype(线型)区分图层,避免遮挡
(ii) 解决新西兰地图过小及保留查塔姆岛的问题
原因
你使用的ne_110m_admin_0_countries是全球国家数据集,默认绘图范围会包含全球所有区域,导致新西兰(含查塔姆岛)被压缩得极小。
解决方法
方法1:筛选新西兰子集
直接从全球数据中提取新西兰的几何对象,绘图时仅使用这个子集,系统会自动聚焦新西兰区域,同时包含查塔姆岛:
# 筛选新西兰区域 nz <- NE_countries[NE_countries$NAME == "New Zealand", ] # 后续绘图用nz代替NE_countries即可
方法2:手动设置绘图范围
如果需要保留其他区域但聚焦新西兰,可通过coord_sf()手动指定坐标范围,确保包含查塔姆岛(查塔姆岛对应EPSG:2193的大致坐标为x≈1700000,y≈500000)。示例:
# 获取所有目标图层的边界框,扩展10%确保覆盖查塔姆岛 target_bbox <- st_bbox(c(qmasp, statShp, nz)) x_range <- c(target_bbox["xmin"] * 0.9, target_bbox["xmax"] * 1.1) y_range <- c(target_bbox["ymin"] * 0.9, target_bbox["ymax"] * 1.1) # 在绘图代码中添加范围限制 ggplot() + geom_sf(data = nz, fill = "lightgray", color = "black") + geom_sf(data = statShp, fill = "transparent", color = "blue", linetype = 2) + geom_sf(data = qmasp, fill = "orange", alpha = 0.3, color = "darkorange") + coord_sf(xlim = x_range, ylim = y_range) + labs(title = "新西兰岩龙虾相关区域叠加图(含查塔姆岛)") + theme_minimal()
内容的提问来源于stack exchange,提问作者Angela Russell
相关产品推荐
相关产品推荐

