根据经纬度计算地球距离-Numpy向量版

输入两个numpy数组,shape都是(n,2),每一行代表一个点,例如:

latlon1 = array([[ 22.7373478, 113.8013962],
       [ 22.6623782, 113.8286608]])

latlon2 = array([[ 22.6623782, 113.8286608],
       [ 22.6874816, 113.8103144]])

注意:两个数组需要满足行数一样或者其中一个数组的行数为1,当行数一样时,计算的是两个数组同一行的点的距离;有一个数组行数是1时,计算的是该点与另一数组所有点的距离。
代码如下:

def haversine(latlon1, latlon2):
    """
    计算两个经纬度点向量之间的地球距离
    输入:向量1(纬度,经度),向量2(纬度,经度)
    输出:距离向量
    """
    latlon1 = latlon1.reshape(-1,2) #固定形状
    latlon2 = latlon2.reshape(-1,2) #固定形状
    lat1, lon1 = latlon1[:,1],latlon1[:,0]
    lat2, lon2 = latlon2[:,1],latlon2[:,0]
    
    lon1 = list(map(radians,lon1))
    lat1 = list(map(radians,lat1))
    lon2 = list(map(radians,lon2))
    lat2 = list(map(radians,lat2))

    dlon = np.array(lon2) - np.array(lon1)
    dlat = np.array(lat2) - np.array(lat1)

    sindlat_p2 = list(map(lambda x:x**2,list(map(sin,(dlat/2).tolist()))))
    coslat1 = list(map(cos,lat1))
    coslat2 = list(map(cos,lat2))
    sindlon_p2 = list(map(lambda x:x**2,list(map(sin,(dlon/2).tolist()))))
    a = np.array(sindlat_p2)+np.array(coslat1)*np.array(coslat2)*np.array(sindlon_p2)
    c = np.array(list(map(asin,list(map(sqrt,a.tolist())))))*2
    r = 6370996.81  # 地球半径
    distance = c*r
    
    return distance

以上数据的计算结果:

array([8792.90409277, 3366.74435249])
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值