NOAA API与marmap包疑问:离岸站点水深为何大于0?
关于marmap获取水深数据的问题解答
一、为什么会出现正值的“水深”?
- 这不是数据故障,是对NOAA水深数据定义的理解偏差:NOAA提供的地形数据中,正值代表陆地海拔(高于平均海平面),负值才代表海水深度(低于平均海平面)。
- 你的代码逻辑会放大这个问题:每个站点取了0.5×0.5度的矩形范围,再在范围内取一条对角transect求平均。如果站点靠近海岸线,这个范围很容易包含陆地区域,当transect里的陆地海拔数据(正值)被纳入平均计算后,最终结果就可能变成正值。
- 验证方法:把返回正值的站点坐标放到地图上查看,大概率是位于近岸、潮间带甚至陆地区域。
二、计算海面到海底的海水深度需要陆地海拔吗?
- 对于纯海域的位置:不需要。NOAA的水深数据本身就是以**平均海平面(MSL)**为基准的,负值的绝对值就是海面到海底的垂直距离。
- 对于近岸/可能包含陆地的区域:需要过滤掉陆地数据。你需要在计算平均时,只保留depth小于0的数值(即真正的海水深度数据),避免陆地海拔干扰结果。
代码改进建议
针对你的函数,修改平均计算部分,只统计海水深度数据:
library(marmap) retrieve_average_sea_depth <- function(longitude, latitude) { # 获取地形数据 longitude1 = longitude - 0.25 longitude2 = longitude + 0.25 latitude1 = latitude - 0.25 latitude2 = latitude + 0.25 bath_data = marmap::getNOAA.bathy(lon1 = longitude1, lon2 = longitude2, lat1 = latitude1, lat2 = latitude2) # 获取断面数据 transect_to_keep = get.transect(bath_data, x1 = longitude1+0.05, y1 = latitude1+0.05, x2 = longitude2-0.05, y2 = latitude2-0.05) # 仅计算负的水深值的平均值,排除陆地数据并忽略NA average_depth = mean(transect_to_keep$depth[transect_to_keep$depth < 0], na.rm = TRUE) return(average_depth) }
内容的提问来源于stack exchange,提问作者Abed
相关产品推荐
相关产品推荐

