将SQL Geography转换为SQL Geometry或以其他方式提高查找速度

时间:2013-07-26 08:11:35

标签: geospatial coordinate-transformation sqlgeography sqlgeometry

需要:我正在寻找一个SQL语句来将表的SQL Geography字段的内容转换为SQL Geometry字段类型,我将要添加到现有表的新表字段。或者更好的解决方案,因此发布。

原因:我希望加快查找用户插入的地点附近的位置。位置当前存储在具有Lat,Long和SQLGeography字段类型的表中,Spatial索引基于。由于Geometry类型的计算资源比具有Geography类型的资源更少,我可能会失去准确性以支持执行速度。我目前的计算仅限于美国,我没有看到跨越国际时间表或极点(可能在未来?......)

其他考虑因素:

  1. 在我的情况下,查找不仅仅是距离,而是在某个区域(邻域或城市)。
  2. 我曾尝试创建一个计算列,但不能使其持久化以便进行索引。我听说这可能在2012年,但我正在使用2008 R2。
  3. 环境:VS 2012,ASP.NET 4.0,实体框架5(不会将新的地理字段正确地映射到C#中,但它确实没问题,因为它们仅在SQL端使用)。

    问题:

    1. 这是否意味着我的空间索引(基于位置表的地理数据字段)不会被使用,因为我使用的是STIntersects而不是STDistance?
    2. 我是否应该以某种方式从“STIntersects”返工到使用“STDistance”(我不知道每次的距离,因为它会根据区域大小而变化,例如可能是邻里或城市)
    3. 我看过的好文章:

      1. http://msdn.microsoft.com/en-us/library/ff929109.aspx
      2. http://workshops.opengeo.org/postgis-intro/geography.html
      3. SQL QUERY的提取:

        ...
        SELECT @bounds = 'POLYGON(('...'))';
        SELECT @location = geography::Parse(@bounds);
        ...
        SELECT p.ID
        FROM Property p
        INNER JOIN Location l WITH(INDEX(SPATIAL_Location)) ON p.LocationID = l.ID
        WHERE 
        ...
        AND (l.Geodata.STIntersects(@location) = 1
        AND l.Geodata.STDifference(@location).STIsEmpty() = 1)
        ...
        ORDER BY
        ...
        l.Geodata.STDistance(@location.EnvelopeCenter());
        

1 个答案:

答案 0 :(得分:0)

在此处回答从地理位置转换为几何图形:Convert geography to geometry SQL Server 2008R2 基本上,转换为文本然后返回几何。

计算两点之间的距离肯定更快,而不是相交(通常,除非交叉是微不足道的,例如仅涉及线或点),但在您的代码中,您允许用户输入的数量到多边形,所以确定你的一个属性 - 位置(lat long)是否在距离多边形的距离内并不真正有意义,除非你先取多边形的质心。

它将使用空间索引过滤到lat-longs的有效扫描范围,但大多数处理是首先找到用户提供的多边形的边界区域。数据库引擎必须首先执行该部分才能查找候选点。距离非常相似,但需要一些执行快捷方式,因为检查位置是否落入的区域实际上是一个圆圈。