Расстояние между двумя точками словаря - PullRequest
0 голосов
/ 20 октября 2018

У меня есть словарь, который содержит имя точки и координаты:

{  
   '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>,
}
]

Моя проблема в том, что я не могу исправить итерацию по исходному dict без дубликатов.

Ответы [ 2 ]

0 голосов
/ 01 января 2019

Как сказал @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 будет вашим желаемым выводом.

0 голосов
/ 20 октября 2018

Метод 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...