harmonica
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseHarmonica - Gravity and Magnetics
Harmonica - 重力与磁数据处理
Quick Reference
快速参考
python
import harmonica as hm
import numpy as nppython
import harmonica as hm
import numpy as npForward model - prism gravity
正演模型 - 棱柱体重力计算
prism = [-500, 500, -500, 500, -2000, -500] # (west, east, south, north, bottom, top)
gravity = hm.prism_gravity(coordinates, prism, density=500, field='g_z')
prism = [-500, 500, -500, 500, -2000, -500] # (西, 东, 南, 北, 底部深度, 顶部深度)
gravity = hm.prism_gravity(coordinates, prism, density=500, field='g_z')
Terrain correction
地形校正
layer = hm.prism_layer((easting, northing), surface=topo, reference=0,
properties={'density': 2670})
terrain_effect = layer.gravity(coordinates, field='g_z')
layer = hm.prism_layer((easting, northing), surface=topo, reference=0,
properties={'density': 2670})
terrain_effect = layer.gravity(coordinates, field='g_z')
Equivalent source gridding
等效源网格化
eqs = hm.EquivalentSources(depth=10000, damping=10)
eqs.fit(coordinates, gravity_data)
grid = eqs.grid(spacing=5000, data_names=['gravity'])
eqs = hm.EquivalentSources(depth=10000, damping=10)
eqs.fit(coordinates, gravity_data)
grid = eqs.grid(spacing=5000, data_names=['gravity'])
Upward continuation (requires gridded xarray)
向上延拓(需要网格化的xarray数据)
upward = hm.upward_continuation(gravity_grid, height_displacement=1000)
undefinedupward = hm.upward_continuation(gravity_grid, height_displacement=1000)
undefinedKey Functions
核心函数
| Function | Purpose |
|---|---|
| Gravity from point masses |
| Gravity from rectangular prisms |
| Gravity from spherical prisms (regional/global) |
| Magnetic anomaly from prisms |
| Create layer of prisms from topography |
| Grid scattered data with equivalent sources |
| FFT-based upward continuation |
| Simple Bouguer plate correction |
| 函数 | 用途 |
|---|---|
| 点质量的重力计算 |
| 矩形棱柱体的重力计算 |
| 球形棱柱体的重力计算(区域/全球尺度) |
| 棱柱体的磁异常计算 |
| 基于地形创建棱柱体层 |
| 利用等效源对离散数据进行网格化 |
| 基于FFT的向上延拓 |
| 简易布格平板校正 |
Essential Operations
关键操作
Forward Model - Rectangular Prism
正演模型 - 矩形棱柱体
python
undefinedpython
undefinedDefine prism: (west, east, south, north, bottom, top) in meters
定义棱柱体:(西, 东, 南, 北, 底部深度, 顶部深度),单位为米
prism = [-500, 500, -500, 500, -2000, -500]
density = 500 # kg/m3 density contrast
prism = [-500, 500, -500, 500, -2000, -500]
density = 500 # 密度差,单位为千克/立方米
Observation grid
观测网格
x_obs, y_obs = np.meshgrid(np.linspace(-5000, 5000, 100), np.linspace(-5000, 5000, 100))
z_obs = np.zeros_like(x_obs)
x_obs, y_obs = np.meshgrid(np.linspace(-5000, 5000, 100), np.linspace(-5000, 5000, 100))
z_obs = np.zeros_like(x_obs)
Calculate gravity (mGal). Fields: 'g_z', 'g_north', 'g_east', 'potential'
计算重力(单位为毫伽)。可选场分量:'g_z', 'g_north', 'g_east', 'potential'
gravity = hm.prism_gravity((x_obs.ravel(), y_obs.ravel(), z_obs.ravel()),
prism, density, field='g_z')
undefinedgravity = hm.prism_gravity((x_obs.ravel(), y_obs.ravel(), z_obs.ravel()),
prism, density, field='g_z')
undefinedTerrain Correction
地形校正
python
import xarray as xr
topo = xr.open_dataarray('dem.nc')
layer = hm.prism_layer((topo.easting.values, topo.northing.values),
surface=topo.values, reference=0,
properties={'density': 2670})
terrain_effect = layer.gravity((obs_easting, obs_northing, obs_height), field='g_z')
bouguer_anomaly = free_air_anomaly - terrain_effectpython
import xarray as xr
topo = xr.open_dataarray('dem.nc')
layer = hm.prism_layer((topo.easting.values, topo.northing.values),
surface=topo.values, reference=0,
properties={'density': 2670})
terrain_effect = layer.gravity((obs_easting, obs_northing, obs_height), field='g_z')
bouguer_anomaly = free_air_anomaly - terrain_effectEquivalent Source Gridding
等效源网格化
python
import verde as vdpython
import verde as vdProject to Cartesian
投影到笛卡尔坐标系
projection = vd.get_projection(longitude, latitude)
easting, northing = projection(longitude, latitude)
eqs = hm.EquivalentSources(depth=10000, damping=10)
eqs.fit((easting, northing, altitude), gravity_mgal)
grid = eqs.grid(spacing=5000, data_names=['gravity'])
undefinedprojection = vd.get_projection(longitude, latitude)
easting, northing = projection(longitude, latitude)
eqs = hm.EquivalentSources(depth=10000, damping=10)
eqs.fit((easting, northing, altitude), gravity_mgal)
grid = eqs.grid(spacing=5000, data_names=['gravity'])
undefinedMagnetic Forward Model
磁学正演模型
python
prism = [-500, 500, -500, 500, -2000, -500]
magnetization = hm.magnetic_vector(intensity=5.0, inclination=60, declination=10)
b_total = hm.prism_magnetic(coordinates, prism, magnetization, field='b_total')python
prism = [-500, 500, -500, 500, -2000, -500]
magnetization = hm.magnetic_vector(intensity=5.0, inclination=60, declination=10)
b_total = hm.prism_magnetic(coordinates, prism, magnetization, field='b_total')Derivative Filters
导数滤波器
python
dx = hm.derivative_easting(gravity_grid)
dy = hm.derivative_northing(gravity_grid)
dz = hm.derivative_upward(gravity_grid)
thg = np.sqrt(dx**2 + dy**2) # Total horizontal gradient
tilt = np.arctan2(dz, thg) # Tilt anglepython
dx = hm.derivative_easting(gravity_grid)
dy = hm.derivative_northing(gravity_grid)
dz = hm.derivative_upward(gravity_grid)
thg = np.sqrt(dx**2 + dy**2) # 总水平梯度
tilt = np.arctan2(dz, thg) # 倾斜角Coordinate System
坐标系
Harmonica uses a right-handed coordinate system:
- Easting (x): positive east
- Northing (y): positive north
- Upward (z): positive up (heights positive, depths negative)
Units are SI: meters for distance, kg/m3 for density, mGal for gravity.
Harmonica采用右手坐标系:
- 东向(x): 东为正方向
- 北向(y): 北为正方向
- 向上(z): 向上为正方向(高度为正,深度为负)
单位采用国际单位制:距离单位为米,密度单位为千克/立方米,重力单位为毫伽(mGal)。
When to Use vs Alternatives
适用场景与替代工具对比
| Use Case | Tool | Why |
|---|---|---|
| Gravity/magnetic forward modelling | Harmonica | Purpose-built, Fatiando ecosystem |
| Potential field inversion | SimPEG | Full inversion framework with regularization |
| Commercial gravity processing | Oasis Montaj | Industry-standard GUI, proprietary formats |
| Simple Bouguer corrections only | Custom numpy | Fewer dependencies for one-off calculations |
| Equivalent source gridding | Harmonica | Best open-source option for potential fields |
| Regional/global scale | Harmonica (tesseroids) | Handles spherical geometry natively |
| Magnetic data reduction to pole | Harmonica | FFT-based filters for gridded data |
| Teaching/prototyping | Harmonica | Clean API, good documentation |
Choose Harmonica when: You need open-source gravity/magnetic processing with
forward modelling, terrain corrections, or equivalent source gridding. It integrates
well with Verde for projections and gridding. Part of the Fatiando a Terra ecosystem.
Choose SimPEG when: You need to invert potential field data for subsurface
property distributions (density or susceptibility models).
Choose Oasis Montaj when: You work in an industry setting that requires
proprietary formats, commercial support, or GUI-based interactive processing.
| 使用场景 | 工具 | 原因 |
|---|---|---|
| 重力/磁学正演模拟 | Harmonica | 专属工具,属于Fatiando生态系统 |
| 位场反演 | SimPEG | 带正则化的完整反演框架 |
| 商用重力数据处理 | Oasis Montaj | 行业标准GUI,支持专有格式 |
| 仅需简易布格校正 | 自定义numpy代码 | 依赖更少,适合一次性计算 |
| 等效源网格化 | Harmonica | 位场处理领域最佳开源方案 |
| 区域/全球尺度建模 | Harmonica(tesseroids) | 原生支持球面几何 |
| 磁数据化极处理 | Harmonica | 基于FFT的网格化数据滤波器 |
| 教学/原型开发 | Harmonica | API简洁,文档完善 |
选择Harmonica的场景:需要开源的重力/磁数据处理工具,支持正演模拟、地形校正或等效源网格化。它与Verde的投影和网格化工具集成良好,属于Fatiando a Terra生态系统。
选择SimPEG的场景:需要对位场数据进行反演,以得到地下属性分布(密度或磁化率模型)。
选择Oasis Montaj的场景:工作环境要求使用专有格式、商用支持或基于GUI的交互式处理。
Common Workflows
常见工作流程
Process Gravity Survey with Terrain Correction and Gridding
带地形校正与网格化的重力测量数据处理
- Load raw gravity observations and station coordinates
- Apply latitude, free-air, and tidal corrections
- Load DEM and build prism layer with
hm.prism_layer() - Compute terrain effect at observation points
- Subtract terrain effect from free-air anomaly to get Bouguer anomaly
- Project coordinates to Cartesian with
verde.get_projection() - Block-reduce data if station density is uneven
- Fit equivalent sources with
hm.EquivalentSources() - Grid the Bouguer anomaly onto a regular grid
- Apply to mask areas far from data
vd.distance_mask() - Apply derivative filters (horizontal gradient, tilt angle) for interpretation
- Perform upward continuation to enhance regional features
- Export gridded data to NetCDF
- 加载原始重力观测数据和测站坐标
- 应用纬度校正、自由空气校正和潮汐校正
- 加载DEM并使用构建棱柱体层
hm.prism_layer() - 计算观测点处的地形影响
- 从自由空气异常中减去地形影响得到布格异常
- 使用将坐标投影到笛卡尔坐标系
verde.get_projection() - 若测站密度不均,对数据进行分块降采样
- 使用拟合等效源
hm.EquivalentSources() - 将布格异常网格化到规则网格
- 应用对远离数据的区域进行掩膜
vd.distance_mask() - 应用导数滤波器(水平梯度、倾斜角)用于解释
- 进行向上延拓以增强区域特征
- 将网格化数据导出为NetCDF格式
Common Issues
常见问题
| Issue | Solution |
|---|---|
| Wrong gravity sign | Check z-axis convention (positive upward) |
| Poor equivalent source fit | Adjust |
| Slow terrain correction | Reduce DEM resolution or use larger prisms |
| Edge effects in FFT filters | Pad grid before applying |
| Coordinate mismatch | Ensure consistent use of projected vs geographic coords |
| 问题 | 解决方案 |
|---|---|
| 重力符号错误 | 检查z轴约定(向上为正) |
| 等效源拟合效果差 | 调整 |
| 地形校正速度慢 | 降低DEM分辨率或使用更大的棱柱体 |
| FFT滤波器边缘效应 | 在应用 |
| 坐标不匹配 | 确保统一使用投影坐标或地理坐标 |
Tips
提示
- Use projected coordinates (meters) for local surveys
- Use tesseroids for regional/global scale modelling
- Equivalent sources handle irregular data spacing well
- Choose appropriate density (2670 kg/m3 typical for upper crust)
- Check sign conventions - depths are negative z values
- 使用投影坐标(米)处理局部测量数据
- 使用tesseroids处理区域/全球尺度建模
- 等效源能很好地处理不规则数据间距
- 选择合适的密度(上地壳典型值为2670千克/立方米)
- 检查符号约定 - 深度为z轴负值
References
参考资料
- Gravity/Magnetic Corrections - Standard corrections and anomalies
- Forward Modeling - Detailed forward modeling methods
- 重力/磁校正 - 标准校正方法与异常类型
- 正演模拟 - 详细的正演模拟方法
Scripts
脚本示例
- scripts/gravity_processing.py - Process gravity survey data
- scripts/gravity_processing.py - 重力测量数据处理脚本