R语言中CRS与地图投影的核心误解及格陵兰制图需求
格陵兰地图投影与经纬线标注解决方案
一、CRS与地图投影核心逻辑
先明确两个核心概念:
- 地理CRS:比如WGS84(EPSG:4326),用经纬度描述球面坐标,默认渲染时经纬线是直的,但这是球面强行展开的平面假象,不适合格陵兰这类大区域的精准展示。
- 投影CRS:将球面坐标转换为平面坐标的算法,不同投影适配不同区域。格陵兰常用EPSG:3413(格陵兰兰伯特方位投影),这个投影会让经纬线呈现弯曲、斜向的形态,贴合格陵兰的地理轮廓。
在R的sf和ggplot2中,核心逻辑是:先获取地理CRS的原始矢量数据,再转换到目标投影CRS,最后通过coord_sf指定投影规则,让地图和经纬线都遵循该投影渲染。
二、分步实现代码
1. 加载依赖与基础数据
沿用你提供的基础代码,先获取格陵兰的sf格式数据:
library(rnaturalearth) library(rnaturalearthdata) library(ggplot2) library(sf) # 获取格陵兰矢量数据(默认地理CRS:EPSG:4326) gl <- ne_countries(scale = "large", country = "Greenland", returnclass = "sf")
2. 转换投影并添加弯曲经纬线
将格陵兰数据转换到EPSG:3413,再在ggplot中指定投影并生成适配的经纬线:
# 转换到格陵兰专用投影 gl_proj <- st_transform(gl, crs = 3413) # 绘制带弯曲经纬线的地图 ggplot() + geom_sf(data = gl_proj, fill = "white", color = "black") + # 指定投影,设置经纬线间隔(经度每10度,纬度每5度) coord_sf( crs = st_crs(3413), graticule = seq(-180, 180, 10), lat_graticule = seq(60, 90, 5) ) + theme_bw() + labs(title = "格陵兰地图(带弯曲经纬线)")
此时经纬线会呈现符合格陵兰投影的弯曲、斜向形态,这是因为EPSG:3413是为格陵兰定制的投影,能更准确展示其地理范围。
3. 添加指定经度的虚线区域
生成经度60/62/64/66/68的竖线,转换到目标投影后用虚线标注:
# 创建经度线的sf对象(先基于地理CRS创建,再转换投影) lon_lines <- st_sfc( st_linestring(rbind(c(60, 60), c(60, 90))), st_linestring(rbind(c(62, 60), c(62, 90))), st_linestring(rbind(c(64, 60), c(64, 90))), st_linestring(rbind(c(66, 60), c(66, 90))), st_linestring(rbind(c(68, 60), c(68, 90))) ) %>% st_sf(crs = 4326) %>% # 初始地理CRS st_transform(3413) # 转换到格陵兰投影 # 整合到地图中 ggplot() + geom_sf(data = gl_proj, fill = "white", color = "black") + geom_sf(data = lon_lines, linetype = "dashed", color = "darkred", linewidth = 0.8) + coord_sf( crs = st_crs(3413), graticule = seq(-180, 180, 10), lat_graticule = seq(60, 90, 5) ) + theme_bw() + labs(title = "格陵兰地图(标注指定经度虚线)")
三、关键注意事项
- 所有空间数据(包括经纬线、标注线)必须统一到同一个投影CRS下,否则无法正确叠加显示。
- 若需要其他投影,可替换EPSG代码(比如EPSG:3035适合欧洲,但格陵兰用3413效果最佳)。
内容的提问来源于stack exchange,提问作者Fish_Person
相关产品推荐
相关产品推荐

