关于#python#中由坐标求出两点间距离

img

img


已经弄了一天了换几种方法总是算出的值不对,求解一下!这样竟然是Python的入门题目吗

正矢、半正矢等三角函数,在现有教育体系内从没有涉及到,理解起来相对困难一些。下面的代码将计算地球表面两点距离的半正矢公式翻译成可用numpy的三角函数计算的函数。另外,我有一个更容易理解的思路,希望对题主有帮助:

  1. 将两个点的经纬度换算成空间坐标;
  2. 计算地心与两个点所成的两个向量的点积(以向量模长之积乘以向量夹角余弦);
  3. 点积除以两个向量的模(也就是地球半径)之积,结果就是向量夹角的余弦;
  4. 反余弦值对应着两点所在大圆(即经过两点的地球表面最大的圆)的弧度;
  5. 弧度乘以地球半径,即得弧长。
import numpy as np
def haversine(p1, p2, r=6371):
    lat1, lon1, lat2, lon2 = map(np.radians, (*p1, *p2))
    dlat, dlon = lat2 - lat1, lon2 - lon1
    a = np.sin(dlat/2.0)**2 + np.cos(lat1) * np.cos(lat2) * np.sin(dlon/2.0)**2
    c = 2 * np.arcsin(np.sqrt(a))
    return c * r

def get_arc(p1, p2, r=6371):
    lat1, lon1, lat2, lon2 = map(np.radians, (*p1, *p2))
    x1, y1, z1 = r*np.cos(lat1)*np.cos(lon1), r*np.cos(lat1)*np.sin(lon1), r*np.sin(lat1)
    x2, y2, z2 = r*np.cos(lat2)*np.cos(lon2), r*np.cos(lat2)*np.sin(lon2), r*np.sin(lat2)
    theta = np.arccos(np.dot((x1,y1,z1),(x2,y2,z2))/(r*r))
    return theta * r

西安 = (34.260958, 108.942369)
莫斯科 = (55.755825, 37.617298)
haversine(西安, 莫斯科)
5793.22364495678
get_arc(西安, 莫斯科)
5793.223644956781