You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中以海岸线为边界构建INLA网格的问题处理

INLA网格边界问题:移除陆地区域多余三角形,严格贴合海岸线

问题描述

我在R中用INLA创建网格时,尝试把海岸线设为边界,但网格右侧出现了多余的空白区域和三角形。我需要让网格严格以海岸线为边界,保证陆地区域不会生成任何三角形。(注:第二张图为目标海岸线边界)

现有代码

基础网格创建

# Building the mesh
mesh.loc <- SpatialPoints(as.matrix(coo)) # 点坐标
mesh <- inla.mesh.2d(loc=mesh.loc, max.edge=7e3, cutoff = 0.1, crs=4326) # max.edge指定三角形边长

plot(mesh, main="") # 绘制INLA网格
points(coo, pch=20,col="Dark Green") # 在网格上标记数据点(深绿色圆点)

带海岸线约束的多边形创建

lon = c(-4, 2.5, 2.5,-4) # FOF区域的经度
lat = c(55, 55, 58, 58) # FOF区域的纬度

Poly2_Coord_df = data.frame(lon, lat)

poly_2 <- Poly2_Coord_df %>% 
  st_as_sf(coords = c("lon", "lat"), 
           crs = 4326) %>% 
  st_bbox() %>% 
  st_as_sfc()

FOF_bound_2<- st_difference(poly_2,coast) # 用英国海岸线裁剪FOF多边形

FOF_bound_pol<-st_as_sf(FOF_bound_2,crs=4326) # 将裁剪后的边界设为shapefile

问题根源

你已经创建了带海岸线约束的多边形,但没把它传给inla.mesh.2d()的边界参数,INLA还是只根据数据点的范围生成网格,完全没用到你做的海岸线裁剪。另外,st_bbox()生成的是轴对齐矩形,裁剪后的多边形可能存在几何无效的情况,也会影响网格生成。

修正方案

步骤1:修复多边形几何有效性

先确保裁剪后的多边形没有自相交或无效问题:

FOF_bound_pol <- st_make_valid(FOF_bound_pol)

步骤2:把多边形转成INLA能识别的边界格式

INLA的网格需要特定格式的边界段,得把sf多边形转成Spatial格式再转成INLA边界:

# 转成SpatialPolygons
sp_bound <- as(FOF_bound_pol, "Spatial")
# 转成INLA网格边界段
mesh_boundary <- inla.sp2segment(sp_bound)

步骤3:用约束边界创建网格

调用inla.mesh.2d()时传入boundary参数,让网格只在你指定的海域区域生成:

mesh <- inla.mesh.2d(
  loc = mesh.loc, 
  max.edge = 7e3, 
  cutoff = 0.1, 
  boundary = mesh_boundary, # 关键:传入海岸线约束边界
  crs = 4326
)

# 验证结果
plot(mesh, main="")
points(coo, pch=20, col="Dark Green")
plot(FOF_bound_pol, add=TRUE, border="red", lwd=2) # 叠加红色边界看贴合度

额外优化建议

  • 如果海岸线附近需要更精细的网格,可以把max.edge设为向量,比如c(3e3, 7e3),第一个值是靠近数据点/边界的最小边长,第二个是区域内的最大边长。
  • 确认所有空间数据的CRS都是4326,避免投影不匹配导致裁剪或网格生成错误。
  • 如果FOF_bound_pol包含多个独立海域(比如岛屿周围),inla.sp2segment()会自动处理所有区域,不用额外操作。

内容的提问来源于stack exchange,提问作者Usman YousafZai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 21:21:59