检查哪些知名文本可以使用geometry :: STPolyFromText进行转换(

时间:2016-03-31 13:01:24

标签: tsql sql-server-2014 spatial-query

我有一些数据可以批量导入到这个表结构中:

CREATE TABLE #Temp
(
    WellKnownText NVARCHAR(MAX)
)

部分参赛作品无效。所以像这样:

SELECT geometry::STPolyFromText(WellKnownText,4326) FROM #Temp

不适用于所有行,因此会失败。

检测哪个WellKnownText无效的最佳方法是什么?我过去使用过MakeValid - 理想情况下我想尽可能地修复条目。

PS:

这不起作用:

SELECT * FROM #Temp 
WHERE geometry::STPolyFromText(WellKnownText,4326).STIsValid() = 0

PPS:

我最终选择了基于循环的方法:

IF OBJECT_ID('tempdb..#Temp') IS NOT NULL DROP TABLE #Temp;
IF OBJECT_ID('tempdb..#Temp1') IS NOT NULL DROP TABLE #Temp1;

DECLARE @LoopCounter INT = 1;
DECLARE @MaxCounter INT;
DECLARE @Valid BIT;
DECLARE @ValidCounter INT;
DECLARE @WellKnownText NVARCHAR(MAX); 

CREATE TABLE #Temp
(
    Guid UNIQUEIDENTIFIER,  
    PostcodeFraction NVARCHAR(50),
    WellKnownText NVARCHAR(MAX),
    GeoJson NVARCHAR(MAX)
);

CREATE TABLE #Temp1
(
    Guid UNIQUEIDENTIFIER,  
    PostcodeFraction NVARCHAR(50),
    WellKnownText NVARCHAR(MAX),
    GeoJson NVARCHAR(MAX)
);

BULK INSERT #Temp FROM 'D:\PolygonData.txt' WITH (FIELDTERMINATOR = '\t', FIRSTROW = 2, ROWTERMINATOR = '\n');

ALTER TABLE #Temp ADD Id INT IDENTITY(1,1);

SELECT @MaxCounter = MAX(Id) FROM #Temp

SET @ValidCounter = 0;

WHILE(@LoopCounter <= @MaxCounter)
BEGIN
    BEGIN TRY
        SELECT @WellKnownText = WellKnownText FROM #Temp WHERE Id = @LoopCounter;
        SET @Valid = GEOMETRY::STGeomFromText(@WellKnownText,4326).STIsValid();
        SET @ValidCounter = @ValidCounter + 1;
    END TRY
    BEGIN CATCH
        SET @Valid = 0;
    END CATCH

    IF(@Valid = 1)
        BEGIN 
            INSERT INTO #TEMP1
            SELECT Guid, PostcodeFraction, WellKnownText, GeoJson FROM #Temp WHERE Id = @LoopCounter; 
        END 

    SET @LoopCounter  = @LoopCounter  + 1;       
END

PRINT @ValidCounter;

SELECT * FROM #TEMP1;

1 个答案:

答案 0 :(得分:1)

根据评论中的要求,提供了一些可能的解决方案

我猜你真的在寻找一个可以CROSS APPLY编辑的功能,比如

SELECT * FROM #Temp T
CROSS APPLY IsWKTValidFunc(T.WellKnownText, 4326) F
WHERE F.IsValid = <somecondition>

(或者甚至添加到计算列中,为您提供插入WKT时设置的标记)

存储过程

https://gis.stackexchange.com/questions/66642/detecting-invalid-wkt-in-text-column-in-sql-server有一个简单的SP,它在try catch块中包装GEOMETREY::STGeomFromText

但是,存储过程不能CROSS APPLY编辑(或从可能的UDF调用),因此这将导致基于游标的解决方案。

UDF

UDF可以交叉应用,但不能有TRY-CATCH块。您也无法从UDF调用上述SP。所以没那么多用。

CLR UDF

GEOMETREY::STGeomFromText调用包装在可以为CROSS APPLIED的CLR UDF中,可以尝试catch和其他错误检查,规则等,并返回指示有效文本的标志。我还没试过这个,但如果你的环境中启用了CLR,这听起来是最好的选择。

希望这会给你一些想法。对这些建议的评论中的反馈表示赞赏。