Harmonica 是 Fatiando a Terra 生态中用于重磁(重力与磁法)数据处理和正演模拟的 Python 库,常以 import harmonica as hm 引入。
【用途】 用于计算重力和磁法正演模型、地形改正、等效源网格化、向上延拓以及导数滤波等位场处理任务,适合局部到区域乃至全球尺度的位场建模,也适合教学和原型开发。
【主要能力】
- 正演模拟:
point_gravity(点质量重力)、prism_gravity(矩形棱柱重力,支持 g_z、g_north、g_east、potential 等场)、tesseroid_gravity(球面棱柱,用于区域/全球尺度)、prism_magnetic(棱柱磁异常)。 - 地形处理:
prism_layer依据地形面与参考面构建棱柱层,可计算地形效应,从而由自由空间异常得到布格异常。 - 网格化:
EquivalentSources以给定深度和阻尼拟合散点数据并输出规则网格,适合处理不规则数据间距。 - 滤波与延拓:
upward_continuation基于 FFT 的向上延拓;derivative_easting、derivative_northing、derivative_upward计算导数,可进一步得到总水平梯度与倾斜角。 - 校正:
bouguer_correction简单布格板校正。
【使用方式】 以数组接口传入观测坐标(东向、北向、向上)与模型参数。例如矩形棱柱重力:
prism = [-500, 500, -500, 500, -2000, -500] # (west, east, south, north, bottom, top)
gravity = hm.prism_gravity(coordinates, prism, density=500, field='g_z')
地形改正:
layer = hm.prism_layer((easting, northing), surface=topo, reference=0,
properties={'density': 2670})
terrain_effect = layer.gravity(coordinates, field='g_z')
等效源网格化:
eqs = hm.EquivalentSources(depth=10000, damping=10)
eqs.fit(coordinates, gravity_data)
grid = eqs.grid(spacing=5000, data_names=['gravity'])
向上延拓(需网格化 xarray 数据):
upward = hm.upward_continuation(gravity_grid, height_displacement=1000)
磁法正演示例:
magnetization = hm.magnetic_vector(intensity=5.0, inclination=60, declination=10)
b_total = hm.prism_magnetic(coordinates, prism, magnetization, field='b_total')
【坐标系与单位】 使用右手坐标系:Easting (x) 向东为正,Northing (y) 向北为正,Upward (z) 向上为正(高度为正、深度为负)。单位采用 SI:距离为米,密度为 kg/m³,重力为 mGal。局部测量建议使用投影坐标(米),区域/全球尺度使用 tesseroid。
【适用场景】
- 重力/磁法正演建模;
- 等效源网格化;
- 区域/全球尺度球面几何处理;
- 磁法减少到极等基于 FFT 的网格滤波;
- 教学和原型开发。
【限制与注意事项】
- 不提供完整的位场反演框架;若需反演地下物性分布,可考虑 SimPEG。
- 若需专有格式、商业支持或 GUI 交互式处理,可考虑 Oasis Montaj。
- 注意重力符号与 z 轴约定(向上为正);等效源拟合效果可通过 depth 与 damping 调整;地形改正较慢时可降低 DEM 分辨率或使用更大的棱柱;FFT 滤波的边缘效应可通过在延拓前对网格补零缓解;注意投影坐标与地理坐标的一致性。
【参考】 资料中列出的参考主题包括重力/磁法校正与正演建模方法;并附带脚本 scripts/gravity_processing.py 用于处理重力测量数据。官方文档及其他细节暂未提供。