如何在R语言tmap中实现地图指定区域的矩形框放大效果?
实现德国PLZ地图指定区域的矩形框放大效果
核心实现步骤
要完成指定位置的矩形框标注+局部放大效果,需完成三个关键操作:定位目标区域边界、在主图绘制放大框、生成并嵌入局部放大图。以下是基于你现有代码的完整实现方案:
完整代码示例
library(sf) library(dplyr) library(tmap) library(grid) # 读取数据并创建分组(复用原有代码) germany <- read_sf("data/OSM_PLZ.shp") germany <- germany %>% mutate(plz_groups = case_when( substr(plz, 1, 1) == "1" ~ "Group A", substr(plz, 2, 2) == "2" ~ "Group B", substr(plz, 3, 3) == "2" ~ "Group C", TRUE ~ "Group X" # 其余分组 )) # 1. 定位目标区域(以科隆PLZ 50667为例) target_plz <- "50667" target_area <- germany %>% filter(plz == target_plz) # 获取目标区域边界框并适当扩展(避免放大区域过于局促) target_bbox <- st_bbox(target_area) expanded_bbox <- st_bbox(c( xmin = target_bbox["xmin"] - 0.5, ymin = target_bbox["ymin"] - 0.5, xmax = target_bbox["xmax"] + 0.5, ymax = target_bbox["ymax"] + 0.5 ), crs = st_crs(germany)) # 将扩展后的边界框转为sf多边形(用于主图绘制放大框) zoom_box <- st_as_sfc(expanded_bbox) # 2. 绘制带矩形框的主图 map_de <- tm_shape(germany) + tm_fill(col = "plz_groups") + # 添加红色高亮放大框,自定义样式 tm_shape(zoom_box) + tm_borders(col = "red", lwd = 2, alpha = 0.8) + tm_layout(main.title = "德国PLZ分组地图", main.title.size = 1) # 3. 生成局部放大图(仅包含扩展边界内的PLZ区域) germany_zoomin <- germany %>% st_filter(expanded_bbox) map_zoomin <- tm_shape(germany_zoomin) + tm_fill(col = "plz_groups") + tm_borders(col = "white", lwd = 0.5) + tm_layout(title = "科隆区域放大", title.size = 0.8, frame = TRUE, frame.col = "red") # 4. 组合主图与放大图 print(map_de) print(map_zoomin, vp = viewport(x = 0.25, y = 0.25, width = 0.3, height = 0.3)) # 保存组合地图(可选) # tmap_save(map_de, "germany_plz_zoom.png", vp = viewport(x = 0.25, y = 0.25, width = 0.3, height = 0.3))
关键细节说明
- 边界扩展:调整
expanded_bbox的扩展数值,可以灵活控制放大区域的范围,避免仅显示单个PLZ区域过于狭窄。 - 矩形框样式:通过
tm_borders可自定义边框颜色、粗细和透明度,确保在主图上醒目且不遮挡原有图层。 - 放大图位置:
viewport的x/y参数控制放大图在主图中的位置(取值0-1,对应左下角到右上角),width/height控制尺寸,可根据需求自由调整。 - 精准区域过滤:使用
st_filter替代PLZ前缀过滤,能精准获取指定边界内的所有PLZ区域,适配任意位置的放大需求。
内容的提问来源于stack exchange,提问作者ulima2_
相关产品推荐
相关产品推荐

