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 の代わりに(3) COS(RADIANS(@l_lat_end)) または COS(RADIANS(@l_lat_start)) を使用しても、ポイントが離れすぎていない限り、精度は低下しません。または、ポイントがすべて同じ都市内にある場合は、都市内の任意のポイントの余弦を計算できます
それとは別に、結果を含むテーブルを作成し、テーブルからポイントが追加/削除されるたびに、その時点で結果テーブルを更新するなど、他のアイデアを検討する必要があると思います。

于 2013-05-24T17:24:39.653 に答える