使用geom_sf绘制的地图出现倾斜 如何调整使其与坐标轴对齐
该需求完全可以实现,你遇到的地图倾斜是选用的ESRI:102003投影的特性导致的:该CRS是面向北美大陆设计的正轴等面积割圆锥投影,默认的中央经线、标准纬线参数适配北美大范围区域,仅绘制波多黎各这类小范围区域时就会出现明显倾斜。
你可以根据需求选择以下两种解决方案:
- 方案1:更换适配小区域的横轴墨卡托投影
你研究的波多黎各区域适配UTM 20N投影(EPSG:32620),该投影为横轴墨卡托投影,局部区域使用时地图会自然和坐标轴对齐,仅需替换coord_sf的CRS参数即可,修改后代码示例如下:
ggplot(data = PR)+ geom_sf(fill = "lightgray", col = "black", show.legend = F)+ scale_fill_identity()+ theme(panel.grid.major = element_line(color = "gray", linetype = "dashed", size = 0.5), panel.background = element_rect(fill = "aliceblue"))+ annotation_raster(img, # 注意:更换CRS后需要把原来的经纬度范围转换成对应投影的平面坐标再填入 ymin = 转换后的纬度最小值, ymax = 转换后的纬度最大值, xmin = 转换后的经度最小值, xmax = 转换后的经度最大值)+ geom_star(data = eulophia_transformed_with_lat_lon, mapping = aes(X,Y), col = "black", fill = "red", shape = 1, size = 2.5)+ coord_sf(crs = "EPSG:32620")
注意:如果你的eulophia_transformed_with_lat_lon中的X、Y是WGS84经纬度,建议先将其转为sf对象并指定CRS为4326,ggplot会自动完成投影转换,避免点位偏移。
- 方案2:自定义阿尔伯斯投影参数,保留原投影类型
如果你需要保留阿尔伯斯等面积投影的特性,可以自定义适配研究区域的投影参数,将中央经线、标准纬线设置为你研究区的对应经纬度即可,示例如下:
# 自定义适配波多黎各区域的阿尔伯斯投影,lon_0设为区域中心经度,lat_1、lat_2设为区域南北界 custom_crs <- "+proj=aea +lat_1=17.5 +lat_2=18.5 +lon_0=-67 +datum=WGS84 +units=m +no_defs" ggplot(data = PR)+ geom_sf(fill = "lightgray", col = "black", show.legend = F)+ scale_fill_identity()+ theme(panel.grid.major = element_line(color = "gray", linetype = "dashed", size = 0.5), panel.background = element_rect(fill = "aliceblue"))+ annotation_raster(img, ymin = 转换后的纬度最小值, ymax = 转换后的纬度最大值, xmin = 转换后的经度最小值, xmax = 转换后的经度最大值)+ geom_star(data = eulophia_transformed_with_lat_lon, mapping = aes(X,Y), col = "black", fill = "red", shape = 1, size = 2.5)+ coord_sf(crs = custom_crs, lims_method = "geometry_bbox")
添加lims_method = "geometry_bbox"参数可以强制坐标轴适配你的数据边界,消除多余留白导致的视觉倾斜。
内容的提问来源于stack exchange,提问作者Normandie
相关产品推荐
相关产品推荐

