0

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

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

其他注意事项:

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

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

问题:

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

我看过的好文章:

  1. http://msdn.microsoft.com/en-us/library/ff929109.aspx
  2. 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());
4

1 回答 1

0

此处回答了从地理到几何的转换:将地理转换为几何 SQL Server 2008R2 本质上,先转换为文本,然后再转换回几何。

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

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

于 2016-10-05T05:03:56.353 回答