需要:我正在寻找一个 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());