Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取与给定点重叠的所有点(带半径的圆)_C#_Sql Server 2008_Gis_Geocoding - Fatal编程技术网

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

C# 获取与给定点重叠的所有点(带半径的圆),c#,sql-server-2008,gis,geocoding,C#,Sql Server 2008,Gis,Geocoding,我需要找到一个“圆重叠给定点”系统的最佳方法 我有很多点,比如餐馆,每个项目都有一个地点点,还有一个半径,比如“带出食物”。半径不同,有的有3公里,有的有10公里。 我从一个点开始寻找。e、 g.“我的位置”纬度/经度 我需要找到最好的方法,找到所有与我观点重叠的餐馆。(会给我带来食物)。(不是圆中的点,而是哪些圆与我的点重叠。) 我正在考虑将lat/lng作为地理类型存储在SQLServer2008中。这样做吗 我可以直接在sqlserver上查询吗?还是我需要用代码来做? 怎么做呢?是的,您

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

我有很多点,比如餐馆,每个项目都有一个地点点,还有一个半径,比如“带出食物”。半径不同,有的有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)。如果你需要除圆以外的任何其他形状,这是一个不错的选择。