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

Ben*_*ron 4 .net sql sql-server entity-framework geography

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

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

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

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

任何帮助,将不胜感激.

小智 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
Run Code Online (Sandbox Code Playgroud)

使用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
Run Code Online (Sandbox Code Playgroud)

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


Sid*_*ani 3

假设您有数据库中点的纬度和经度值。

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

reflat 和 reflong 是您想要了解附近地点的点。radiusofinterest 是距该点的距离。40000是地球的周长。你可以使用更准确的数字。

我还没有检查 SQLServer 的语法......所以那里可能有一些错误。

cos(reflat) 根据您所在的纬度校正周长。对于较小的距离,它应该可以正常工作。