2012-04-19 234 views
1

我想建立與SQL Server 2008數據庫,其中包括GPS的列coordinate-查詢GPS座標

latitude 

longitude 

,我想建立一個查詢,將是這樣的:

"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米之內。

這裏的手動(即有些痛苦的。)計算的小圖:

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

的(*)是有問題的點。手動進行計算的問題在於,距離(*)點(距離)大於5米的方框附近的角點。您可以計算邊界圓,但這會增加SQL查詢的複雜性。

所以 - 簡而言之 - 你確實需要一個具有空間支持的數據庫。

+0

您有這方面的任何recomended教程? – MTA 2012-04-19 23:44:27

+0

在發佈的鏈接中途滾動,它解釋瞭如何找到落在另一個點的給定範圍內的點。 – 2012-04-19 23:50:26

+0

c^2 = a^2 + b^2 = 25 + 25 = sqrt(50)= 7,07 ... – 2012-04-20 00:09:51

1

如果你已經是拉特和渴望,這會是一種緩慢的,但像這樣的查詢應該這樣做:

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

@lat和@long爲座標,並@dist是允許的最大距離。

編輯:Debracey和我認爲合併我們的兩種技術可能更有效。因此,首先您將使用邊界框進行查詢,這是一個非常快速的計算,然後您會選擇通過邊界框測試的樣本(希望小得多),並針對我的查詢進行測試。

+0

這是一個有趣的方法,沒有想到這一點。 – debracey 2012-04-19 23:54:13

+0

這兩種方法的融合可能會更有效率,現在我想到了。你可以通過你的方法快速估算,減少清單,然後通過這個運行剩下的成員。 – SomeGuy 2012-04-19 23:57:32

+0

是的,你可以把邊框放在限制數據庫必須做的計算次數。這實際上是一個非常好的答案....太糟糕了,我再也不能高舉... – debracey 2012-04-19 23:59:15

1

我知道這是MySQL,但是1.地球不是平的2.你想要圈,而不是平方... @radius應該是千米,5米太精確...... 1度是大概111.2公里(我的假設)。如果您需要里程,請將其更改爲。 http://en.wikipedia.org/wiki/Latitude#Meridian_distance_on_the_sphere

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 

我用這個公式來計算雷達附近的檢查站...

enter image description here