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)
根据我的经验,两种方法的性能因数据分布和空间索引网格大小而异,因此请测试您自己的数据以决定使用哪种方法.请记住在地理列上创建空间索引.
假设您有数据库中点的纬度和经度值。
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) 根据您所在的纬度校正周长。对于较小的距离,它应该可以正常工作。
| 归档时间: |
|
| 查看次数: |
5335 次 |
| 最近记录: |