2

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

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

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

我正在考虑将 lat/lng 存储为 SQLServer 2008 中的地理类型。这是这样做的方法吗?

可以直接在sqlserver上面查询吗?还是我需要在代码中做到这一点?这样做的方法是什么?

4

2 回答 2

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
;
于 2012-10-18T09:07:32.400 回答
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 语句直接处理表数据。

于 2012-10-18T08:00:54.903 回答