3.0 KiB
3.0 KiB
基于含海岸线的网格采样数据进行二维网格加密
以下保留原笔记本的代码和已保存输出;转换过程中未重新执行代码。
import matplotlib.pyplot as plt
plt.close("all")
import xarray as xr
import numpy as np
import meshkernel
import contextily as ctx
from meshkernel import (
MakeGridParameters,
MeshKernel,
GriddedSamples,
ProjectionType,
MeshRefinementParameters,
RefinementType,
)
mk_version = meshkernel.__version__
水深采样数据
# GEBCO 水深采样数据
lon_np = np.array(
[
-68.54791667,
-68.46458333,
-68.38125,
-68.29791667,
-68.21458333,
-68.13125,
-68.04791667,
-67.96458333,
]
)
lat_np = np.array(
[
11.80208333,
11.88541667,
11.96875,
12.05208333,
12.13541667,
12.21875,
12.30208333,
12.38541667,
12.46875,
12.55208333,
]
)
values_np_2d = np.array(
[
[-1700, -1769, -1688, -1641, -1526, -1291, -1121, -1537],
[-1561, -1674, -1354, -757, -837, -838, -1080, -1466],
[-1630, -1390, -710, -562, -479, -753, -1246, -1703],
[-1553, -1446, -1147, -248, -175, -712, -1621, -1920],
[-1503, -1380, -1080, -305, 18, -543, -1563, -2241],
[-1477, -1571, -3, 100, 11, -891, -1521, -2446],
[-1892, -1808, 16, -3102, -2015, -1302, -1484, -2581],
[-2516, -2091, -1957, -2647, -1422, -1486, -2340, -2702],
[-2689, -2353, -2614, -3612, -3058, -3017, -3181, -2848],
[-3110, -3025, -3861, -3927, -3818, -4162, -4386, -4504],
]
)
values_np = values_np_2d.flatten().astype(np.float32)
生成规则网格
lon_min, lon_max, lat_min, lat_max = -68.55, -67.9, 11.8, 12.6
dx = dy = 0.05
make_grid_parameters = MakeGridParameters(
angle=0,
origin_x=lon_min,
origin_y=lat_min,
upper_right_x=lon_max,
upper_right_y=lat_max,
block_size_x=dx,
block_size_y=dy,
)
mk = MeshKernel(projection=ProjectionType(1))
mk.curvilinear_compute_rectangular_grid_on_extension(make_grid_parameters)
mk.curvilinear_convert_to_mesh2d() # 转换为 UGrid/二维网格
执行加密
gridded_samples = GriddedSamples(
x_coordinates=lon_np, y_coordinates=lat_np, values=values_np
)
mesh_refinement_parameters = MeshRefinementParameters(
min_edge_size=300, # 单位始终为米
refinement_type=RefinementType(1), # 波动库朗数加密类型,枚举值为 1
connect_hanging_nodes=True, # 设为 False 可分多步加密,例如分别处理多个区域
smoothing_iterations=2,
max_courant_time=120,
)
mk.mesh2d_refine_based_on_gridded_samples(
gridded_samples=gridded_samples,
mesh_refinement_params=mesh_refinement_parameters,
use_nodal_refinement=True,
)
fig, ax = plt.subplots()
mk.mesh2d_get().plot_edges(ax=ax, linewidth=1)
