2012-04-19 24 views
1

私は、SQL Server 2008でデータベースを構築したいです。クエリGPS座標

"Give me all rows that are within 5(for example) metres of this coordinate" 

c#で可能ですか?

答えて

4

C#は本当に問題ではない、問題はデータベース自体です。 MS SQL Server 2008と高いが、この記事で説明したように、空間のサポートがあります。空間の拡張機能を使用しない

http://msdn.microsoft.com/en-us/magazine/dd434647.aspx

を、手動でバウンディングボックスを自分で計算する必要があると思います(おそらくから> 5メートルの点が含まれることになります座標)。次に、問題のポイントから5メートル以内にあることを確認するために結果を制限する必要があります。

ここでは、マニュアルの少しPICだ(つまり、多少痛みを伴う。)の計算:

--------------------- 
|  ^  | 
|  +5m lat  | 
|     | 
|-5m lon * +5m lon| 
|     | 
|  -5m lat  | 
|  v   | 
--------------------- 

*は)疑問点です。手動で計算を行う際の問題は、ボックスの角に近い点が(*)点から(おそらく)> 5m離れていることです。あなたは境界円を計算することができますが、それはあなたのSQLクエリの複雑さを増やすでしょう。

要するに、空間的にサポートされたDBが本当に必要です。

+0

あなたは、このための任意のお奨めのチュートリアルがありますか? – MTA

+0

彼が投稿したリンクの途中をスクロールすると、別のポイントのある範囲内にあるポイントを見つける方法が説明されています。 –

+0

c^2 = a^2 + b^2 = 25 + 25 = sqrt(50)= 7,07 ... –

1

あなたが持っているすべては、それが一種の遅くなるつもりだが、このようなクエリはそれを行う必要があり、ラッツとlong型の場合:

select latitude, longitude where (latitude - @lat)^2 + (longitude - @long)^2 <= @dist

@latと@long座標であること、および@dist許容される最大距離です。

編集:Debraceyと私は、2つの手法を統合する方が効果的かもしれないと思います。だから、最初は、本当に速い計算であるバウンディングボックスを使ってクエリを実行します。その後、バウンディングボックステストをパスして、私のクエリに対してそれらをテストします。

+0

これは興味深いアプローチです。 – debracey

+0

2つのアプローチのブレンドがより効率的になるかもしれないので、今考えてみましょう。リストを減らし、残りのメンバーをこれを使って実行するというアプローチで、簡単に見積もることができます。 – SomeGuy

+0

ええ、バウンディングボックスを配置して、DBの計算回数を制限することができます。それは実際には本当に良い答えです....あまりにも悪い私は再びupvoteすることはできません... – debracey

1

私は、これはMySQLのですけど、1.地球はあなたが円ではなく、四角形をしたい2.平らでない... @radiusはキロにする必要があり、5メートルはあまりにも正確である... 1度ですおおよそ111.2キロ(私の前提)。マイルをご希望の場合は、に変更してください。 私は近くのレーダーチェックポイントを計算し、この計算式を使用し

SELECT *, 
(SQRT(POW((lat - @lat), 2) + POW((lon - @lon), 2)) * 111.2) AS radius 
FROM table 
WHERE POW((lat - @lat), 2) + POW((lon - @lon), 2) < POW((@radius/111.2), 2) 
ORDER BY radius ASC 

http://en.wikipedia.org/wiki/Latitude#Meridian_distance_on_the_sphere ...

enter image description here