繁体   English   中英

动态多边形 JSON 数组到 SQL 服务器中的计算几何列

[英]Dynamic Polygon JSON array into calculated Geometry Column in SQL Server

我有一个 SQL 服务器列,其中包含一个构成多边形形状的 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 结合以将其放入新的计算列中?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM