Arcs/vertices 到多边形
Arcs/vertices to MultiPolygon
我有一个弧形(顶点)列表,格式如下:
public class Arc
{
public Guid Id { get; set; }
public double X1 { get; set; }
public double Y1 { get; set; }
public double X2 { get; set; }
public double Y2 { get; set; }
}
在 2 Arcs 的情况下,我可以将其序列化为这样的 MultiLineString GeoJSON:
{ "type": "MultiLineString",
"coordinates": [
[ [100.0, 0.0], [101.0, 1.0] ],
[ [102.0, 2.0], [103.0, 3.0] ]
]
}
我的基础数据实际上代表多边形。更准确地说 MultiPolygon:
{ "type": "MultiPolygon",
"coordinates": [
[[[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]]],
[[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
[[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]]
]
}
只是好奇,是否可以将原始 Arcs 转换为 MultiPolygon?我也在考虑通过 SQL Server 的 GIS 功能来实现。有没有人遇到过类似的问题?任何指针将不胜感激。非常感谢。
PS:
这些圆弧目前是不相交的,合并后应该形成一个封闭的多边形。下图为潜在多边形的一部分。
给你。我提出这个问题时要注意,我是非常反复地编写它的,如果我在生产代码中从其他人那里遇到这个问题,我会和他们谈谈。 :)
declare @g geography = geography::STGeomFromText('MULTILINESTRING((100 0, 101 1), (102 2, 103 3))', 4236);
declare @multiPoly geography;
with cte as (
select *
from dbo.Numbers as n
cross apply (
select *
from (values
(@g.STGeometryN(number).STStartPoint().Lat, @g.STGeometryN(number).STStartPoint().Long, 1),
(@g.STGeometryN(number).STEndPoint().Lat, @g.STGeometryN(number).STStartPoint().Long, 2),
(@g.STGeometryN(number).STEndPoint().Lat, @g.STGeometryN(number).STEndPoint().Long, 3),
(@g.STGeometryN(number).STStartPoint().Lat, @g.STGeometryN(number).STEndPoint().Long, 4),
(@g.STGeometryN(number).STStartPoint().Lat, @g.STGeometryN(number).STStartPoint().Long, 5)
) as x(Lat, Long, n)
) as decomp
where n.Number <= @g.STNumGeometries()
)
select @multiPoly = geography::STGeomFromText(
'MULTIPOLYGON (' + stuff((
select ', ((' + stuff((
select ', ' + cast(cte.Long as varchar(10)) + ' ' + cast(cte.Lat as varchar(10))
from cte
where Number = n.Number
order by cte.n
for xml path('')
), 1, 2, '') + '))'
from dbo.Numbers as n
where n.Number <= @g.STNumGeometries()
for xml path('')
), 1, 2, '') + ')'
, 4236);
select @multiPoly;
我有一个弧形(顶点)列表,格式如下:
public class Arc
{
public Guid Id { get; set; }
public double X1 { get; set; }
public double Y1 { get; set; }
public double X2 { get; set; }
public double Y2 { get; set; }
}
在 2 Arcs 的情况下,我可以将其序列化为这样的 MultiLineString GeoJSON:
{ "type": "MultiLineString",
"coordinates": [
[ [100.0, 0.0], [101.0, 1.0] ],
[ [102.0, 2.0], [103.0, 3.0] ]
]
}
我的基础数据实际上代表多边形。更准确地说 MultiPolygon:
{ "type": "MultiPolygon",
"coordinates": [
[[[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]]],
[[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]],
[[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]]
]
}
只是好奇,是否可以将原始 Arcs 转换为 MultiPolygon?我也在考虑通过 SQL Server 的 GIS 功能来实现。有没有人遇到过类似的问题?任何指针将不胜感激。非常感谢。
PS:
这些圆弧目前是不相交的,合并后应该形成一个封闭的多边形。下图为潜在多边形的一部分。
给你。我提出这个问题时要注意,我是非常反复地编写它的,如果我在生产代码中从其他人那里遇到这个问题,我会和他们谈谈。 :)
declare @g geography = geography::STGeomFromText('MULTILINESTRING((100 0, 101 1), (102 2, 103 3))', 4236);
declare @multiPoly geography;
with cte as (
select *
from dbo.Numbers as n
cross apply (
select *
from (values
(@g.STGeometryN(number).STStartPoint().Lat, @g.STGeometryN(number).STStartPoint().Long, 1),
(@g.STGeometryN(number).STEndPoint().Lat, @g.STGeometryN(number).STStartPoint().Long, 2),
(@g.STGeometryN(number).STEndPoint().Lat, @g.STGeometryN(number).STEndPoint().Long, 3),
(@g.STGeometryN(number).STStartPoint().Lat, @g.STGeometryN(number).STEndPoint().Long, 4),
(@g.STGeometryN(number).STStartPoint().Lat, @g.STGeometryN(number).STStartPoint().Long, 5)
) as x(Lat, Long, n)
) as decomp
where n.Number <= @g.STNumGeometries()
)
select @multiPoly = geography::STGeomFromText(
'MULTIPOLYGON (' + stuff((
select ', ((' + stuff((
select ', ' + cast(cte.Long as varchar(10)) + ' ' + cast(cte.Lat as varchar(10))
from cte
where Number = n.Number
order by cte.n
for xml path('')
), 1, 2, '') + '))'
from dbo.Numbers as n
where n.Number <= @g.STNumGeometries()
for xml path('')
), 1, 2, '') + ')'
, 4236);
select @multiPoly;