Скрипт Python для поиска ближайших пар местоположений из списка географических точек - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть список мест с их названиями и координатными точками.

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

  • названия местоположенийхранится в столбце 0
  • широты сохраняются в столбце 5
  • долготы хранятся в столбце 8

Я пытался решить эту проблему, но я получаю эту ошибку после того, какнесколько итераций.

---------------------------------------------------------------------------
     24         for j in range(len(data[i])):
     25             if(i != j):
---> 26                 distance = get_distance(float(data[i][5]),float(data[i][8]),float(data[j][5]),float(data[j][8]))
     27                 temp = str(data[i][0])
     28                 if (min > distance):

ValueError: could not convert string to float: 

Я получаю результаты до этой ошибки, но я подозреваю, что результаты неверны.Не уверен, в чем проблема, любая помощь будет принята с благодарностью.

Редактировать: Теперь моя проблема в том, что алгоритм не работает.Ближайшее местоположение, которое он возвращает, всегда совпадает с целевым местоположением.Расстояние, которое он возвращает, варьируется от 80 миль до тысяч миль, что, как я знаю, не так.Все места находятся в нескольких сотнях миль друг от друга.

    import math
    import csv
    with open("Locations.csv") as f:
        def get_distance(lat_1, lng_1, lat_2, lng_2): 
            d_lat = lat_2 - lat_1
            d_lng = lng_2 - lng_1 

            temp = (  
            math.sin(d_lat / 2) ** 2 
            + math.cos(lat_1) 
            * math.cos(lat_2) 
            * math.sin(d_lng / 2) ** 2
            )
            return 3963.1676 * (2 * math.atan2(math.sqrt(temp), math.sqrt(1 
            - temp))) 

        min = float(9000)
        temp = ''
        closest = ''
        reader = csv.reader(f)
        next(reader) # skip header
        for i in range(len(data)):
            for j in range(len(data[i])):
                if(i != j):
                    distance = get_distance(float(data[i][5]),float(data[i][8]),float(data[j][5]), float(data[j][8]))
                    temp = str(data[i][0])
                    if (min > distance):
                        min = distance
                        closest = temp
            print(str(data[i][0]) +" " + str(min) + " " + closest)
            min = 90000
            closest = ''

1 Ответ

0 голосов
/ 19 сентября 2018

Я предполагаю, что вы пытаетесь прочитать объект файла вместо содержимого .Посмотрите на документы , и вы можете найти использование.

Вот простой пример из того же документа:

import csv
with open('some.csv', newline='') as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)

Глядя на код, ничего не читается иВаш читатель находится вне области ваших CSV-файлов.Обратите внимание, что вы используете «with open», который определяет его область действия и закрывает файл позже.

...