Sql server 杜松子酒 RAISERROR(“%i:%s:为无。使用NOWAIT将形状设置为无”、0、1、@Id、@Name、@i) 结束 使用NOWAIT的RAISERROR(“%i:%s:更新临时表”,0,1,@Id,@Name) 更新@Shapes SET Sha

Sql server 杜松子酒 RAISERROR(“%i:%s:为无。使用NOWAIT将形状设置为无”、0、1、@Id、@Name、@i) 结束 使用NOWAIT的RAISERROR(“%i:%s:更新临时表”,0,1,@Id,@Name) 更新@Shapes SET Sha,sql-server,data-visualization,sql-server-2014,geospatial,Sql Server,Data Visualization,Sql Server 2014,Geospatial,杜松子酒 RAISERROR(“%i:%s:为无。使用NOWAIT将形状设置为无”、0、1、@Id、@Name、@i) 结束 使用NOWAIT的RAISERROR(“%i:%s:更新临时表”,0,1,@Id,@Name) 更新@Shapes SET Shape=@Shape 其中Id=@Id 将下一个从_c获取到@Id、@Name、@Shape、@IsMulti、@MultiWKT、@SingleWKT 结束 关闭(c) 解除分配 挑选 圣奥格鲁菲德, 圣名, st.geog4326作为Shap

杜松子酒 RAISERROR(“%i:%s:为无。使用NOWAIT将形状设置为无”、0、1、@Id、@Name、@i) 结束 使用NOWAIT的RAISERROR(“%i:%s:更新临时表”,0,1,@Id,@Name) 更新@Shapes SET Shape=@Shape 其中Id=@Id 将下一个从_c获取到@Id、@Name、@Shape、@IsMulti、@MultiWKT、@SingleWKT 结束 关闭(c) 解除分配 挑选 圣奥格鲁菲德, 圣名, st.geog4326作为ShapePre, s、 以形状为标志, 案例 当st.geog4326.IsValidDetailed()为'24400:Valid'时,则st.geog4326.STArea()为 ELSE st.geog4326.MakeValid().STArea() 以区域Pre结束, 案例 当s.Shape.IsValidDetailed()为'24400:Valid'时,则s.Shape.STArea()为 ELSE s s.Shape.MakeValid().STArea() 以邮政区号结束 从safertogether2街 在s.Id=st.ogr\U fid上连接@s形状 使用NOWAIT的RAISERROR('更新回安全Gether表',0,1) 更新st 设置geog4326=s.形状 来自@s 在s.Id=st.ogr\U fid上加入安全Gether2 st 带有NOWAIT的RAISERROR('脚本结尾',0,1,@Id,@Name)
在MSSQL上检查有效性不会捕获超过地球一半的多边形吗?我认为地理是一项要求。采矿场地很大。对可视化工具有什么建议吗?检查完这些区域后,我不得不用ReorientObject()翻转大部分区域。这样做的副作用是将所有multiplogon定义都转换为空集合。他们都知道区域接近51e14极限。娱乐的想法,所以他们将是正确的方法?将它们分开单独处理?大于地球一半的多边形是有效的,SQL Server有办法处理它们(因为某些版本)。不幸的是,要允许它们,它必须遵循方向规则——这在shapefile中不存在,因此它们可能会被错误加载。我不知道如何可靠地将shapefile加载到SQL Server。我很了解BigQuery,它使用相同的定向规则,但BigQuery可以加载GeoJson,而我认为SQL Server不支持这一点。谢谢你的帮助。在MSSQL上检查有效性不会捕获超过地球一半的多边形吗?我认为地理是一项要求。采矿场地很大。对可视化工具有什么建议吗?检查完这些区域后,我不得不用ReorientObject()翻转大部分区域。这样做的副作用是将所有multiplogon定义都转换为空集合。他们都知道区域接近51e14极限。娱乐的想法,所以他们将是正确的方法?将它们分开单独处理?大于地球一半的多边形是有效的,SQL Server有办法处理它们(因为某些版本)。不幸的是,要允许它们,它必须遵循方向规则——这在shapefile中不存在,因此它们可能会被错误加载。我不知道如何可靠地将shapefile加载到SQL Server。我很了解BigQuery,它使用相同的定向规则,但BigQuery可以加载GeoJson,而我认为SQL Server不支持这一点。谢谢你的帮助。
SET NOCOUNT ON

DECLARE @ProcessName varchar(50) = 'ST_Geography_Validation'
DECLARE @SessionName varchar(50) = 'ST_GV_' + CONVERT(VARCHAR(19), GETDATE(), 126)
DECLARE @Message varchar(1000)

DECLARE @Id int 
DECLARE @Name varchar(254) 
DECLARE @Shape geography
DECLARE @ValidationDetail varchar(200)
DECLARE @ShapeCount int

DECLARE @SubValidationDetail varchar(200)
DECLARE @SubShape geography
Declare @Area float
DECLARE @AreaStr varchar(20)

DECLARE @i int

DECLARE @IsMulti int = 0
DECLARE @MultiWKT varchar(MAX)
DECLARE @SingleWKT varchar(MAX)

DECLARE @Shapes TABLE
(
    Id int,
    Name varchar(254),
    Shape geography
)

INSERT INTO @Shapes (Id, Name, Shape)
SELECT
    ogr_fid,
    name,
    geog4326
FROM safertogether2


DECLARE @SubShapes TABLE
(
    SubId int PRIMARY KEY,
    SubShape geography,
    Processed bit default 0
)

DECLARE _c CURSOR FOR
    SELECT 
        s.Id, 
        s.name, 
        s.Shape,
        0,
        '',
        ''
    FROM @Shapes s

    OPEN _c  
        FETCH NEXT FROM _c INTO @Id, @Name, @Shape, @IsMulti, @MultiWKT, @SingleWKT

        WHILE @@FETCH_STATUS = 0  
        BEGIN

            DELETE FROM @SubShapes

            SET @ValidationDetail = @Shape.IsValidDetailed() -- This is for the base shape
            IF @ValidationDetail <> '24400: Valid'
            BEGIN
                SET @Shape = @Shape.MakeValid()
            END

            SET @ShapeCount = @Shape.STNumGeometries()
            IF @ShapeCount > 1
            BEGIN
                RAISERROR('%i:%s: is MULTIPOLYGON. Break into subshapes.', 0, 1, @Id, @Name) WITH NOWAIT
                SET @IsMulti = 2
                INSERT INTO @SubShapes(SubId, SubShape)
                SELECT 
                    smg.Id,
                    smg.Geog 
                FROM [dbo].uf_SplitMultiGeography(@Shape) smg
            END
            ELSE IF @ShapeCount = 1
            BEGIN 
                RAISERROR('%i:%s: is SINGLE. Insert Shape whole as Id 1.', 0, 1, @Id, @Name) WITH NOWAIT
                SET @IsMulti = 1
                INSERT INTO @SubShapes(SubId, SubShape) 
                VALUES (1, @Shape)
            END
            ELSE
            BEGIN 
                RAISERROR('%i:%s: is NONE.', 0, 1, @Id, @Name) WITH NOWAIT
                SET @IsMulti = 0
            END

            SET @i = 1
            WHILE @i <= @ShapeCount
            BEGIN
                SELECT @SubShape = s.SubShape
                FROM @SubShapes s
                WHERE SubId = @i

                SET @SubValidationDetail = @SubShape.IsValidDetailed()
                RAISERROR('%i:%s:%i: .IsValidDetailed(): %s', 0, 1, @Id, @Name, @i, @SubValidationDetail) WITH NOWAIT

                IF @SubValidationDetail <> '24400: Valid'
                BEGIN
                    RAISERROR('%i:%s:%i: .MakeValid()', 0, 1, @Id, @Name, @i) WITH NOWAIT
                    SET @SubShape = @SubShape.MakeValid() -- This is for the subshape
                END

                BEGIN TRY
                    SET @Area = @SubShape.STArea()
                END TRY
                BEGIN CATCH
                    SET @Message = 'While getting the Area of a subshape'
                    EXEC usp_Log_Error @ProcessName, @SessionName, @Message
                END CATCH
            
                SET @AreaStr = LTRIM(STR(@Area, 20, 5))
                RAISERROR('%i:%s:%i: .STArea(): Pre: %s', 0, 1, @Id, @Name, @i, @AreaStr) WITH NOWAIT
                IF @Area > 510000000000000
                BEGIN
                    RAISERROR('%i:%s:%i: .ReorientObject()', 0, 1, @Id, @Name, @i) WITH NOWAIT
                    SET @SubShape = @SubShape.ReorientObject()
                    SET @Area = @SubShape.STArea()
                    SET @AreaStr = LTRIM(STR(@Area, 20, 5))
                    RAISERROR('%i:%s:%i: .STArea(): Post: %s', 0, 1, @Id, @Name, @i, @AreaStr) WITH NOWAIT
                END

                UPDATE @SubShapes 
                SET SubShape = @SubShape
                WHERE SubId = @Id

                IF @IsMulti = 2
                BEGIN
                    RAISERROR('%i:%s:%i: MULTIPOLYGON member.  Process WKT for recombination', 0, 1, @Id, @Name, @i) WITH NOWAIT
                    BEGIN TRY
                        SET @SingleWKT = @SubShape.STAsText()
                    END TRY
                    BEGIN CATCH
                        SET @Message = 'While getting the WKT of a subshape'
                        EXEC usp_Log_Error @ProcessName, @SessionName, @Message
                    END CATCH

                    SET @SingleWKT = REPLACE(@SingleWKT, 'POLYGON', '')
                    IF (@i <> @ShapeCount)
                    BEGIN
                        SET @SingleWKT = REPLACE(@SingleWKT, '))', ')),')
                    END
                    SET @MultiWKT = @MultiWKT + @SingleWKT
                END
                SET @i = @i + 1
            END

        
            IF @IsMulti = 2
            BEGIN
                RAISERROR('%i:%s: Is a MULTIPOLYGON.  Recreate from updated WKT.', 0, 1, @Id, @Name, @i) WITH NOWAIT
                SET @MultiWKT = 'MULTIPOLYGON(' + @MultiWKT + ')'
                BEGIN TRY
                    SET @Shape = geography::STGeomFromText(@MultiWKT, 4326)
                END TRY
                BEGIN CATCH
                    SET @Message = 'While creating a multipolygon'
                    EXEC usp_Log_Error @ProcessName, @SessionName, @Message
                END CATCH
            END
            ELSE IF @IsMulti = 1
            BEGIN
                RAISERROR('%i:%s: Is SINGLE.  Set Shape to subshape', 0, 1, @Id, @Name, @i) WITH NOWAIT
                SET @Shape = @SubShape
            END
            ELSE
            BEGIN
                RAISERROR('%i:%s: Is NONE.  Set Shape to none', 0, 1, @Id, @Name, @i) WITH NOWAIT
            END

            RAISERROR('%i:%s: Update temp table', 0, 1, @Id, @Name) WITH NOWAIT
            UPDATE @Shapes
            SET Shape = @Shape
            WHERE Id = @Id

            FETCH NEXT FROM _c INTO @Id, @Name, @Shape, @IsMulti, @MultiWKT, @SingleWKT
        END
    CLOSE _c
DEALLOCATE _c

select 
    st.ogr_fid, 
    st.name, 
    st.geog4326 as ShapePre, 
    s.Shape as ShapePost,
    CASE 
        WHEN  st.geog4326.IsValidDetailed() = '24400: Valid' then st.geog4326.STArea()
        ELSE st.geog4326.MakeValid().STArea()
    END as AreaPre,
    CASE 
        WHEN  s.Shape.IsValidDetailed() = '24400: Valid' then s.Shape.STArea()
        ELSE s.Shape.MakeValid().STArea()
    END as AreaPost  
from safertogether2 st
join @Shapes s ON s.Id = st.ogr_fid

RAISERROR('Update back to safertogether table', 0, 1) WITH NOWAIT
UPDATE st
SET geog4326 = s.Shape
FROM @Shapes s
JOIN safertogether2 st ON s.Id = st.ogr_fid


RAISERROR('End of Script', 0, 1, @Id, @Name) WITH NOWAIT