如何为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
相关产品推荐
相关产品推荐

