我有一个包含 SQLGeometry 值的大型数据表。根据 OGC ( Geometry.STisValid() ),许多行包含“格式不正确”的几何。当我检查Geometry.STGeometryType()时,这会导致我的许多几何体抛出错误。
当我使用这个 SQL 查询时,我错误地认为它会遗漏无效的几何:
SELECT [Geometry] FROM Features
WHERE [Geometry] IS NOT NULL
AND [Geometry].STIsValid() = 1
AND [Geometry].STGeometryType() = 'Point'
该STGeometryType()
函数抛出此错误:
执行用户定义的例程或聚合“几何”期间发生 .NET Framework 错误:System.ArgumentException:24144:此操作无法完成,因为实例无效。使用 MakeValid 将实例转换为有效实例。请注意,MakeValid 可能会导致几何实例的点稍微移动。System.ArgumentException:在 Microsoft.SqlServer.Types.SqlGeometry.ThrowIfInvalid() 在 Microsoft.SqlServer.Types.SqlGeometry.STGeometryType()
我使用子查询得到同样的错误:
SELECT G.* FROM (
SELECT [Geometry] FROM Features
WHERE [Geometry] IS NOT NULL
AND [Geometry].STIsValid() = 1
) AS G
WHERE G.[Geometry].STGeometryType() = 'Point'
使用Geometry.MakeValid()函数不是一个可行的解决方案,我不能让 SQL Server 任意更改我的几何,但我需要能够判断它们对于像这样的视图是什么类型:
CREATE VIEW vw_Points
AS
SELECT [Geometry] FROM vwValidFeatures
WHERE [Geometry].STGeometryType() = 'Point'
有没有人有更好的解决方案或解决方法?
我能想出的最佳解决方案是选择所有几何STAsText()然后解析字符串,因为STAsText()
如果它无效不会引发任何错误。