python - 如何在pandas dataframe Python中找到GPS坐标之间的角度

标签 python pandas dataframe angle azimuth

我有带有测量坐标和单元格坐标的数据框。

我需要找到连接这两个点和北极的线之间的每个行角(方位角)。

df:

id     cell_lat     cell_long     meas_lat     meas_long
1      53.543643    11.636235     53.44758     11.03720
2      52.988823    10.0421645    53.03501     9.04165
3      54.013442    9.100981      53.90384     10.62370

我在网上找到了一些代码,但没有任何代码能真正帮助我更接近解决方案。

我用过this功能,但不确定是否正确,我想有更简单的解决方案。

欢迎任何帮助或提示,提前致谢。

最佳答案

这个问题最棘手的部分是将大地测量(纬度、经度)坐标转换为笛卡尔(x、y、z)坐标。如果你看https://en.wikipedia.org/wiki/Geographic_coordinate_conversion您可以看到如何做到这一点,其中涉及选择引用系统。假设我们选择 ECEF ( https://en.wikipedia.org/wiki/ECEF ),以下代码将计算您要查找的角度:

def vector_calc(lat, long, ht):
    '''
    Calculates the vector from a specified point on the Earth's surface to the North Pole.
    '''
    a = 6378137.0  # Equatorial radius of the Earth
    b = 6356752.314245  # Polar radius of the Earth

    e_squared = 1 - ((b ** 2) / (a ** 2))  # e is the eccentricity of the Earth
    n_phi = a / (np.sqrt(1 - (e_squared * (np.sin(lat) ** 2))))

    x = (n_phi + ht) * np.cos(lat) * np.cos(long)
    y = (n_phi + ht) * np.cos(lat) * np.sin(long)
    z = ((((b ** 2) / (a ** 2)) * n_phi) + ht) * np.sin(lat)

    x_npole = 0.0
    y_npole = 6378137.0
    z_npole = 0.0

    v = ((x_npole - x), (y_npole - y), (z_npole - z))

    return v

def angle_calc(lat1, long1, lat2, long2, ht1=0, ht2=0):
    '''
    Calculates the angle between the vectors from 2 points to the North Pole.
    '''
    # Convert from degrees to radians
    lat1_rad = (lat1 / 180) * np.pi
    long1_rad = (long1 / 180) * np.pi
    lat2_rad = (lat2 / 180) * np.pi
    long2_rad = (long2 / 180) * np.pi

    v1 = vector_calc(lat1_rad, long1_rad, ht1)
    v2 = vector_calc(lat2_rad, long2_rad, ht2)

    # The angle between two vectors, vect1 and vect2 is given by:
    # arccos[vect1.vect2 / |vect1||vect2|]
    dot = np.dot(v1, v2)  # The dot product of the two vectors
    v1_mag = np.linalg.norm(v1)  # The magnitude of the vector v1
    v2_mag = np.linalg.norm(v2)  # The magnitude of the vector v2

    theta_rad = np.arccos(dot / (v1_mag * v2_mag))
    # Convert radians back to degrees
    theta = (theta_rad / np.pi) * 180

    return theta

angles = []
for row in range(df.shape[0]):
    cell_lat = df.iloc[row]['cell_lat']
    cell_long = df.iloc[row]['cell_long']
    meas_lat = df.iloc[row]['meas_lat']
    meas_long = df.iloc[row]['meas_long']

    angle = angle_calc(cell_lat, cell_long, meas_lat, meas_long)

    angles.append(angle)

这将从数据框中读取每一行,计算角度并将其附加到角度列表中。显然,在计算出这些角度后,您可以对这些角度进行任何您喜欢的操作。

希望有帮助!

关于python - 如何在pandas dataframe Python中找到GPS坐标之间的角度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51212158/

相关文章:

python - df.to_sql 给出 TypeError 与 dtype=sqlalchemy.timestamp(timezone=True)

r - 关于操作数据框的基本 R 问题

python - 合并两个重复的数据框

python - 如何更改 False 列表中的所有 True 值,反之亦然

python - 如何拆分列表项?

python - 如何从 Python 脚本中运行 AppleScript?

python ipdb.set_trace() 一帧 "up"(frame=?)

python-3.x - 将 .sav 文件转换为 Pandas 数据框

python - Pandas 融化功能

dataframe - 如何根据pyspark数据帧中多列的笛卡尔积创建新列