2012-10-18 53 views
2

我需要找到「圓給定點重疊」系統的最佳方法。獲取與給定點重疊的所有點(半徑爲圓)

我有很多要點,例如餐館,並且每個項目都有一個地方的點,並且例如「帶出食物」。半徑不同,有的有3公里,有的有10公里。 我正在尋找一個點。例如「我的位置」的緯度/經度。

我需要找到找到與我的觀點重疊的所有餐廳的最佳方式。 (會給我帶來食物)。 (不是圓圈,但圈有什麼重疊我的觀點。)

我想存儲lat/lng作爲SQLServer 2008中的地理類型。是這樣做的嗎?

我可以直接在sqlserver上查詢嗎?或者我需要在代碼中做到這一點? 那麼做什麼?

+0

對於具有半徑的每個點,檢查點是否在搜索半徑+點半徑內。即搜索時將餐廳的半徑添加到您的搜索半徑。 –

回答

2

是的,這正是那種geography和空間方法擅長的東西。下面是一個簡單的例子:

DECLARE @Restaurant TABLE (
    Name nvarchar(50), 
    Location geography, 
    DeliveryRadiusMetres int 
); 

INSERT @Restaurant 
VALUES 
-- long lat 
('Dominos','POINT(-0.109339 51.532835)',2000), 
('Pizza Hut','POINT(-0.102961 51.541157)',2000); 

注意的是,這裏構建geography值我使用從字符串隱式轉換,這在幕後調用geography::Parse

DECLARE @MyLocation geography = 'POINT(-0.115063 51.550231)'; 

SELECT 
    Name 
FROM 
    @Restaurant R 
WHERE 
    R.Location.STDistance(@MyLocation) <= R.DeliveryRadiusMetres 
; 
+1

這可能是這裏最好的答案。它應該比我的版本更有效,因爲它沒有使用多邊形(STBuffer)。如果你需要任何其他形狀除了圓形STWithin是要走的路。 –

1

是的,你可以繪製你的圈子作爲地理/幾何數據類型的點。然後,您可以使用STWithin和STTouches等函數直接針對此數據編寫SQL查詢。

將餐廳位置設置爲半徑點。然後,你可以寫這樣的查詢:

DECLARE @RestaurantCoverage Geometry 
SET @RestaurantCoverage = 'Point(10 5)' --Location 
SET @RestaurantCoverage = @RestaurantCoverage.STBuffer(5)  --Cover radius 
DECLARE @YourLocation Geometry 
SET @YourLocation = 'Point(13 5)' --Your location 

SELECT @YourLocation.STWithin(@RestaurantCoverage) 

http://technet.microsoft.com/en-us/library/bb933991.aspx

而且工作直接針對表中的數據與where語句。

相關問題