【问题标题】:Get all points(circles with radius), that overlap given point获取与给定点重叠的所有点(带半径的圆)
【发布时间】:2012-10-18 07:46:40
【问题描述】:

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

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

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

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

我可以直接在sqlserver上查询吗?还是我需要在代码中做到这一点? 有什么办法呢?

【问题讨论】:

  • 对于每个有半径的点,检查点是否在搜索半径 + 点半径内。 IE。搜索时将餐厅的半径添加到您的搜索半径中。

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


【解决方案1】:

是的,这正是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
;

【讨论】:

  • 这可能是这里最好的答案。它应该比我的版本更有效,因为它不使用多边形(STBuffer)。如果您需要除圆形以外的任何其他形状,STWithin 是您的最佳选择。
【解决方案2】:

是的,您可以将圆绘制为地理/几何数据类型的点。然后,您可以使用 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 语句直接处理表数据。

【讨论】:

    猜你喜欢
    • 2018-09-08
    • 1970-01-01
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 2014-01-21
    相关资源
    最近更新 更多