如何使用C# Entity Framework 5 DbGeography空间数据来纠正多边形环的方向?

7
我正在使用新的Entity-Framework 5,并使用空间数据类型DbGeography作为我的模型的一部分,以便在一个实例中存储POINT,在另一个实例中存储POLYGON。
当设置我POLYGON的值时,如果我按顺时针方向在地图上绘制多边形,所有内容都可以保存而没有错误。但是,如果我按逆时针方向绘制多边形,则会在SQL级别出现错误,指示数据是无效的地理类型。
现在,在研究了该问题后,发现地理类型对于多边形环定向非常严格。最常见的解决方法似乎是将多边形创建为几何图形,然后将其转换为地理类型。
我正在寻找C#的解决方案,可在将数据发送到SQL之前应用于数据。基本上,需要自动更正坐标数组的环定向。
我尝试捕获错误,然后通过反转数组来重新构建字符串。这在某些情况下可以工作,但首先它不可靠,其次捕获错误会对性能产生重大影响。
谢谢。 Chris
4个回答

3

你好,我曾经遇到过相同的问题,并通过使用以下方法解决了它:

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

更多细节请查看这里


3
这种情况发生的原因是,对于地理类型,当方向与您的视角不同时,您基本上创建了整个地球,除了预期区域。

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

可以使用ReorientObject()进行颠倒。

所以像这样做就可以了

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

2

我自己也遇到过订单问题,我使用了来自SQLSpatialTools的MakeValidGeographyFromText函数来解决它。我在存储过程中使用了以下方式:

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

@pois是一个包含正确格式但错误旋转的坐标字符串。

我不确定这个方法如何与EF-5集成,但我看到有两种方式:

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

0

嗨,亚当,这似乎是应该添加为问题的评论而不是发布为答案的评论。由于您在此处是新手,因此您必须积极参与以赢得更多的声望,这样您才能发布评论。 - VKen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接