2012-10-18 52 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语句。

相关问题