0

Я работаю с миллиардами строк данных, и каждая строка имеет ассоциированную стартовую широту/долготу и конечную широту/долготу. Мне нужно рассчитать расстояние между каждой начальной/конечной точкой - но это занимает очень много времени. Мне действительно нужно сделать то, что я делаю более эффективно.Эффективное обнаружение расстояния между 2 lat/longs в SQL

В настоящее время я использую функцию (ниже) для вычисления гипотенузы между точками. Есть ли способ сделать это более эффективным? Я должен сказать, что я уже пробовал кастинг lat/longs как пространственные географии и используя SQL, встроенные в функции STDistance() (не индексированные), но это было еще медленнее.

Любая помощь будет высоко оценена. Я надеюсь, что есть способ ускорить эту функцию, даже если она немного ухудшает точность (ближе 100 м, вероятно, хорошо). Спасибо заранее!

DECLARE @l_distance_m float 
, @l_long_start FLOAT 
, @l_long_end FLOAT 
, @l_lat_start FLOAT 
, @l_lat_end FLOAT 
, @l_x_diff FLOAT 
, @l_y_diff FLOAT 

SET @l_lat_start = @lat_start 
SET @l_long_start = @long_start 
SET @l_lat_end = @lat_end 
SET @l_long_end = @long_end 
-- NOTE 2 x PI() x (radius of earth)/360 = 111 
SET @l_y_diff = 111 * (@l_lat_end - @l_lat_start) 
SET @l_x_diff = 111 * (@l_long_end - @l_long_start) * COS(RADIANS((@l_lat_end + @l_lat_start)/2)) 
SET @l_distance_m = 1000 * SQRT(@l_x_diff * @l_x_diff + @l_y_diff * @l_y_diff) 
RETURN @l_distance_m 

ответ

2

Я не сделал никакого программирования SQL, так как около 1994 года, однако я хотел бы сделать следующие замечания:

  1. Формула, которую вы используете формулу, которая работает до тех пор, как расстояния между вашими координатами не становится слишком большим. Это будет иметь большие ошибки для разработки расстояния между, например, Нью-Йорке и Сингапуре, но для разработки дистанции между Нью-Йорком и Бостоном это должно быть хорошо до 100 метров.
  2. Я не думаю, что есть какая-либо формула приближения, которая была бы быстрее, однако я могу увидеть некоторые незначительные улучшения в реализации, которые могут ускорить ее, например: (1) почему вы потрудитесь назначить @l_lat_start из @lat_start, не можете ли вы просто используйте @lat_start напрямую (и то же самое для @long_start, @lat_end, @long_end), (2) Вместо того, чтобы иметь 111 в формулах для @l_y_diff и @l_x_diff, вы можете избавиться от него там, тем самым, сохраняя умножение, а вместо этого из 1000 в формуле для @l_distance_m у вас может быть 111000, (3) с использованием COS (RADIANS (@l_lat_end)) или COS (RADIANS (@l_lat_start)) не ухудшит точность, если точки не слишком далеко или, если все точки находятся в одном городе, вы можете просто разработать косинус любой точки в городе.
Кроме того, я думаю, вам нужно будет рассмотреть другие идеи, такие как создание таблицы с результатами , и когда точки добавляются/удаляются d из таблицы, обновив таблицу результатов в это время.

+0

Спасибо! Я буду реализовывать ваши предложения :) – iambalrog

+0

Нет проблем. FYI, если этот ответ сработал для вас, принято считать его «принятым». – Stochastically

+0

Извинения, мой первый вопрос, так еще учиться. Еще раз спасибо! – iambalrog

Смежные вопросы