Как быстро оценить расстояние между двумя точками (широта, долгота)?
Я хочу иметь возможность получить оценку расстояния между двумя точками (широта, долгота). Я хочу пропустить, так как это будет для поиска * graph, и я хочу, чтобы это было быстро. Точки будут находиться не более чем в 800 км друг от друга.
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 ' будет в км.
Одна из идей скорости состоит в том, чтобы преобразовать координаты 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