ggplot2绘制空间地图时添加垂直边界线段问题排查
问题描述
需要在空间地图的边界上添加线段,运行下方代码后生成的线段为水平方向,不符合预期的垂直方向要求,无法定位错误来源。
library(ggplot2) library(dplyr) library(sp) library(sf) library(raster) # 获取印度卡纳塔克邦地图数据 kn_sf <- getData("GADM", country = "IND", level = 2) %>% st_as_sf() %>% filter(NAME_1 == "Karnataka") # 待绘制线段的经纬度数据(预期绘制卡纳塔克邦西部外围的海岸线) kncoast <- data.frame(orig_lat=12.7571, orig_lon=74.87461, dest_lat=12.77404, dest_lon=77.16021) # 绘图 kn_sf %>% ggplot()+ geom_sf()+ geom_segment(data = kncoast, aes(x = orig_lon, y = orig_lat, xend = dest_lon, yend = dest_lat), color="red", size=1) + coord_sf()
代码运行效果如下:
错误原因
问题出在手动设置的线段终点坐标错误,和绘图函数无关:
- 预期绘制的是卡纳塔克邦西部的南北向(垂直)海岸线,该区域经度稳定在74.8°E-75°E区间,应该通过纬度变化实现南北延伸
- 当前设置的终点经度
dest_lon=77.16021已经偏移到卡纳塔克邦东部区域,和起点经度差超过2°,但两点纬度差仅0.017°,经度变化幅度远大于纬度变化幅度,自然会画出东西走向的水平线段。
修正方案
调整线段的终点坐标,保持经度和起点基本一致(对应西部沿海位置),拉大纬度差值实现南北向的垂直效果,参考修正后的坐标配置:
# 修正后的线段坐标:经度匹配西部沿海位置,纬度南北延伸 kncoast <- data.frame(orig_lat=12.7571, orig_lon=74.87461, dest_lat=14.77404, dest_lon=74.86021)
如果需要绘制和实际岸线完全贴合的线段,不建议手动输入经纬度,直接从卡纳塔克邦的sf边界对象中提取西部临海的边界线要素绘制即可,能避免手动输坐标产生的点位偏移问题。
内容的提问来源于stack exchange,提问作者Prasanna S
相关产品推荐
相关产品推荐

