将 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 地理列中