获取与给定点重叠的所有点(半径为圆)

时间:2012-10-18 07:46:41

标签: c# sql-server-2008 gis geocoding

我需要找到“圆圈重叠给定点”系统的最佳方法。

我有很多要点,例如餐馆,每个项目都有一个点的位置,以及例如“带出食物”。半径不同,有些有3公里,有些有10公里。 我正在寻找一个观点。例如“我的位置”纬度/经度。

我需要找到找到所有与我的观点重叠的餐馆的最佳方法。 (会给我带来食物)。 (不是圆圈中的点,但是圆圈与我的观点重叠。)

我正在考虑在SQLServer 2008中将lat / lng存储为地理类型。这是否可以这样做?

我可以直接在sqlserver上查询吗?或者我需要在代码中执行此操作吗? 那是做什么的?

2 个答案:

答案 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 :(得分: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语句对表数据进行处理。