【问题标题】:Dynamic Polygon JSON array into calculated Geometry Column in SQL Server将动态多边形 JSON 数组转换为 SQL Server 中的计算几何列
【发布时间】:2021-03-28 12:34:02
【问题描述】:

我有一个 SQL Server 列,其中包含一个构成多边形形状的 JSON 数组(一系列点坐标)。这是格式正确的 JSON,它是一个点数组。我想将此 JSON 数组转换为计算的几何列。下面的示例是 ONE 记录,但我需要计算列,因为我要将这些数据实时存入数据库。

[
    {"X":-135.4993896484375,"Y":40.8944206237793},
    {"X":-135.49931335449219,"Y":40.89435958862305},
    {"X":-135.4993667602539,"Y":40.89413070678711},
    {"X":-135.49922180175781,"Y":40.8939094543457},
    {"X":-135.49891662597656,"Y":40.89371109008789},
    {"X":-135.49922180175781,"Y":40.89352035522461},
    {"X":-135.49994659423828,"Y":40.89336013793945},
    {"X":-135.5006332397461,"Y":40.893218994140625},
    {"X":-135.50110626220703,"Y":40.892738342285156},
    {"X":-135.4993896484375,"Y":40.8944206237793}
]

我的新专栏可以称为 Shape 或其他任何东西。如何解析它并将其与 STPolyFromText 结合以将其放入新的计算列中?

【问题讨论】:

    标签: sql json sql-server arcgis


    【解决方案1】:
    create or alter function dbo.jsonpolygon(@j nvarchar(max))
    returns geometry
    as
    begin
        declare @geom geometry;
        
        select 
            @geom = 'POLYGON(('+string_agg(concat(v.X, ' ', v.Y), ',') within group (order by j.[key])+'))'
        from openjson(case when isjson(@j) = 1 then @j end) as j
        cross apply openjson(case when isjson(j.value) = 1 then j.value end)
        with
        (
            X varchar(100),
            Y varchar(100)
        ) as v;
        
        return(@geom);
    end
    go
    
    
    create table xyz -- table
    (
    json nvarchar(max),
    geom as dbo.jsonpolygon(json)
    )
    go
    
    insert into xyz(json)
    values(
    '[
        {"X":-135.4993896484375,"Y":40.8944206237793},
        {"X":-135.49931335449219,"Y":40.89435958862305},
        {"X":-135.4993667602539,"Y":40.89413070678711},
        {"X":-135.49922180175781,"Y":40.8939094543457},
        {"X":-135.49891662597656,"Y":40.89371109008789},
        {"X":-135.49922180175781,"Y":40.89352035522461},
        {"X":-135.49994659423828,"Y":40.89336013793945},
        {"X":-135.5006332397461,"Y":40.893218994140625},
        {"X":-135.50110626220703,"Y":40.892738342285156},
        {"X":-135.4993896484375,"Y":40.8944206237793}
    ]'
    ), ('12345'), ('[12345]');
    
    /* this will break the calculated column
    insert into t(json)
    values(
    '[
        {"X":-135.4993896484375,"Y":40.8944206237793}
    ]'
    )
    */
    
    select *
    from xyz;
    go
    
    drop table xyz
    go
    drop function dbo.jsonpolygon
    go
    

    【讨论】:

    • 谢谢!这可以使用列吗?我使用 XY 值作为一个单元格的示例,但实际上我有数千条记录并且需要能够只输入列名。
    • ..@zanzibarjack 。是的,它适用于表格,您可以添加计算几何列。如果您确定所有 json 行都将返回一个有效的多边形,那么您所要做的就是:alter table tableX add geomY as dbo.jsonpolygon(jsoncolumnZ),只需将 tableX 和 geomY&jsoncolumnY 替换为相应的名称(您想要的表和计算列名,包含 json 数据的列名)。可以使函数不易出错:多边形至少需要 4 个点,并且起点 == 终点,您可以将其合并到函数 dbo.jsonpolygon() 中。
    猜你喜欢
    • 2013-09-18
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 2019-10-19
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多