2011-12-05 11 views
4

SQL Serverに地理データ型の列を持つテーブルがあります。私はこのテーブルを照会して、別の与えられた地理的ポイントの(範囲内に)ある行を見つけたいと思っています。誰かがこれを行うための最善の方法についてのアイディアを持っていますか? このタイプのクエリを実行する場所は2つあります。私はストアドプロシージャとしてSQLサーバーに書き込むことができます。または、データアクセスのためにEntity Frameworkを使用しているので、C#コードで実行できます。別の範囲内の地理的地点を見つける -

範囲(たとえば100m)と地理的ポイントが渡されたクエリがあります。 擬似コードは、このような何か...

選択行rows.geoは、与えられた地理ポイント

の範囲内で、私はSQL Server上での地理クエリのトラブル発見例のビットを持ってい だろうウェブ。

ご協力いただければ幸いです。

答えて

1

db内のポイントの緯度と経度があるとします。

select * from yourtable where SQRT 
(POWER((yourtable.lat - reflat) * COS(reflat/180) * 40000/360, 2) 
+ POWER((yourtable.long - reflong) * 40000/360, 2)) < radiusofinterest 

reflatとreflongは、近くの場所を知りたいポイントです。 radiusofinterestは、この点からの距離です。 40000は地球の円周です。より正確な数字を使用することができます。

私はhavent SQLServerの構文をチェック....しかしそこにいくつかのエラーがあるかもしれません。

cos(reflat)は、あなたが入っているlatに基づいて周長を補正します。距離が小さい場合は正常に動作するはずです。

+0

非常によく見えます。 radiusofinterestは何単位ですか? –

+0

radiusofinterestはkmsになります –

+0

私が探していた素晴らしいものです。 –

9

既にSQL Server SpatialとGeographyの列を使用しているため、次のコードを使用して結果を得ることができます。 STBuffer()とSTIntersects

私の経験から
-- Get the center buffer, 100m radius 
DECLARE @g geography 
SELECT @g = geo.STBuffer(100) FROM yourTable WHERE PointId = something 

-- Get the results within the buffer 
SELECT * FROM yourTable WHERE @g.STIntersects(geo) = 1 

二つの方法のパフォーマンスは、データの分布と空間インデックスのグリッドに応じて変化を使用して

-- Get the center point 
DECLARE @g geography 
SELECT @g = geo FROM yourTable WHERE PointId = something 

-- Get the results, radius 100m 
SELECT * FROM yourTable WHERE @g.STDistance(geo) <= 100 

STDistance()を使用する2つの方法があります。サイズのため、自分のデータをテストして、どちらを使用するかを決めます。ジオ列に空間索引を作成することを忘れないでください。

関連する問題