我想建立與SQL Server 2008數據庫,其中包括GPS的列coordinate-查詢GPS座標
latitude
和
longitude
,我想建立一個查詢,將是這樣的:
"Give me all rows that are within 5(for example) metres of this coordinate"
這是可能的C#?
我想建立與SQL Server 2008數據庫,其中包括GPS的列coordinate-查詢GPS座標
latitude
和
longitude
,我想建立一個查詢,將是這樣的:
"Give me all rows that are within 5(for example) metres of this coordinate"
這是可能的C#?
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查詢的複雜性。
所以 - 簡而言之 - 你確實需要一個具有空間支持的數據庫。
如果你已經是拉特和渴望,這會是一種緩慢的,但像這樣的查詢應該這樣做:
select latitude, longitude where (latitude - @lat)^2 + (longitude - @long)^2 <= @dist
@lat和@long爲座標,並@dist是允許的最大距離。
編輯:Debracey和我認爲合併我們的兩種技術可能更有效。因此,首先您將使用邊界框進行查詢,這是一個非常快速的計算,然後您會選擇通過邊界框測試的樣本(希望小得多),並針對我的查詢進行測試。
我知道這是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
我用這個公式來計算雷達附近的檢查站...
您有這方面的任何recomended教程? – MTA 2012-04-19 23:44:27
在發佈的鏈接中途滾動,它解釋瞭如何找到落在另一個點的給定範圍內的點。 – 2012-04-19 23:50:26
c^2 = a^2 + b^2 = 25 + 25 = sqrt(50)= 7,07 ... – 2012-04-20 00:09:51