【问题标题】:Finding a geography point within a range of another - SQL Server在另一个范围内查找地理点 - SQL Server
【发布时间】:2012-01-13 04:02:42
【问题描述】:

我在 SQL Server 中有一个表,其中包含地理数据类型列。我想查询此表以查找位于另一个给定地理点附近(在一个范围内)的行。有没有人对最好的方法有任何想法? 我有 2 个选项可以在哪里进行此类查询。我可以将它作为存储过程写在 sql server 上,也可以在 c# 代码中完成,因为我使用实体框架进行数据访问。

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

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

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

任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    假设您在 db 中有点的 lat 和 long 值。

    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) 根据您所在的纬度校正圆周。对于较小的距离,它应该可以正常工作。

    【讨论】:

    • 兴趣半径将以公里为单位
    • 好东西,这就是我要找的东西。
    • STBuffer 和 STDistance 不会为此表现更好吗?
    • 不使用SQRT,而是使用radiusofinterest2,等于radiusofinterest * radiusofinterest,是不是性能更好。
    【解决方案2】:

    您已经在使用 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多