2013-03-01 70 views
3

誰能告訴我怎麼可以從類型「點」的DbGeography的集合對象從DbGeography集合創建DbGeography多邊形點

到目前爲止,我已經得到了創造型「多邊形」的DbGeography對象這創建了多邊形,但我錯過了最初的步驟。

1. DbGeography multipoint = DbGeography.MultiPointFromText("MULTIPOINT(53.095124 -0.864716, 53.021255 -1.337128, 52.808019 -1.345367, 52.86153 -1.018524)", 4326) 

2. DbGeometry temp_multipoint = DbGeometry.MultiPointFromBinary(multipoint.AsBinary(), 4326) 

3. DbGeography polygon = DbGeography.PolygonFromBinary(temp_multipoint.ConvexHull.AsBinary(), 4326); (RESULT) 

問題是從DbGeography列表創建初始的多點地理對象(點)

回答

2

我終於找到了如何從多個點創建多邊形,而無需從WKT創建多邊形。下面的解釋稍微簡化但仍然

var PolygonFromMultiplePoints = new DbGeography(); 

    using (var db = new LocationContext()) 
    { 
     //Select Locations known to be within a certain area which should define the polygon. 
     foreach (var item in db.Locations) 
     { 
      PolygonFromMultiplePoints.Union(item.GeoLocation); 
     } 
    }    
    var temp_multipointgeometry = DbGeometry.MultiPointFromBinary(PolygonFromMultiplePoints.AsBinary(), DbGeometry.DefaultCoordinateSystemId);    
    PolygonFromMultiplePoints = DbGeography.PolygonFromBinary(temp_multipointgeometry.ConvexHull.AsBinary(), DbGeography.DefaultCoordinateSystemId); 

代碼示例假定您已經有一個dbgeography的集合存儲爲數據庫中的點。我的數據庫信息來自從GeoNames導入位置。

+0

對於我的情況,最好使用MultiPointFromText方法,因爲我有90,000個點,並且使用聯合很慢,而且我只需要結果的凸包,因此點的順序無關緊要。 MultiPointFromText不到一秒鐘,而使用聯盟花了一個多小時。 – Betty 2018-02-21 10:24:34

4

使用WKT創建每個點作爲DbGeography對象:

DbGeography point1 = DbGeography.FromText("POINT(53.095124 -0.864716)", 4326); 
DbGeography point2 = DbGeography.FromText("POINT(53.021255 -1.337128)", 4326); 
DbGeography point3 = DbGeography.FromText("POINT(52.808019 -1.345367)", 4326); 
... 
DbGeography polygon = DbGeography.PolygonFromText("POLYGON((53.095124 -0.864716, 53.021255 -1.337128, 52.808019 -1.345367, 53.095124 -0.864716))", 4326); 

有兩點需要注意:

  • WKT格式是經度然後是緯度,不是更直觀的緯度,長度
  • 對於一個多邊形,最後一個點必須與第一點相匹配「關閉關閉」

希望這有助於 - 我還作戰學習多邊形的東西!

請參見本文的WKT格式額外提示:http://en.wikipedia.org/wiki/Well-known_text

+0

感謝您的輸入,但它不是我正在尋找的東西,因爲我已經將數據庫中的所有點都設置爲DbGeography字段。 我自從問題找到另一個解決方案,這將增加這個問題,當我得到的時間。 – Drauka 2013-03-27 10:57:03

+0

找到時間了嗎? – BritishDeveloper 2013-05-03 05:47:51

0

你真的應該做它在C#中,添加點以迭代的方式爲一對夫婦的原因:

  • 您需要確保結束位置與開始位置相同。
  • 由於環形方向,您需要確保順時針添加點。你可以翻轉環,逆時針(sqlGeography.ReorientObject();)。

你正在處理空間數據,但複雜形狀的構造從來就不是爲了T-SQL。最壞的情況是把它放在CLR函數中。