7

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

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

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

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

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

谢谢克里斯

4

4 回答 4

3

嗨我有同样的问题并通过使用解决了它

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

有关更多详细信息,请参见此处

于 2013-03-18T02:18:33.630 回答
2

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

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

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

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

  1. 在使用正确的多边形调用 EF 之前,直接从 C# 中使用该函数。
  2. 在 SQL 服务器上安装 sqlspatialtools,并在那里进行处理。
于 2012-11-21T11:39:59.643 回答
2

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

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

倒车可以用ReorientObject().

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

SqlGeography geoPolygon = ....;
if (geoPolygon.EnvelopeAngle() > 90)
{
    geoPolygon = geoPolygon.ReorientObject();
}
于 2019-07-11T16:20:28.787 回答
0

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

于 2012-10-09T00:20:59.563 回答