2015-07-11 83 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的數字更大。 –