【问题标题】:How to correct Polygon Ring Orientation using C# Entity Framework 5 DbGeography Spatial Data如何使用 C# Entity Framework 5 DbGeography 空间数据更正多边形环方向
【发布时间】:2012-09-05 05:07:45
【问题描述】:

我正在使用新的 Entity-Framework 5,使用 Spatial 数据类型 DbGeography 作为我的模型的一部分,用于在一个实例中存储一个 POINT,在另一个实例中存储一个 POLYGON。

当设置我的 POLYGON 的值时,所有保存都没有错误,但是只有当我按顺时针顺序在地图上绘制多边形时才会出现这种情况。如果我以逆时针方向绘制 POLGON,我会在 sql 级别收到错误,指示数据是无效的地理类型。

现在,在对这个问题进行了自己的研究之后,它似乎源于地理数据类型在多边形环方向方面非常严格。最常见的解决方案似乎是将 Polygon 创建为几何图形,然后将其转换为地理类型。

我正在寻找可以在数据发送到 sql 之前应用到数据的 C# 解决方案。基本上可以自动更正坐标数组的环方向。

我尝试捕获错误,然后通过反转数组来重建字符串。这在某些情况下有效,但首先它不可靠,其次捕获错误会对性能造成很大影响。

谢谢 克里斯

【问题讨论】:

    标签: polygon spatial entity-framework-5 geography sqlgeography


    【解决方案1】:

    您好,我遇到了同样的问题并通过使用解决了它

    var sqlGeography = SqlGeography.STGeomFromText().MakeValid()
    var invertedSqlGeography = sqlGeography.ReorientObject();
    

    更多详情见here

    【讨论】:

      【解决方案2】:

      我自己也遇到过订单问题,我使用 SQLSpatialTools 的 MakeValidGeographyFromText 函数解决了这个问题 我在 SP 中以下列方式使用它:

      SET @ge = dbo.MakeValidGeographyFromText(
          'POLYGON((' + @pois + '))', 4326);
      

      其中@pois 是一个字符串,其中包含格式有效但旋转错误的坐标。

      我不确定与 EF-5 集成是否容易,但我看到了两种方法:

      1. 在使用正确的多边形调用 EF 之前,直接从 C# 中使用该函数。
      2. 在 SQL 服务器上安装 sqlspatialtools,并在那里进行处理。

      【讨论】:

        【解决方案3】:

        发生这种情况的原因是,对于地理类型,当从您的角度看方向“错误”时,您基本上创建了整个地球,除了预期的区域。

        第一步是检测是否是这种情况。这可以通过EnvelopeAngle() 方法轻松完成(参见Microsoft documentation)。当这个角度 >90º 时,您的多边形描述的不仅仅是一个半球,这意味着方向不是您想要的,应该颠倒顺序。

        可以使用ReorientObject() 进行反转。

        所以这样的事情应该可以解决问题

        SqlGeography geoPolygon = ....;
        if (geoPolygon.EnvelopeAngle() > 90)
        {
            geoPolygon = geoPolygon.ReorientObject();
        }
        

        【讨论】:

          【解决方案4】:

          这里也有同样的问题,使用 Bing 地图 v7 及其形状工具包绘制多边形:http://bingmapsv7modules.codeplex.com/wikipage?title=Shape%20Toolbox%20Module

          【讨论】:

          • 嗨,亚当,这似乎是一条评论,应该作为评论添加到问题中,而不是作为答案发布。由于您是新来的,因此您必须变得活跃才能获得更多声誉,因此您可以发表评论。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-13
          • 2013-04-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多