震中距、方位角与反方位角

震中距、方位角与反方位角#

震中距、方位角和反方位角是由地震和台站位置决定的参数,其在地震数据筛选和分析中 经常会用到。

震中距#

一般来说,球面上任意两点都可以和球心确定唯一的大圆(great circle)。 在大圆上,连接这两点的弧有两条,较短的叫优弧(minor arc),较长的叫 劣弧(major arc)。

震中距是震中与台站位置沿大圆弧的连线的优弧的长度。

Note

震中距的单位一般为 km 或度(°)。km 常用于近震,度常用于远震。

假设地球是完美球体,半径 \(R_0\) 为 6371 km:

\[ 1° = \frac{\pi*R_0}{180} km \approx 111.19492 km \]
\[ 1 km = \frac{180}{\pi*R_0}° \approx 0.00899° \]

方位角和反方位角#

方位角(azimuth,常简写为 az)是震中到台站的连线与地理北向的顺时针夹角,而反方位角 (back azimuth,常简写为 baz)指台站到震中的连线与地理北向的顺时针夹角。

震中距、方位角、反方位角示意图

Fig. 23 震中距、方位角、反方位角示意图#

需要注意的是,由于地球是个球体,方位角和反方位角一般并不是相差 180°。 例如,地震和台站分别位于(0°N,0°E)和(40°N,120°E)时,方位角约为 46°, 反方位角约为 290°,二者相差 244°。

使用 ObsPy 计算#

ObsPy 提供了若干个函数,用于计算震中距、方位角和反方位角等参数。

假定地震位于 (0°, 0°) 处,台站位于 (20°, 10°) 处:

evla, evlo, stla, stlo = 0, 0, 20, 10

ObsPy 的 obspy.geodetics.base.locations2degrees() 函数可以用于计算完美球体 地球表面任意两点的距离,其返回值单位为度。

from obspy.geodetics import locations2degrees

dist = locations2degrees(0, 0, 20, 10)
print(dist)
---------------------------------------------------------------------------
ModuleNotFoundError                       Traceback (most recent call last)
Cell In[2], line 1
----> 1 from obspy.geodetics import locations2degrees
      3 dist = locations2degrees(0, 0, 20, 10)
      4 print(dist)

File ~/micromamba/envs/seismo-learn/lib/python3.13/site-packages/obspy/__init__.py:44
     41     msg = ('pkg_resources is deprecated as an API')
     42     warnings.filterwarnings(
     43         'ignore', message=msg, category=DeprecationWarning, module='obspy')
---> 44     from obspy.core.utcdatetime import UTCDateTime  # NOQA
     45 from obspy.core.util import _get_version_string
     46 __version__ = _get_version_string(abbrev=10)

File ~/micromamba/envs/seismo-learn/lib/python3.13/site-packages/obspy/core/__init__.py:120
     12 """
     13 obspy.core - Core classes of ObsPy
     14 ==================================
   (...)    117 .. _NumPy: http://www.numpy.org
    118 """
    119 # don't change order
--> 120 from obspy.core.utcdatetime import UTCDateTime  # NOQA
    121 from obspy.core.util.attribdict import AttribDict  # NOQA
    122 from obspy.core.trace import Stats, Trace  # NOQA

File ~/micromamba/envs/seismo-learn/lib/python3.13/site-packages/obspy/core/utcdatetime.py:21
     18 import warnings
     20 import numpy as np
---> 21 from obspy.core.util.deprecation_helpers import ObsPyDeprecationWarning
     24 # based on https://www.myintervals.com/blog/2009/05/20/iso-8601, w/ week 53 fix
     25 _ISO8601_REGEX = re.compile(r"""
     26     ^
     27     ([\+-]?\d{4}(?!\d{2}\b))
   (...)     40     $
     41     """, re.VERBOSE)

File ~/micromamba/envs/seismo-learn/lib/python3.13/site-packages/obspy/core/util/__init__.py:22
     20 # import order matters - NamedTemporaryFile must be one of the first!
     21 from obspy.core.util.attribdict import AttribDict
---> 22 from obspy.core.util.base import (ALL_MODULES, DEFAULT_MODULES,
     23                                   NATIVE_BYTEORDER, NETWORK_MODULES,
     24                                   NamedTemporaryFile, _read_from_plugin,
     25                                   create_empty_data_chunk, get_example_file,
     26                                   get_script_dir_name, MATPLOTLIB_VERSION,
     27                                   SCIPY_VERSION, NUMPY_VERSION,
     28                                   CARTOPY_VERSION, CatchAndAssertWarnings)
     29 from obspy.core.util.misc import (BAND_CODE, CatchOutput, complexify_string,
     30                                   guess_delta, score_at_percentile,
     31                                   to_int_or_zero, SuppressOutput)
     32 from obspy.core.util.obspy_types import (ComplexWithUncertainties, Enum,
     33                                          FloatWithUncertainties)

File ~/micromamba/envs/seismo-learn/lib/python3.13/site-packages/obspy/core/util/base.py:26
     23 from pathlib import PurePath
     25 import numpy as np
---> 26 import pkg_resources
     27 from pkg_resources import get_entry_info, iter_entry_points
     29 from obspy.core.util.misc import to_int_or_zero, buffered_load_entry_point

ModuleNotFoundError: No module named 'pkg_resources'

obspy.geodetics.base.gps2dist_azimuth() 函数可以计算震中距、方位角和反方位角, 且其计算时采用的是 WGS84 椭球,因而具有更高的准确性:

from obspy.geodetics import gps2dist_azimuth

dist, az, baz = gps2dist_azimuth(evla, evlo, stla, stlo)
print(dist, az, baz)

obspy.geodetics.base.gps2dist_azimuth() 函数返回的距离以米为单位,可使用 obspy.geodetics.base.kilometers2degrees() 函数将其转换成以度为单位:

from obspy.geodetics import kilometers2degrees

gcarc = kilometers2degrees(dist / 1000.0)
print(gcarc)