2014-09-02 89 views
2

如果我定義WKT格式多邊形,因爲這(經度/緯度):實體框架DbGeography沒有正確計算面積?

string wkt = "POLYGON ((15.981800258159638 45.810693408924287, 15.983624160289764 45.810783148865241, 15.983688533306122 45.809844611497965, 15.981843173503876 45.8096838246252, 15.981800258159638 45.810693408924287))" 

和我創建DbGeography對象作爲這樣的:

var polygon = System.Data.Entity.Spatial.DbGeography.FromText(wkt); 

Area屬性的值是510065621695499.69

如果我用Postgres和PostGis做同樣的事情:

select ST_Area(ST_GeographyFromText(wkt)) 

結果是15496.7483872527這應該是正確的值。

如果我創建通過反轉座標(緯度/經度)多邊形,既DbGeographyST_Area返回相同的值(21247.6269483712)

任何人能解釋這到底是怎麼回事呢?

PS:多邊形位於克羅地亞薩格勒布。

回答

3

這是用多邊形取向。對於這些空間數據類型,「引用橢球系統中的多邊形的內部由左側規則定義」,引用the documentation。參見例如this question,毫無疑問,許多其他人進一步閱讀和解決這個問題的方法。

如果扭轉你的WKT點的順序,你會得到一個區域15496.7447813973(使用SRID of 4326 corresponding to WGS84),這是非常接近你的其他GIS系統給你。我猜的差異可能是由於不同的SRID,但我遠離專家。

注意,你所得到的錯誤結果非常接近510072000平方公里,整個地球的表面積 - 因爲DbGeography使用定向協議這樣做,構建了外,你打算多邊形的

+0

感謝您的回答,這是一個很好的起點:) – marac 2014-09-03 10:39:54

1

爲了增加AakashM的答案,如果你總是希望在較小的區域,你可以這樣做:

public double GetArea(string wellKnownText) 
    { 
     var sqlGeo = SqlGeography.Parse(wellKnownText); 
     var normalArea = sqlGeo.STArea().Value; 
     var reorientedArea = sqlGeo.ReorientObject().STArea().Value; 
     // just trying to not return almost the whole area of our beloved planet... 
     return Math.Min(normalArea, reorientedArea); 
    }