2017-08-07 122 views
0

我有一张大约有400行地理数据的表格,我使用STWithin方法来确定某个点是否存在于其中一行的边界内。在一台服务器上出现几何错误,而在另一台服务器上出现几何错误

在我的测试服务器上,它工作正常。但是,对于最新版本的数据集,查询在其中一行数据上的实时服务器上失败。如果我从查询中排除该行,那么它会成功。

错误是:

消息6522,级别16,状态1,第3行

用户定义 例程或聚合 “几何” 的执行过程中发生

一个.NET Framework错误:系统.ArgumentException:24144: 此操作无法完成,因为该实例无效。 使用MakeValid将实例转换为有效的实例。请注意,MakeValid可能会导致几何实例的点略有偏移。

查询的简化版本是:

DECLARE @Point GEOMETRY = GEOMETRY::Point(416420, 345058, 0) 

SELECT * 
FROM PolygonData 
WHERE @Point.STWithin(GeoField) = 1 

的测试服务器的SQL Server 2012(11.0.2100.60),现场服务器的SQL Server 2012(11.0.6544.0)。

我看不出为什么相同的数据会在一台服务器上成功并在另一台服务器上失败?非常感谢任何帮助,谢谢。

+0

你能否提供WKT的“坏”实例?此外,代码异味是您正在使用几何数据类型(而不是地理位置)来存储地理数据。 –

+0

当然,我已经在这里发布了WKT数据https://gist.github.com/dannyshisler/66da21b345038d4238be92e925490aa5谢谢。 使用SharpGIS使用名为shape2sql.exe的工具从Shapefile(.shp)导入数据,这就是为什么数据采用格式的原因。我还没有找到另一种将.shp数据导入SQL Server的方法。 –

+1

我可以看到它为什么不是一个有效的地理实例(地理假设坐标是纬度/经度,这些不是)。但至于你的实际问题,当我把它加载到我的本地实例时,我有一个奇怪的行为。如果我确实声明了@g geometry = geometry :: STGeomFromText(“你的WKT”,0);选择@g;'一切正常。但是如果我试图在'@ g'上调用一个方法(比如'STNumGeometries()'),它就会抱怨。在它上调用'MakeValid()'使得一切都好。我的怀疑是你有一个内部环定位问题。也就是说,第一个多边形在其中定义了“孔”... –

回答

1

原来表中有无效的数据。添加这个作为答案,但也增加了一种方法来修复表中的数据。

update t 
set g = g.MakeValid() 
from dbo.yourTable as t 
where t.g.STIsValid() = 0; 

(分别与实际的表和列的名称替换yourTableg)通过更新坏数据作为一个时间的操作,就不会产生在选择时调用MakeValid()的开销(如推测读取比写入更频繁)。对于后续的任何数据加载,您也可以实施类似上述的操作。

相关问题