C# 获取与给定点重叠的所有点(带半径的圆)
我需要找到一个“圆重叠给定点”系统的最佳方法 我有很多点,比如餐馆,每个项目都有一个地点点,还有一个半径,比如“带出食物”。半径不同,有的有3公里,有的有10公里。 我从一个点开始寻找。e、 g.“我的位置”纬度/经度 我需要找到最好的方法,找到所有与我观点重叠的餐馆。(会给我带来食物)。(不是圆中的点,而是哪些圆与我的点重叠。) 我正在考虑将lat/lng作为地理类型存储在SQLServer2008中。这样做吗 我可以直接在sqlserver上查询吗?还是我需要用代码来做?C# 获取与给定点重叠的所有点(带半径的圆),c#,sql-server-2008,gis,geocoding,C#,Sql Server 2008,Gis,Geocoding,我需要找到一个“圆重叠给定点”系统的最佳方法 我有很多点,比如餐馆,每个项目都有一个地点点,还有一个半径,比如“带出食物”。半径不同,有的有3公里,有的有10公里。 我从一个点开始寻找。e、 g.“我的位置”纬度/经度 我需要找到最好的方法,找到所有与我观点重叠的餐馆。(会给我带来食物)。(不是圆中的点,而是哪些圆与我的点重叠。) 我正在考虑将lat/lng作为地理类型存储在SQLServer2008中。这样做吗 我可以直接在sqlserver上查询吗?还是我需要用代码来做? 怎么做呢?是的,您
怎么做呢?是的,您可以将圆作为点绘制为地理/几何数据类型。然后,您可以使用STWithin和sttouch等函数直接针对这些数据编写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)
还可以使用where语句直接处理表数据。是的,这正是
地理方法和空间方法所擅长的。下面是一个简短的例子:
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
;
DECLARE@MyLocation geography='POINT(-0.115063 51.550231)';
挑选
名称
从…起
@R餐厅
哪里
R.Location.STDistance(@MyLocation)针对每个具有半径的点检查点是否在搜索半径+点半径范围内。例如,在搜索时,将餐厅的半径添加到搜索半径中。这可能是最好的答案。它应该比我的版本更有效,因为它不使用多边形(STBuffer)。如果你需要除圆以外的任何其他形状,这是一个不错的选择。