在另一个范围内查找地理点 - SQL Server

时间:2011-12-05 11:53:52

标签: .net sql sql-server entity-framework geography

我在SQL Server中有一个表,其中包含geography datatype列。我想查询此表以查找落在另一个给定地理点附近(在一个范围内)的行。有没有人对最佳方法有任何想法? 我有2个选项可以在哪里进行此类查询。我可以将它作为存储过程在sql server上编写,或者我可以用c#代码编写它,因为我正在使用Entity Framework进行数据访问。

我会有一个范围(例如100米)和传递给它的地理点的查询。 伪代码就是这样......

选择行 其中rows.geo在给定地理点的范围内

我在网上找到SQL Server中的地理查询示例时遇到了一些麻烦。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:12)

您已经在使用SQL Server空间和地理列,因此您只需使用以下内容即可获得结果。有两种方法:

使用STDistance():

-- Get the center point
DECLARE @g geography
SELECT @g = geo FROM yourTable WHERE PointId = something

-- Get the results, radius 100m
SELECT * FROM yourTable WHERE @g.STDistance(geo) <= 100

使用STBuffer()和STIntersects

-- Get the center buffer, 100m radius
DECLARE @g geography
SELECT @g = geo.STBuffer(100) FROM yourTable WHERE PointId = something

-- Get the results within the buffer
SELECT * FROM yourTable WHERE @g.STIntersects(geo) = 1

根据我的经验,两种方法的性能因数据分布和空间索引网格大小而异,因此请测试您自己的数据以决定使用哪种方法。请记住在地理列上创建空间索引。

答案 1 :(得分:2)

假设你有db的点的纬度和长值。

select * from yourtable where SQRT 
( POWER((yourtable.lat - reflat) * COS(reflat/180) * 40000 / 360, 2) 
+ POWER((yourtable.long - reflong) * 40000 / 360, 2)) < radiusofinterest

reflat和reflong是您想知道附近地点的地方。 radiusofinterest是距离这一点的距离。 40000是地球的周长。你可以使用更准确的数字。

我还没有用SQLServer检查语法....所以可能会有一些错误。

cos(reflat)根据您所在的纬度校正周长。它适用于较小的距离。

相关问题