将SkipGeographyChecks设置为true

时间:2019-01-30 11:41:58

标签: geometry entity-framework-core polygon

嗨,我在保存多个多边形时遇到此异常。如何将 SkipGeographyChecks 设置为true?

例外:

  

在编写SQL Server地理值时,必须将多边形的外壳逆时针定向。要编写没有外壳的多边形,请设置SkipGeographyChecks

代码示例:

var geometryFactory = NtsGeometryServices.Instance.CreateGeometryFactory(srid: 4326);
var poly = new Polygon[] {
new Polygon(new LinearRing(new Coordinate[]
{
        new Coordinate(19.2385498607974, -51.50390625,0),
        new Coordinate(24.1367281697474, -37.6171875,0),
        new Coordinate(13.8487471475372, -18.10546875,0),
        new Coordinate(19.2385498607974, -51.50390625,0),
                    })),
new Polygon(new LinearRing(new Coordinate[]
{
        new Coordinate(-10.0445849842118, -53.0859375,0),
        new Coordinate(4.13824308398371, -58.7109375,0),
        new Coordinate(2.20770545570541, -68.73046875,0),
        new Coordinate(-8.83079518432893, -79.1015625,0),
        new Coordinate(-17.3820949478775, -81.2109375,0),
        new Coordinate(-21.0332372344673, -51.328125,0),
        new Coordinate(-10.0445849842118, -53.0859375,0),
})) 
};

var currentLocation = geometryFactory.CreateMultiPolygon(poly) as MultiPolygon;
dbset.Polygons = currentLocation;
_context.Add(dbset);
await _context.SaveChangesAsync();

2 个答案:

答案 0 :(得分:1)

据我所知,在从此错误-Github issue for removing the reference to this property中删除对它的引用之前,将SkipGeographyChecks作为属性删除。

我还发现,如果多边形的点按错误的方向排序,则可能会出现此错误。习惯上,点的方向是多边形的“内部”-即:如果多边形的点是逆时针的,则该多边形的面积在边界内,但是如果点是顺时针的,则该面积是边界内的整个世界 (因为这些点基本上是围绕边界外的所有东西逆时针旋转的)。您可以通过检查IPolygon.Shell.IsCCW属性来确定这是否是您的问题。如果这是您的问题,则可以使用IPolygon.Shell.Reverse()方法来解决。有关可以使用的一些实际代码,请参见this GIS StackExchange question(在这里找到了此信息)。

答案 1 :(得分:1)

希望这会为某人节省一些时间。

我还需要解决有问题的 OP 引用的错误(多边形必须逆时针方向)。 我一直在寻找一种干净的方法来解决这个问题,而不必在任何地方反转几何

在阅读了几个问题后,我总结了以下几点:

  • 配置 NetTopologySuite.NtsGeometryServices 以简化几何图形的使用
    • enter image description here
  • 创建了 GeometryFactoryEx 类来处理方向
    • enter image description here
  • 扩展 NetTopologySuite.NtsGeometryServices 以在整个应用程序中使用 GeometryFactoryEx(参见 this comment

这是我最终需要的

扩展NetTopologySuite.NtsGeometryServices的类

我刚刚添加了我需要的构造函数。

    public class NtsGeometryServicesEx : NetTopologySuite.NtsGeometryServices
    {
        public NtsGeometryServicesEx() { }

        public NtsGeometryServicesEx(PrecisionModel precisionModel, int srid)
            : base(precisionModel, srid)
        {
        }
        

        protected override GeometryFactory CreateGeometryFactoryCore(
            PrecisionModel precisionModel,
            int srid,
            CoordinateSequenceFactory coordinateSequenceFactory)
        {
            return new GeometryFactoryEx(precisionModel, srid, coordinateSequenceFactory);
        }
    }

在应用程序启动时将我所需的配置分配给默认的 NetTopologySuite.NtsGeometryServices 实例

  // set default NTS Geometry Services
  NetTopologySuite.NtsGeometryServices.Instance
    = new Infrastructure.Spatial.NtsGeometryServicesEx(
      PrecisionModel.Floating.Value, GeometryExtensions.Wgs84Srid);

瞧! - 解决了壳方向错误。