使用 Haversine 包比较 csv 经度和纬度列表的所有距离可能性

Posted

技术标签:

【中文标题】使用 Haversine 包比较 csv 经度和纬度列表的所有距离可能性【英文标题】:Use Haversine package to compare all distances possibilities of a csv list of longitude and latitude 【发布时间】:2018-07-24 00:42:38 【问题描述】:

我有一个 lon 和 lat 作为 csv 文件的列表,我想计算所有距离,该文件有这样的参数 (-18.4392969, -40.2688762) (-8.3905896, -37.4957717) (-19.952862, -33.173232)

编辑:我想做一个代码,给我这样的东西:点 A 到 B 和 C 之间的距离 和 B 到 A 和 C,C 到 A 和 B,并将其保存到距离列表。

【问题讨论】:

欢迎来到 Stack Overflow。请包含尝试解决方案的代码。 How to Ask 预期输出? 【参考方案1】:

这是一个 python 函数,用于计算地球上两个位置之间的大圆距离(给定它们的(纬度、经度)元组):

import math

def distance(p1, p2):
    R = 6371 # mean radius of Earth in km

    cphi_1 = math.cos(math.radians(p1[0]))
    cphi_2 = math.cos(math.radians(p2[0]))

    d_phi = math.radians(p2[0] - p1[0])
    d_lam = math.radians(p2[1] - p1[1])

    a =  math.sin(d_phi / 2) ** 2
    a += math.sin(d_lam / 2) ** 2 * cphi_1 * cphi_2
    return 2 * R * math.atan2(abs(a) ** 0.5, abs(1 - a) ** 0.5)


if __name__ == "__main__":
    print(distance((40.2342, -17.9834), (13.3298, -53.1698)))

我针对this online calculator 对其进行了测试,但是您可能希望在您自己的代码中使用上面的代码之前进行自己的测试。

EDIT 计算所有唯一的成对距离而不重复,使用类似

from itertools import combinations
distances = list(map(distance, *zip(*combinations(lat_lon_list, 2))))

【讨论】:

实际上我可以使用 hasrsine 包计算这个,但我想编写一个代码,给我这样的东西:点 A 到 B 和 C 之间的距离,以及 B 到 A 和 C 之间的距离,, , C 到 A 和 B,并将其保存到距离列表中。 啊,我误会了。我以为你正在寻找一个 hasrsine 包来为你计算距离。 @FoE 更新了我的答案以包含所有成对组合的代码

以上是关于使用 Haversine 包比较 csv 经度和纬度列表的所有距离可能性的主要内容,如果未能解决你的问题,请参考以下文章

使用 Haversine 的距离公式获取经度和纬度的距​​离

For 循环将带有纬度和经度的 .csv 文件与 Dataclass 进行比较

Haversine 公式和 Python 3 - 数学域错误

Codeigniter 和 SQL/Haversine 公式

对haversine公式使用列表推导

Haversine 公式,PHP,如果条件适用,则添加到第二个表中