代码之家  ›  专栏  ›  技术社区  ›  Kyle B

SQL选择有效的几何图形而不使用makevalid

  •  0
  • Kyle B  · 技术社区  · 8 年前

    我有一个包含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() 函数引发此错误:

    执行用户定义的例程或聚合“geometry”期间发生.NET框架错误:System.ArgumentException:24144:无法完成此操作,因为实例无效。使用makevalid将实例转换为有效实例。请注意,makevalid可能会导致几何体实例的点轻微移动。System.ArgumentException:在Microsoft.sqlserver.types.sqlgeometry.throwiFindValid()在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() 如果无效,则不会引发任何错误。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Kyle B    8 年前

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

    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 .