我有一个带有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.STGeometryType()处的Microsoft.SqlServer.Types.SqlGeometry.ThrowIfInvalid()
我通过子查询得到相同的错误:
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()
如果无效则不会引发任何错误。
答案 0 :(得分:0)
这是我一个人可以找到的最佳解决方案:
CREATE VIEW [vwValidGeometries]
AS
SELECT A.* FROM (
SELECT
Id,
CASE [Geometry].STIsValid()
WHEN 1 THEN [Geometry]
ELSE NULL
END AS 'Geo'
FROM Features
)
WHERE Geo IS NOT NULL
然后:
SELECT * FROM vwValidGeometries WHERE Geo.STGeometryType() = 'Point'
这将STIsValid()
函数隔离得足够多,以至于如果几何无效,任何会引发错误的函数都不会碰到它。
我在MSDN上找到了这个答案。