嗨,我在保存多个多边形时遇到此异常。如何将 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();
答案 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
以简化几何图形的使用
GeometryFactoryEx
类来处理方向
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);
瞧! - 解决了壳方向错误。