[数据处理] 从FVCOM网格提取边界

[复制链接]

大家好!第5期,和大家一起交流一下如何从FVCOM网格提取边界信息。

三角形网格是FVCOM最特别的地方,构建三角形网格也是我们使用FVCOM最开始需要做的工作。一般的,通过SMS软件构建三角形网格,我们会得到一个2dm文件,里面会包含每个网格点的坐标以及nv矩阵。nv矩阵是一个二维矩阵(nele*2,nele为三角形个数),里面包含了每个三角元三个顶点的网格点id。如果不考虑开边界信息,有这三个数据,我们就可以绘制完整的三角形网格。

然而,针对某些问题,我们需要对这三个变量进行处理,提取网格的边界信息。比如,涉及从FVCOM区域向更大区域(比如WRF模拟区域)插值时,我们希望只让落在FVCOM区域内的网格点进行插值,而区域外的网格点保持原值。这时,我们就需要使用网格的边界信息,区分FVCOM区域内和区域外的点,进行不同的计算。

为找出FVCOM网格的边界,lon,lat(或x,y)和nv三个变量就足够解决以上问题了。大体的思路是,将nv转换成nele*3条线段,其中,FVCOM的边界线段,只出现了一次;而区域内部线段出现了两次。

通过这个区分边界线段和内部线段的条件,我们还可以优化网格画图程序。一般的,在画FVCOM三角形网格图时,我们会写循环,把每个三角形的三条边都画一遍。然而,在这个过程中,内部线段都被画了两遍,由于内部线段的个数往往远大于边界线段,这种方法使得画图时间慢了大约1倍。所以,我们可以使用这个判断条件,让每条线段只画一遍。

下面以NECOFS(The Northeast Coastal Ocean Forecast System)的网格为例,展示一下通过这种方法得到的结果。下图中,黑线表示NECOFS的GOM(Gulf of Maine)网格边界。随机生成该经纬度范围内的2000个点,根据边界信息,我们可以判断出GOM区域内的点(红色)和区域外的点(蓝色)。

d8cb0c354e352c9493438b89030f45f9.png

另外,我们看到,在模型区域内部,有几处岛屿,它们的轮廓线也应是边界。下图为放大长岛后的效果。可以看到,有两个随机点落在了长岛上,这两个点被大边界和长岛边界双重包围,它们的颜色依然是蓝色,即区域外。实现这一结果的方法是,将区域大边界的网格点按顺时针顺序排列,而内部的岛屿边界按相反的逆时针顺序排列,再使用MATLAB中的inpolygon命令进行判断即可。

1e73a1285664f8f95fd2d6f7b6b24789.png

感兴趣的朋友可以下载我的程序试一下。我把程序放在了腾讯微云上:

https://share.weiyun.com/ee26c04e23e2f12dd27f69556f3a3313

NECOFS的网格信息请从NECOFS网站下载:

http://www.smast.umassd.edu:8080/thredds/catalog/models/fvcom/NECOFS/Archive/Seaplan_33_Hindcast_v1/catalog.html

回复

举报 使用道具

相关帖子

全部回帖
暂无回帖,快来参与回复吧
懒得打字?点击右侧快捷回复 【吾爱海洋论坛发文有奖】
您需要登录后才可以回帖 登录 | 立即注册
万老师
活跃在2024-2-1
快速回复 返回顶部 返回列表