1

SQLServer 2008に巨大なテーブルがあり、技術者によって毎分報告された位置が含まれています。このテーブルについてレポートする必要がありますが、レポートに表示されるレコードの量を制御するには、時間と距離の両方の分離要因を考慮する必要があります。

したがって、クエリは次のようになります

"Return all records with no less than 5 minutes and/or 300 feet between them".

時間の部分はできましたが、距離の部分で苦労しています。各ポイントの緯度と経度がわかっているので、問題を解決するためにSQLServer 2008 空間 UDTを含める必要がある場合でも問題はありません。

私が検討したこと:

  1. 時間係数によってレコードを取得し、隣接するポイント間の距離を計算してクライアントに分離制約を適用し、係数内にあるものを破棄します。(最も簡単ですが、より多くのリソースを消費する必要があります)。

  2. 技術者ごとの最後のレコードをキャッシュに保持し、レコードとその前のレコードの間の距離を事前に計算して、クライアントの制約を解決します。(ただし、距離は事前に計算されているため、1 より少ないリソースを消費する必要があります)。ただし、テーブルが BIGであるため、データセットのサイズが大きくなります。スペースが処理の節約に見合うかどうかはわかりません)。

  3. SQLServer 2008で空間関数を使用しますが、正直なところ、私は読んでいて、このタイプの要件を解決するのに役立つものを見つけることができませんでした。GISの専門家はいますか??

可能な限り最良のオプションを選択したいと思います(おそらく上記にリストされていませんか?)。IMOは、SQLserver機能を最も効率的に使用するものでなければなりません。

4

3 に答える 3

1

Raciel が求めているのは、ポイントのリストを距離の係数で「単純化」する方法です。dateTime で並べ替えられた 100 の空間ポイントのリストがあり、前のポイントからの 1 つのポイント間の距離が正確に 150 フィートであるとします。距離が 300 フィートのポイントのリストだけを取得する必要があり、結果セットはリストになります。約50ポイント...カーソルを使用してこれを行うと想像します。

于 2011-12-15T18:49:04.037 に答える
0

SQL 2008 より前の最も一般的なソリューションは、UDF を使用して、球上の 2 点間の大圏距離を計算することでした。Haversine 式は、おそらく最も一般的に使用される方法です。

もちろん、地球は実際には完全な球体ではありませんが、ほとんどの用途にはこれで十分であると考えられていました。

ご想像のとおり、SQL 2008 では、Geography および Geometry データ型の導入により、このような計算が簡素化され、より正確になりました。これらを使用して距離の計算を簡素化する方法の簡単なサンプルを次に示します。

DECLARE @locations TABLE(locname VARCHAR(100), coord geography)
DECLARE @loc1 geography
DECLARE @loc2 geography


INSERT INTO @locations 
VALUES('HOME', geography::Point(-81.810194, 41.478156, 4326))   --Note: Lat, Long, SRID
                                                                --The 4326 is the SRID (spatial reference id) used by SQL as 
                                                                --a reference to the WGS 84 Standard. This is the same reference
                                                                --used by the GPS system
INSERT INTO @locations 
VALUES('WORK', geography::Point(-81.687771, 41.498227, 4326))

SELECT * FROM @locations

SELECT @loc1 = coord FROM @locations WHERE locname = 'HOME'
SELECT @loc2 = coord FROM @locations WHERE locname = 'WORK'

SELECT @loc1.STDistance(@loc2) * 3.2808399  --STDistance is in meters so we multiply to convert to feet 

SRID は精度向上の鍵です。それが参照するWGS 84仕様には、標準化された座標系と参照楕円体が含まれています。言い換えれば、それは地球の非球状の性質を説明し、純粋な球状の大円計算よりも良い結果をもたらします.

作業で GIS の精度が重要な場合、これが SQL 2008 で実装する最も簡単な方法です。

于 2011-12-13T20:08:42.810 に答える
0

式は次のとおりです。

3949.99 * arcos(sin(LAT1) * sin(LAT2) + cos(LAT1) * cos(LAT2) * cos(LONG1 - LONG2))

地球の半径は 3949.99 マイルです。残りはすべて自明です。この式が大圏距離計算式です。

于 2011-12-13T19:16:47.307 に答える