字典两点之间的处理距离

时间:2018-10-20 09:10:28

标签: python math

我有包含点名称和坐标的字典:

{  
   'A':{  
      'latitude':'50.46681789',
      'longitude':'30.6370689'
   },
   'B':{  
      'latitude':'50.45898787',
      'longitude':'30.63235446'
   },
   'C':{  
      'latitude':'50.45699448',
      'longitude':'30.62394564'
}

我需要找到字典各点之间的距离。我已经具有处理距离的功能,但是我需要按格式迭代dict:

[
{
'name': 'AB',
'distance': <distance_between_A_B>,
},
{
'name': 'BC',
'distance': <distance_between_B_C>,
},
{
'name': 'AC',
'distance': <distance_between_A_C>,
}
]

我的问题是我无法在没有重复的情况下通过源字典来纠正迭代。

2 个答案:

答案 0 :(得分:1)

itertools.combinations方法听起来像您所需要的。给定对某些元素(例如字典的键)可迭代的输入,它将对那些元素的所有可能的元组进行迭代,而无需重复任何操作。

for (key1, key2) in itertools.combinations(your_dict.keys(), 2):
    # find distance between key1 and key2
    result_dict = {'name': key1 + key2, 'distance': found_distance}
    # do something with result_dict

答案 1 :(得分:0)

正如@David所说,您可以像这样创建字典,所以我只介绍计算距离部分。

import itertools
from math import sin, cos, sqrt, atan2, radians    

r = 6373.0 # Erath radius in 'KM'
for (key1, key2) in itertools.combinations(your_dict.keys(), 2):
    # find distance between key1 and key2
    first_lat = radians(float(your_dict[key1]['latitude']))
    first_long = radians(float(your_dict[key1]['longitude']))
    second_lat = radians(float(your_dict[key2]['latitude']))
    second_long = radians(float(your_dict[key2]['longitude']))

    delta_lat = second_lat - first_lat
    delta_long = second_long - first_lat

    t = sin(delta_lat / 2)**2 + cos(first_lat) * cos(second_lat) * sin(delta_long / 2)**2
    distance = r * (2 * atan2(sqrt(t), sqrt(1 - t)))

    result_dict = {'name': key1 + key2, 'distance': distance}

result_dict将是您想要的输出。