2015-07-11 112 views
0

我有弧的列表(顶点)以这种形式:弧/顶点的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; } 
} 

,我可以序列化成一个MultiLineString GeoJSON像这样在第2个圆弧的情况下:

{ "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]]] 
     ] 
    } 

只是好奇,是有可能原来的弧线转换成的MultiPolygon?我也在考虑通过SQL Server的GIS功能来完成它。有没有人遇到类似的问题?任何指针将非常感激。非常感谢。

PS:

的弧是目前不相交并组合时,应形成一个封闭的多边形。下图显示了可能的多边形的一部分。

enter image description here

+0

看起来你有一对正方形的对角,你想得到实际的方块。是对的吗? –

+0

第一部分是正确的,我有一些正方形的对角。但是,它们不一定代表完整的正方形,而只是表示当前不相交的外边框。我添加了一张图片来说明这一点。 – cs0815

+0

啊。所以如果我可以读到最近你问过的其他问题,试图用正方形镶嵌一个更大的区域(你会结合在一起)。 –

回答

1

你在这里。我用非常迭代的方式写出这个巨大的警告,如果我在生产代码中从其他人那里看到这个,我会和他们谈一谈。 :)

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; 
+0

谢谢你,会检查它。 TSQL - 更好......永远不会认为你可以实现这种“基于集合”。 – cs0815

+0

抱歉什么是dbo.Numbers。 – cs0815

+0

这就是所谓的理货表。从字面上看,每列一列的数字是1的数字更大。 –