【Python学习】——根据经纬度计算两点距离

预期目标:两组数据(可以想象为两组格点),均包含经纬度信息,计算1组每个格点到2组每个格点距离。

法1:转为弧度制 * 地球半径 6371

得到的dist_matrix是一个二维数据,代表某点到某点的距离,比如第一行数据代表1组第一个格点到2组每个数据的距离(公里数)

# 将经纬度转换为弧度制
lat_rad = np.radians(disturbed_lats)
lon_rad = np.radians(disturbed_lons)
undisturbed_lat_rad = np.radians(undisturbed_lats)
undisturbed_lon_rad = np.radians(undisturbed_lons)
rad_dist_matrix = haversine_distances(np.vstack([lat_rad, lon_rad]).T,
                                  np.vstack([undisturbed_lat_rad, undisturbed_lon_rad]).T)
dist_matrix = rad_dist_matrix * 6371 

缺点:haversine_distances计算速度慢,遇到大量数据时,效率低下

大数据计算解决办法——见法2

法2:等同于法1,换一种计算方式,得到相同结果,计算速度大幅度提高

# 将经纬度转换为弧度制
lat_rad = np.radians(disturbed_lats)
lon_rad = np.radians(disturbed_lons)
undisturbed_lat_rad = np.radians(undisturbed_lats)
undisturbed_lon_rad = np.radians(undisturbed_lons)

def haversine_distances_fast(X, Y):
    # convert decimal degrees to radians
    # haversine formula
    dlon = Y[:, 1] - X[:, 1][:, np.newaxis]
    dlat = Y[:, 0] - X[:, 0][:, np.newaxis]
    a = np.sin(dlat/2)**2 + np.cos(X[:, 0])[:, np.newaxis] * np.cos(Y[:, 0]) * np.sin(dlon/2)**2
    c = 2 * np.arcsin(np.sqrt(a))
    km = 6367 * c
    return km

dist_matrix = haversine_distances_fast(np.vstack([lat_rad, lon_rad]).T,
                                  np.vstack([undisturbed_lat_rad, undisturbed_lon_rad]).T)

法3:以上计算得到的均为距离,同样也能得到欧氏距离

# 将经纬度转换为弧度制
lat_rad = np.radians(disturbed_lats)
lon_rad = np.radians(disturbed_lons)
undisturbed_lat_rad = np.radians(undisturbed_lats)
undisturbed_lon_rad = np.radians(undisturbed_lons)

def euclidean_distances_fast(X, Y):
    # convert decimal degrees to radians
    # X = np.radians(X)
    # Y = np.radians(Y)
    # euclidean formula
    dlon = Y[:, 1] - X[:, 1][:, np.newaxis]
    dlat = Y[:, 0] - X[:, 0][:, np.newaxis]
    km = 6373 * np.sqrt(dlon**2 + dlat**2)
    return km

dist_matrix = euclidean_distances_fast(np.vstack([lat_rad, lon_rad]).T,
                                  np.vstack([undisturbed_lat_rad, undisturbed_lon_rad]).T)

参考文献:

sklearn.metrics.pairwise.haversine_distances-scikit-learn中文社区

地球上两点之间的距离(改) - 炸鸡人博客

scikit-learn - sklearn.metrics.pairwise.haversine_distances 计算样本 X 和 Y 之间的 Haversine 距离。

scipy.spatial.distance.cdist — SciPy v1.11.2 Manual

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值