在SQL中有效地找到2个纬度/长度之间的距离

时间:2013-05-24 16:22:09

标签: sql geometry computational-geometry sqlgeography geographic-distance

我正在处理数十亿行数据,每行都有一个相关的起始纬度/经度和终点纬度/经度。我需要计算每个起点/终点之间的距离 - 但这需要很长的时间。 我真的需要做出我正在做的事情。

目前我使用一个函数(下面)来计算点之间的斜边。有什么方法可以提高效率吗? 我应该说我已经尝试将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

1 个答案:

答案 0 :(得分:2)

我从1994年左右开始没有做任何SQL编程,但是我做了以下观察:

  1. 你使用的公式是一个有效的公式坐标之间的距离不会太大。计算出例如距离之间的距离会有很大的误差。纽约和新加坡,但为了计算纽约和波士顿之间的距离,它应该可以在100米以内。
  2. 我认为没有任何近似公式可以更快,但我可以看到一些可能会加速的次要实施改进,例如:(1)为什么你懒得从@lat_start分配@l_lat_start,你不能直接使用@lat_start(同样适用于@long_start,@ lalat_end,@ long_end),(2) )而不是在@l_y_diff和@l_x_diff的公式中有111,你可以在那里摆脱它,从而节省乘法,而不是在@l_distance_m的公式中你可以有111000,(3)使用COS(RADIANS( @l_lat_end))或COS(RADIANS(@l_lat_start))只要积分不太远,就不会降低精度,或者如果积分都在同一个城市内,你可以算出任何余弦
除此之外,我认为您需要查看其他想法,例如创建包含结果的表格,以及无论何时从表中添加/删除点,都要在此时更新结果表。