基于纬度/经度的点列表之间的距离
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于纬度/经度的点列表之间的距离相关的知识,希望对你有一定的参考价值。
所以我有此坐标列表,我需要它们之间最终的距离求和。
track = [[49.16967, 20.21491, 1343],
[49.17066, 20.22002, 1373],
[49.16979, 20.22416, 1408],
[49.17077, 20.22186, 1422],
[49.17258, 20.22094, 1467],
[49.17294, 20.21944, 1460]]
到目前为止,我已经有了用于计算两组坐标之间距离的基本公式
import math
def distance(lat_start, lon_start, lat_ciel, lon_ciel):
R = 6371000
lat_start = math.radians(lat_start)
lon_start = math.radians(lon_start)
lat_ciel = math.radians(lat_ciel)
lon_ciel = math.radians(lon_ciel)
DiffLat = lat_ciel - lat_start
DiffLon = lon_ciel - lon_start
a = math.sin(DiffLat/2) ** 2 + math.cos(lat_start) * math.cos(lat_ciel) * math.sin(DiffLon / 2) ** 2
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
return R * c
我被困在下一步中,我尝试创建一个不同的函数,该函数将现有函数用于距离,并仅获取每组坐标并计算距离,然后将结果数字加在一起。感谢您的帮助。
答案
import math
from itertools import combinations
def distance(lat_start, lon_start, lat_ciel, lon_ciel):
R = 6371000
lat_start = math.radians(lat_start)
lon_start = math.radians(lon_start)
lat_ciel = math.radians(lat_ciel)
lon_ciel = math.radians(lon_ciel)
DiffLat = lat_ciel - lat_start
DiffLon = lon_ciel - lon_start
a = math.sin(DiffLat/2) ** 2 + math.cos(lat_start) * math.cos(lat_ciel) * math.sin(DiffLon / 2) ** 2
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a))
return R * c
def sum_distance(track):
return sum((map(lambda p: distance(*p[0][:2], *p[1][:2]), combinations(track, 2))))
my_track = [[49.16967, 20.21491, 1343],
[49.17066, 20.22002, 1373],
[49.16979, 20.22416, 1408],
[49.17077, 20.22186, 1422],
[49.17258, 20.22094, 1467],
[49.17294, 20.21944, 1460]]
print(sum_distance(my_track)) # 5252.0327870706005
说明
- combinations(...)来自https://docs.python.org/2/library/itertools.html#itertools.combinations提供对的所有组合
- lambda p:distance(* p [0] [:2],* p [1] [:2])计算a的距离对,其中p [0]和p [1]是一对的第一和第二个元素
- [:2]是获取前两个元素(即经/纬度)的切片
- * p [x] [:2]为距离函数的参数提供前两个元素的解压缩
- map(...)为所有对生成距离
- sum(...)总结成对的距离
以上是关于基于纬度/经度的点列表之间的距离的主要内容,如果未能解决你的问题,请参考以下文章