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

Я работаю над вычислением расстояния между двумя глобальными позициями на основе их координат.При использовании только двух местоположений я получаю результаты:

def global_distance(location1, location2):
    lat1, lon1 = location1
    lat2, lon2 = location2
    radius = 6371 # radius of the Earth

    dlat = math.radians(lat2-lat1)
    dlon = math.radians(lon2-lon1)
    a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(math.radians(lat1)) \
        * math.cos(math.radians(lat2)) * math.sin(dlon/2) * math.sin(dlon/2)
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
    d = radius * c

    return d

lat1 = 55.32; lat2 = 54.276; long1 = -118.8634; long2 = -117.276


print( global_distance((lat1, long1), (lat2, long2)))

Что если я хочу рассчитать расстояние между несколькими местоположениями?Предполагая, что у меня есть CSV-файл, содержащий три местоположения:

Location   Lat1      Long1      
 A         55.322    -117.17
 B         57.316    -117.456
 C         54.275    -116.567

Как я могу перебрать эти два столбца и получить расстояния между (A, B), (A, C) и (B, C)?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

Я бы импортировал данные из вашего файла через панд:

import pandas as pd
df = pd.read_table(filename, sep='\s+', index_col=0)

Дополнительно вы можете импортировать itertools:

import itertools as it

С этим вы можете получить все комбинации итерируемого, как это, например, с индексами фрейма данных здесь:

for i in it.combinations(df.index, 2): print(i)
('A', 'B')
('A', 'C')
('B', 'C')

Это показывает, что вы получите нужные комбинации. Теперь сделайте то же самое с данными вашего фрейма данных:

for i in it.combinations(df.values, 2): print(global_distance(i[0], i[1]))
222.4224400374507
122.66829007875636
342.671447691153

И если вы хотите, чтобы имена местоположений были включены в вывод, вы можете пропустить index_col=0 при импорте, чтобы A, B и C также были частью df.values, и вы могли написать:

for i in it.combinations(df.values, 2): print(i[0][0], '-', i[1][0], global_distance(i[0][1:], i[1][1:]))
A - B 222.4224400374507
A - C 122.66829007875636
B - C 342.671447691153
0 голосов
/ 17 мая 2018

Предполагая, что вы прочитали этот CSV в какой-то последовательности последовательностей (например, list(csv.reader(f))), все, что вам нужно сделать, это перебрать все комбинации местоположений. И это именно то, что itertools.combinations делает:

>>> locs = [('A', 55.322, -117.17), ('B', 57.316, -117.456), ('C', 54.275, 116.567)]
>>> for (loc1, lat1, lon1), (loc2, lat2, lon2) in itertools.combinations(locs, 2):
...     print(loc1, loc2, global_distance((lat1, lon1), (lat2, lon2)))
A B 222.42244003744995
A C 122.66829007875741
B C 342.67144769115316

Пока вы смотрите на связанные документы выше, обратите внимание на combinations_with_replacement, permutations и product, которые часто являются ответами на похожие, но слегка отличающиеся проблемы.

Это должно быть легко адаптироваться к последовательности диктов, или дикту из Location экземпляров и т. Д. Если, с другой стороны, у вас есть что-то вроде двумерного массива или панды DataFrame, вы можете захотеть сделать что-то другое. (Несмотря на быстрый поиск, похоже, что создание массива комбинаций itertools с fromiter не намного медленнее, чем что-либо еще, даже если вы хотите обменять пространство на время для трансляции своей функции global_distance .)

...