【问题标题】:Entity Framework DbGeography not calculating the Area correctly?实体框架 DbGeography 没有正确计算面积?
【发布时间】:2014-09-02 11:38:05
【问题描述】:

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

【问题讨论】:

    标签: c# entity-framework gis postgis


    【解决方案1】:

    这与多边形方向有关。对于这些空间数据类型,“椭圆体系统中多边形的内部由左手规则定义”,引用the documentation。请参阅例如 this question 以及许多其他人,以进一步阅读和解决此问题的方法。

    如果您在 WKT 中颠倒顺序,您将获得一个区域 15496.7447813973(使用 SRID of 4326 corresponding to WGS84),这与您的其他 GIS 系统提供的非常接近你。我猜的差异可能是由于不同的 SRID,但我远非专家。

    请注意,您得到的错误结果非常接近 510,072,000 平方公里,即整个地球的表面积 - 由于 DbGeography 使用它所使用的定向协议,它构建了 outside你想要的多边形。

    【讨论】:

      【解决方案2】:

      要添加到 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);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多