需要:我正在寻找一个SQL语句来将表的SQL Geography字段的内容转换为SQL Geometry字段类型,我将要添加到现有表的新表字段。或者更好的解决方案,因此发布。
原因:我希望加快查找用户插入的地点附近的位置。位置当前存储在具有Lat,Long和SQLGeography字段类型的表中,Spatial索引基于。由于Geometry类型的计算资源比具有Geography类型的资源更少,我可能会失去准确性以支持执行速度。我目前的计算仅限于美国,我没有看到跨越国际时间表或极点(可能在未来?......)
其他考虑因素:
环境:VS 2012,ASP.NET 4.0,实体框架5(不会将新的地理字段正确地映射到C#中,但它确实没问题,因为它们仅在SQL端使用)。
问题:
我看过的好文章:
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());
答案 0 :(得分:0)
在此处回答从地理位置转换为几何图形:Convert geography to geometry SQL Server 2008R2 基本上,转换为文本然后返回几何。
计算两点之间的距离肯定更快,而不是相交(通常,除非交叉是微不足道的,例如仅涉及线或点),但在您的代码中,您允许用户输入的数量到多边形,所以确定你的一个属性 - 位置(lat long)是否在距离多边形的距离内并不真正有意义,除非你先取多边形的质心。
它将使用空间索引过滤到lat-longs的有效扫描范围,但大多数处理是首先找到用户提供的多边形的边界区域。数据库引擎必须首先执行该部分才能查找候选点。距离非常相似,但需要一些执行快捷方式,因为检查位置是否落入的区域实际上是一个圆圈。