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

如何为UTM投影的SpatRaster生成准确英里单位比例尺?

解决UTM投影下ggplot绘制准确英里比例尺的问题

针对你使用ggplot绘制SpatRaster(CRS:26913)时,英里比例尺显示错误、ggsn::scalebar报错的问题,以下是三种可行的解决方法:


方法1:修正annotation_scale参数设置

annotation_scale的plot_unit仅控制显示单位,实际数值转换需要明确原始数据单位并开启转换开关:

sat_2_fixed <- ggplot() +
  geom_spatraster_rgb(data = img) +
  annotation_scale(
    location = "bl",
    unit = "m",          # 明确数据的原始单位(UTM为米)
    plot_unit = "mi",    # 目标显示单位:英里
    transform = TRUE,    # 开启单位转换逻辑
    style = "ticks"
  ) +
  ggtitle("sat_2_fixed")

sat_2_fixed

关键说明:之前的错误是未指定unit="m"和transform=TRUE,导致函数未执行米到英里的转换,仅替换了单位标签。


方法2:用terra::sbar手动生成比例尺

通过terra::sbar直接计算并生成比例尺图形,再添加到ggplot中:

# 1. 计算比例尺参数
ext <- ext(img)
mi_to_m <- 1609.34  # 1英里≈1609.34米
sb <- terra::sbar(
  mi_to_m,
  type = "bar",
  divs = 4,
  below = "mi",
  cex = 0.8
)

# 2. 添加到ggplot
sat_terra <- ggplot() +
  geom_spatraster_rgb(data = img) +
  annotation_custom(
    grob = sb,
    xmin = ext[1] + 1000,  # 根据你的数据范围调整位置
    xmax = ext[1] + 1000 + mi_to_m * 4,
    ymin = ext[2] + 1000,
    ymax = ext[2] + 2000
  ) +
  ggtitle("sat_terra")

sat_terra

方法3:修复ggsn::scalebar报错

ggsn::scalebar不支持直接传入SpatRaster,需先将其转换为sf边界对象:

# 1. 将SpatRaster转换为sf边界
library(sf)
img_sf <- st_as_sfc(st_bbox(img))

# 2. 使用ggsn绘制比例尺
sat_3_fixed <- ggplot() +
  geom_spatraster_rgb(data = img) +
  ggsn::scalebar(
    data = img_sf,
    dist = 1,
    dist_unit = "mi",
    location = "bottomleft",
    transform = FALSE,  # UTM为投影坐标,无需地理转换
    model = "WGS84"
  ) +
  ggtitle("sat_3_fixed")

sat_3_fixed

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:45:29