R语言下使用UTM坐标与国土shapefile绘制城镇点位的方法咨询
核心结论
完全可以直接用UTM坐标在R中绘制城镇点位,只要保证点位数据和shapefile的坐标参考系统一即可。你当前代码跑不通主要是几个常见的新手操作误区,按下面的流程调整就能正常出图。
你现有代码的常见踩坑点
- 列名不匹配:你读入的坐标表列名是带拼写错误的“UTM Cordinates”“UTM Cordinaetes”,代码里
geom_point(aes(x=Easting,y=Northing))调用的列名在实际数据里根本不存在,会直接报找不到列的错误。 - 没有给点位设置坐标参考系:UTM是投影坐标系,不是普通的数值坐标,必须给点位明确标注对应的UTM带号、南北半球属性,才能和shapefile做空间叠加。
- 函数用错:
ggmap(Shapefile)是无效调用,ggmap的作用是拉取在线底图,不能直接读取本地shapefile作为绘图输入。 - 映射参数错误:
geom_point(aes(..., col=Cordinates))里把整个坐标数据框对象Cordinates作为颜色映射输入,颜色映射必须指向数据框内的具体字段(比如城镇名、城镇规模这类列)才能正常生效。 - 忽略坐标等比例设置:UTM属于平面投影坐标,绘图时如果不锁定等比例坐标轴,地图和点位会出现拉伸变形。
完整可复现的操作流程
1. 规整并读入坐标数据
读入csv文件后先把混乱的列名改成方便调用的名称,同时确认坐标列是数值型而非文本格式:
# 读入存储城镇坐标的csv文件 coords_df <- read.csv(file.choose(), header = TRUE) # 按实际字段顺序重命名列:城镇名称、UTM东向值、UTM北向值 names(coords_df) <- c("town_name", "easting", "northing") # 检查数据结构,确认easting、northing是数值类型 str(coords_df)
前置准备:提前确认你研究区域对应的UTM带号,比如某区域属于UTM 30N分区,就对应固定的EPSG编码32630;南半球对应分区的EPSG编码为327xx,这个编码是设置投影的核心依据。
2. 把普通坐标表转成空间点位对象
用你已经加载的sp包完成坐标绑定和投影设置:
# 指定数据框里的东向、北向列作为点位坐标 coordinates(coords_df) <- ~ easting + northing # 给点位对象设置对应的UTM投影,把EPSG编码替换成你实际的分区值 proj4string(coords_df) <- CRS("+init=EPSG:326XX")
3. 读入shapefile并做投影对齐
这一步是最容易出问题的环节,必须保证点位和shapefile的投影完全一致,否则会出现点位全图外飘的情况:
# 读入国家边界shapefile country_shp <- readOGR(dsn = file.choose()) # 打印shapefile的投影信息,和点位的投影做比对 proj4string(country_shp) # 如果两者投影不一致,把点位转换到和shapefile完全一致的坐标系下 coords_trans <- spTransform(coords_df, CRSobj = proj4string(country_shp))
4. 绘图验证
- 用基础绘图快速校验点位是否落在正确位置:
# 先画国家边界作为底图 plot(country_shp) # 叠加红色的城镇点位 points(coords_trans, col = "red", pch = 16, cex = 1.5) # 给点位加上城镇名称标注 text(coords_trans, labels = coords_trans$town_name, pos = 3, cex = 0.8)
- 如果用ggplot2做正式绘图,不要强行用ggmap加载shapefile,直接按图层叠加即可:
library(ggplot2) # 把shapefile转成ggplot兼容的格式 shp_base <- fortify(country_shp) # 把点位转成普通数据框 point_df <- as.data.frame(coords_trans) ggplot() + # 绘制国家边界面图层 geom_polygon( data = shp_base, aes(x = long, y = lat, group = group), fill = "#f0f0f0", color = "white" ) + # 绘制城镇点位图层 geom_point( data = point_df, aes(x = easting, y = northing), color = "#d9534f", size = 3 ) + # 锁定等比例坐标轴,避免UTM投影变形 coord_equal()
内容的提问来源于stack exchange,提问作者user15473160
相关产品推荐
相关产品推荐

