【问题标题】:SQL Select valid Geometries without using MakeValidSQL 选择有效的几何而不使用 MakeValid
【发布时间】:2018-06-29 12:42:42
【问题描述】:

我有一个包含 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() 在无效时不会抛出任何错误。

【问题讨论】:

  • 注意:在我发布这个的时候,我还没有隔离出哪些行抛出了错误,如果我这样做了,我会发布一个例子
  • 我在下面发布了一个答案,不确定这是否是最好的解决方案,如果其他人能想到更好的解决方案,我会接受它。
  • 您是否查看了填充FEATURES 表的过程以了解导致某些行具有无效几何的原因?
  • @Mazhar,这是一个我无法更改的外部进程......而且我不会真的称它们无效,它们只是根据 SQL Server 的实现无效。例如:LINESTRING(12 12 0, 12 12 5) 无效,这是一条垂直线,但 SQL Server 认为它应该是 POINT(12 12 0)。因此,除了解决方法之外,我真的无能为力。

标签: tsql sql-server-2008-r2 sqlgeometry


【解决方案1】:

这是我自己能找到的最佳解决方案:

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找到了这个答案。

【讨论】:

    猜你喜欢
    • 2016-02-18
    • 1970-01-01
    • 2015-02-27
    • 2023-01-03
    • 2021-02-05
    • 2016-09-07
    • 2018-02-03
    • 1970-01-01
    • 2011-09-14
    相关资源
    最近更新 更多