Как быстро оценить расстояние между двумя точками (широта, долгота)?



Я хочу иметь возможность получить оценку расстояния между двумя точками (широта, долгота). Я хочу пропустить, так как это будет для поиска * graph, и я хочу, чтобы это было быстро. Точки будут находиться не более чем в 800 км друг от друга.

588   5  

5 ответов:

Ответы на Формулу Хаверсина в Python (Пеленг и расстояние между двумя точками GPS)предоставляют реализации Python, которые отвечают на ваш вопрос.

Используя реализацию ниже, я выполнил 100 000 итераций менее чем за 1 секунду на старом ноутбуке. Я думаю, для ваших целей этого должно быть достаточно. Тем не менее, вы должны профилировать что-либо, прежде чем оптимизировать производительность. {[0]}

Недооценивать haversine(lat1, long1, lat2, long2) * 0.90 или любой другой фактор, который вы хотите. Я не посмотрите, как полезно вводить ошибку в вашу недооценку.

Поскольку расстояние относительно мало, можно использовать приближение равновеликого расстояния. Это приближение выполняется быстрее, чем при использовании формулы Хаверсина. Итак, чтобы получить расстояние от вашей контрольной точки (lat1/lon1) до точки, которую вы тестируете (lat2/lon2), используйте приведенную ниже формулу. Важное примечание: вам нужно преобразовать все точки lat/lon в радианы:

R = 6371  // radius of the earth in km
x = (lon2 - lon1) * cos( 0.5*(lat2+lat1) )
y = lat2 - lat1
d = R * sqrt( x*x + y*y )

Поскольку 'R' находится в км, расстояние ' d ' будет в км.

Ссылка: http://www.movable-type.co.uk/scripts/latlong.html

Одна из идей скорости состоит в том, чтобы преобразовать координаты long/lat в трехмерные (x,y,z) координаты. После предварительной обработки точек используйте евклидово расстояние между точками в качестве быстро вычисляемого недоразвития фактического расстояния.

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

Например, в континентальных Соединенных Штатах долгота составляет 55 градусов, а широта-20, что составляет 1100 целых точек. Расстояние между всеми возможными комбинации-это Задача рукопожатия , на которую отвечают (n-1)(n)/2 или около 600k комбинаций. Это кажется вполне осуществимым для хранения и извлечения. Если вы предоставите больше информации о своих требованиях, я могу быть более конкретным.

Пожалуйста, используйте следующий код.

def distance(lat1, lng1, lat2, lng2):
    #return distance as meter if you want km distance, remove "* 1000"
    radius = 6371 * 1000 

    dLat = (lat2-lat1) * math.pi / 180
    dLng = (lng2-lng1) * math.pi / 180

    lat1 = lat1 * math.pi / 180
    lat2 = lat2 * math.pi / 180

    val = sin(dLat/2) * sin(dLat/2) + sin(dLng/2) * sin(dLng/2) * cos(lat1) * cos(lat2)    
    ang = 2 * atan2(sqrt(val), sqrt(1-val))
    return radius * ang

Comments

    Ничего не найдено.