0

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

目前我使用一个函数(如下)来计算点之间的斜边。有什么方法可以提高效率吗?我应该说我已经尝试将纬度/经度转换为空间地理并使用 STDistance() 函数中内置的 SQL(未编入索引),但这甚至更慢。

任何帮助将非常感激。我希望有某种方法可以加快该功能,即使它会稍微降低精度(最近 100m 可能还可以)。提前致谢!

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
4

1 回答 1

2

自 1994 年左右以来,我没有做过任何 SQL 编程,但是我会做以下观察:

  1. 您使用的公式是只要您的坐标之间的距离不会太大的公式。计算纽约和新加坡之间的距离会有很大的误差,但计算纽约和波士顿之间的距离应该在100m以内。
  2. 我认为没有任何近似公式会更快,但是我可以看到一些小的实现改进可能会加快速度,例如(1)你为什么要费心从@lat_start 分配@l_lat_start,你不能只使用@lat_start 直接(与@long_start、@lat_end、@long_end 相同),(2)您可以在 @l_y_diff 和 @l_x_diff 的公式中去掉 111,从而节省乘法,而不是 1000在@l_distance_m 的公式中,您可以有 111000,(3) 使用 COS(RADIANS(@l_lat_end)) 或 COS(RADIANS(@l_lat_start)) 不会降低精度,只要点不太远,或者如果这些点都在同一个城市内,你可以计算出城市中任何一点的余弦
除此之外,我认为您需要查看其他想法,例如创建带有结果的表,以及每当从表中添加/删除点时,更新结果表。

于 2013-05-24T17:24:39.653 回答