将 SQL 地理转换为 SQL 几何或以其他方式提高查找速度

Posted

技术标签:

【中文标题】将 SQL 地理转换为 SQL 几何或以其他方式提高查找速度【英文标题】:Convert SQL Geography to SQL Geometry or otherwise improve lookup speed 【发布时间】:2013-07-26 08:11:35 【问题描述】:

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

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

其他注意事项:

    在我的情况下,查找不仅仅是距离,而是在特定区域(社区或城市)内。 我尝试创建一个计算列,但无法使其持久化以建立索引。我听说这在 2012 年是可能的,但我正在使用 2008 R2。

环境:VS 2012、ASP.NET 4.0、Entity Framework 5(没有将新的地理字段正确映射到 C#,但没关系,因为它们只是在 SQL 端使用)。

问题:

    这是否意味着我的空间索引(基于位置表的地理数据字段)将不会被使用,因为我使用的是 STIntersects 而不是 STDistance? 我是否应该以某种方式从“STIntersects”修改为使用“STDistance”(我不知道每次的距离,因为它会根据区域大小而变化,例如可能是社区或城市)

我看过的好文章:

    http://msdn.microsoft.com/en-us/library/ff929109.aspx http://workshops.opengeo.org/postgis-intro/geography.html

SQL 查询的摘录:

...
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());

【问题讨论】:

只是一个小修正:Entity Framework (5+) 确实支持 Geography 和 Geometry 字段。 谢谢@psousa,我的情况是 EF5 和 ASP.NET 4.0,不兼容使用空间字段。为了正确映射必须是以下两对之一:EF5 & ASP.NET 4.5 -或- ASP.NET 4.0 & EF6。这不是我目前的情况。 啊,你是对的。实际上,我前段时间曾在博客上写过:) 【参考方案1】:

从地理到几何的转换在这里得到解答:Convert geography to geometry SQL Server 2008R2 本质上,先转换为文本,然后再转换回几何体。

计算两点之间的距离肯定比计算相交更快(通常,除非相交是微不足道的,例如仅涉及线或点),但在您的代码中,您允许用户输入相当于多边形的内容,因此,确定您的一个属性位置(经纬度)是否在距多边形的距离内并没有真正的意义,除非您先获取多边形的质心。

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

【讨论】:

以上是关于将 SQL 地理转换为 SQL 几何或以其他方式提高查找速度的主要内容,如果未能解决你的问题,请参考以下文章

将有效的几何形状保存到 Sql Server 2008 地理列中

将地理/几何转换为度/分/秒 - 相同的计算?

Bing Maps API - SQL - 几何与地理类型

验证sql server上几何字段内的点(WGS84)

SQL Server Spatial:是几何类型还是地理类型的变量?

SQL Server:检查两个地理/几何的边界是不是相互交汇