WGS84转UTM投影后geom_contour()无法生成等高线报错问题
问题原因及解决方法
核心问题:投影参数顺序错误
你使用terra::project时参数顺序搞反了,导致生成的UTM坐标无效(大概率是NA值),所以geom_contour找不到有效数据生成等高线。
terra::project的正确语法逻辑是:先指定要转换的坐标数据,再明确目标投影,最后补充原数据的投影(如果数据自带CRS信息可省略,但这里用矩阵输入必须指定)。你的代码把原投影参数放在了目标投影的位置,直接导致投影失败。
修正后的代码
require(marmap) bathy <- getNOAA.bathy(lon1 = -156.4 , lon2 = -156.95, lat1 = 20.55, lat2 = 21.05 , resolution = 1) bathy.df <- fortify(bathy) # 修正投影参数,明确原投影和目标投影 utm_coords <- terra::project( as.matrix(bathy.df[,c(1,2)]), to = "+proj=utm +zone=4 +north +units=km", from = "+proj=longlat +datum=WGS84" ) bathy.df <- cbind(bathy.df, as.data.frame(utm_coords)) colnames(bathy.df) <- c("x", "y", "z", "x.utm", "y.utm") require(ggplot2) # 经纬度版本(正常输出) ggplot(data=bathy.df, aes(x=x, y=y, z=z)) + geom_contour(binwidth=100) # UTM版本(现在可正常生成等高线) ggplot(data=bathy.df, aes(x=x.utm, y=y.utm, z=z)) + geom_contour(binwidth=100)
额外说明
- 你的研究区域属于北纬,UTM投影里加上
+north能避免歧义(不加默认也是北纬,但明确标注更稳妥)。 - 修正后可以先用
head(bathy.df)检查x.utm和y.utm列是否有有效值,确认无NA再执行绘图代码。
内容的提问来源于stack exchange,提问作者Anke
相关产品推荐
相关产品推荐

