我正在使用 ggspatial 在 UTM 投影中绘制地图。地图以正确的投影绘制,但轴标签仍然是经纬度。我想在轴上显示 UTM 坐标。
所需输出: 德国地图,在 x 和 y 轴上显示以公里为单位的 UTM 坐标
示例代码:
require(tidyverse); require(magrittr); require(raster); require(rworldmap); require(ggspatial)
targetcrs = "+proj=utm +datum=WGS84 +no_defs +zone=32 +units=km"
countriesLow %>% subset(ADMIN == 'Germany') %>% spTransform(targetcrs) -> de
de %>% extent %>% as('SpatialPolygons') -> bbox
crs(bbox) <- targetcrs
ggplot() + coord_sf(crs=targetcrs) + layer_spatial(de) + layer_spatial(bbox, fill=NA) -> p
print(p)
结果输出: UTM 投影中的德国地图,但网格线和轴标签以经纬度表示
您可以从边界框显示为具有直边的矩形这一事实轻松看出,空间对象被绘制在预期的投影中。
调用 ggplot 时,控制台会打印一条警告:
Coordinate system already present. Adding new coordinate system, which will replace the existing one.
但是,当我检查 ggplot 对象时,没有 crs 信息:
> p$coordinates$crs
NULL
上面的“所需输出”是用 spplot 生成的:
spplot(de[,1], sp.layout=list('sp.lines', bbox), scales=list(draw=T))
但是,还有其他原因不使用 graphics::plot、sp::spplot 或其他替代方法,除非确实无法使用 ggspatial 解决这个看似简单的问题。
我曾尝试阅读 ggspatial 文档,该文档说绘图 CRS 由 coord_sf 设置或默认为第一层空间的 CRS,但这不是正在发生的事情。我曾尝试过玩耍并在谷歌上搜索解决方案,但不知所措。
一种可能的方法是为 x 和 y 创建自定义比例,使用自定义标签和中断,或者取消网格线或使用 annotation_spatial_hline() 和 vline 创建它们。但是我希望有一个简单的解决方法。