在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
相关产品推荐
相关产品推荐

