如果我将WKT格式的多边形定义为此(经度/纬度):

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:多边形位于克罗地亚的萨格勒布。

最佳答案

这与多边形方向有关。对于这些空间数据类型,“用左手规则定义椭球系统中多边形的内部”,并用引号the documentation表示。参见例如this question,毫无疑问,还有许多其他文章,以供进一步阅读和解决此问题的方法。

如果反转WKT中点的顺序,则会得到一个15496.7447813973区域(使用SRID of 4326 corresponding to WGS84),该区域与其他GIS系统给您的区域非常接近。我猜想的差异可能是由于不同的SRID,但我离专家还很远。

请注意,您得到的错误结果非常接近510,072,000km²,即整个地球的表面积-由于DbGeography使用它执行的定向协议,因此已构造了您想要的多边形的外部。

关于c# - Entity Framework DbGeography无法正确计算Area?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25622508/

10-10 16:22