You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用tmap为内嵌地图添加合适的比例尺

问题描述

使用tmap制作地图时,尝试为内嵌地图(inset map)添加比例尺但始终无法显示,相关代码如下:

main_map <- tmap::tm_shape(main_map_df) +
  tmap::tm_polygons(
    col = "var.q5",
    palette = c("#CCCCCC", "#999999", "#666666", "#333333", "#000000"),
    lwd = 0.5,
    title = "") +
  tmap::tm_layout(
    frame = FALSE,
    legend.outside = TRUE,
    legend.hist.width = 5,
    legend.text.size = 0.5,
    fontfamily = "Verdana") +
  tmap::tm_scale_bar(
    position = c("LEFT", "BOTTOM"),
    breaks = c(0, 10, 20),
    text.size = 0.5
    ) +
  tmap::tm_compass(position = c("LEFT", "TOP")) 

inset_map <- tmap::tm_shape(inset_map_df) +
  tmap::tm_polygons() +
  tmap::tm_shape(main_map_df) +
  tm_fill("grey50") +
  tmap::tm_scale_bar(
    position = c("LEFT", "BOTTOM"),
    breaks = c(0, 10, 20),
    text.size = 0.5
  )

# Combine crude rate map (inset + main) =====

tiff(
  "main_map_w_iset.tiff",
  height = 1200,
  width = 1100,
  compression = "lzw",
  res = 300
  )
main_map
print(
  inset_map,
  vp = viewport(
    x = 0.7, 
    y = 0.18, 
    width = 0.3, 
    height = 0.3,
    clip = "off")
  )
dev.off()
解决方案

内嵌地图比例尺不显示的核心原因是未设置独立布局参数,且比例尺刻度可能与内嵌地图范围不匹配。可通过以下两点修改解决:

  • 给内嵌地图添加tm_layout,关闭边框和图例,确保元素适配内嵌尺寸
  • 根据内嵌地图的实际范围调整比例尺刻度值(若内嵌是更大范围的地图,需放大刻度)
修改后的完整代码
main_map <- tmap::tm_shape(main_map_df) +
  tmap::tm_polygons(
    col = "var.q5",
    palette = c("#CCCCCC", "#999999", "#666666", "#333333", "#000000"),
    lwd = 0.5,
    title = "") +
  tmap::tm_layout(
    frame = FALSE,
    legend.outside = TRUE,
    legend.hist.width = 5,
    legend.text.size = 0.5,
    fontfamily = "Verdana") +
  tmap::tm_scale_bar(
    position = c("LEFT", "BOTTOM"),
    breaks = c(0, 10, 20),
    text.size = 0.5
    ) +
  tmap::tm_compass(position = c("LEFT", "TOP")) 

inset_map <- tmap::tm_shape(inset_map_df) +
  tmap::tm_polygons() +
  tmap::tm_shape(main_map_df) +
  tm_fill("grey50") +
  tmap::tm_scale_bar(
    position = c("LEFT", "BOTTOM"),
    # 根据内嵌地图范围调整刻度,示例用0, 50, 100,可按需修改
    breaks = c(0, 50, 100),
    text.size = 0.4  # 缩小文字适配内嵌尺寸
  ) +
  tmap::tm_layout(
    frame = FALSE,
    legend.show = FALSE,  # 内嵌地图不需要图例
    fontfamily = "Verdana"
  )

# 组合地图并导出
tiff(
  "main_map_w_iset.tiff",
  height = 1200,
  width = 1100,
  compression = "lzw",
  res = 300
)
main_map
print(
  inset_map,
  vp = grid::viewport(
    x = 0.7, 
    y = 0.18, 
    width = 0.3, 
    height = 0.3,
    clip = "off"
  )
)
dev.off()
关键说明
  1. 内嵌地图的比例尺刻度必须匹配其实际地理范围:如果内嵌是比主图大得多的区域(比如主图是市区,内嵌是全省),用0,10,20这类小刻度会导致比例尺无法正常渲染,需换成对应范围的刻度值。
  2. tm_layout的legend.show=FALSE避免内嵌地图的图例干扰主图,同时减少布局冲突。
  3. 缩小比例尺的text.size,确保文字能完整显示在小尺寸的内嵌地图中。

内容的提问来源于stack exchange,提问作者Meo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:35:20