c# - Entity Framework DbGeography 没有正确计算面积?

标签 c# entity-framework gis postgis

如果我将 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,000 平方公里,即整个地球的表面积 - 因为 DbGeography 使用它所使用的方向协议(protocol),它构建了 外部 您想要的多边形。

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

相关文章:

c# - 具有异步 UDP 操作的 .NET IOCP 线程池开销

c# - LINQ : Reading objects from database, 出现异常时遇到问题

sql - 将抽象类和子类保存到数据库

c# - Entity Framework Code First 一对一关系

从 gis x,y 坐标获取美国邮政编码的算法

r - 不使用 gpclib 工具将空间多边形转换为常规数据框

r - 如何在R基地绘制中国 map 与南海

c# - 如何将类隐藏到外部命名空间?类似于 Java 中的包保护修饰符

c# - 如何允许用户在使用 C# 的 WPF 中使用 Devexpress 验证验证事件后更改控制焦点?

entity-framework - 在 Entity Framework 中,如何使用主键的子集创建引用约束?