2010-07-05 37 views
1

之前,我踏上我的web應用程序使用空間查詢的AA相當不錯的檢修,我想知道這MySQL查詢SQL Server 2008中的工作原理:這個mySQL「空間」查詢是否也在SQL Server 2008中工作?

SELECT id, (3959 * acos(cos(radians(37)) * cos(radians(lat)) * 
     cos(radians(lng) - radians(-122)) + sin(radians(37)) * 
     sin(radians(lat)))) AS distance 
FROM markers HAVING distance < 25 
ORDER BY distance LIMIT 0 , 20; 

還是有更好的辦法在SQL Server 2008中做到這一點?

我的數據庫目前在日本的軍事基地附近有經營該經濟的緯度/經度。但是,我正在查詢該表以查找包含指定基數ID的企業。

Biz table 
---------------------- 
PK BizId bigint (auto increment) 
Name 
Address 
Lat 
Long 
**FK BaseId int (from the MilBase table)** 

空間查詢的基礎上,具有中心緯度/經度和給定半徑(公里數)將是應用程序更好地適應,並會開放一些新的可能性。

任何幫助,不勝感激!

回答

2

它看起來像你選擇兩點之間的距離。在SQL Server 2008中,可以使用geography數據類型的STDistance方法。這將是這個樣子:

SELECT TOP 20 
     geography::STGeomFromText('POINT(-122.0 37.0)', 4326).STDistance(p) 
FROM  markers 
WHERE geography::STGeomFromText('POINT(-122.0 37.0)', 4326).STDistance(p) < 25 
ORDER BY geography::STGeomFromText('POINT(-122.0 37.0)', 4326).STDistance(p); 

pgeography類型,而不是兩個獨立的decimal場的場。您可能還需要在p字段上創建spatial index以獲得更好的性能。

要使用geography數據類型,只需指定字段geographyCREATE TABLE

CREATE TABLE markers ( 
    id  int IDENTITY (1,1), 
    p  geography, 
    title varchar(100) 
); 

將值插入您的markers表現在這個樣子:

INSERT INTO markers (id, p, title) 
VALUES (
    1, 
    geography::STGeomFromText('POINT(-122.0 37.0)', 4326), 
    'My Marker' 
);  

哪裏-122.0是經度,而37.0是緯度。

創建空間索引會是這個樣子:

​​
+0

非常好...謝謝。即使我不使用地理類型,因爲我正在使用LINQ2SQL,您的答案會有所幫助。非常感激。 – Chaddeus 2010-07-07 05:30:27

1

如果你只有25英里範圍內檢索點興趣的話,那麼就完全沒有必要使用球形或大圓數學在距離計算...綽綽有餘是隻使用標準笛卡爾距離公式...

Where Square(Delta-X) + Square(Delta-Y) < 225 

所有你需要做的是在緯度和經度中的差分轉換爲任何單位里程您使用(STA週二英里naultical英里,無論)

如果UR使用海里每度緯度= 60納米的...
和經度的每度等於60個* COS(緯度)納米
這裏如果兩個點是在彼此相距25英里的範圍內,你甚至不必擔心這個因素從一個點到另一個點之間的差異...