【问题标题】:NetTopologySuite said that geometry is not valid, but Sql Server said that it's validNetTopologySuite 说几何无效,但Sql Server 说有效
【发布时间】:2021-11-15 10:51:16
【问题描述】:

我有多边形:

polygon((0 0, 1 0.1, 1 1, 0.5 1, 0.5 1.5, 1 1, 1.5 1.5, 1.5 1, 1 1, 1.5 0.5, 1 0.1, 2 0, 2 2,0 2, 0 0))

肯定它看起来不正常,但是 Sql Server 2017 说它是有效的。
但是当我试图用 NTE 阅读它时,它说它是无效的。这是简单的代码:

var wkt = @"polygon((0 0, 1 0.1, 1 1, 0.5 1, 0.5 1.5, 1 1, 1.5 1.5, 1.5 1, 1 1, 1.5 0.5, 1 0.1, 2 0, 2 2,0 2, 0 0))";
var wktReader2 = new WKTReader();
var initialGeometry = wktReader2.Read(wkt);
var t = initialGeometry.IsValid;

我尝试“玩”PrecisionModels,但没有结果。有什么建议吗?

【问题讨论】:

    标签: c# nettopologysuite


    【解决方案1】:

    你需要明确使用IsValidOp并设置SelfTouchingRingFormingHoleValid = true

    var ivo = new NetTopologySuite.Operation.Valid.IsValidOp(initialGeometry);
    ivo.SelfTouchingRingFormingHoleValid = true;
    bool t = ivo.IsValid;
    

    您的多边形只有一个环定义外壳和孔,而不是单独的。要使其在 NTS 中有效,多边形的 WKT 将是

    POLYGON ((0 0, 0 2, 2 2, 2 0, 1 0.1, 0 0), (1 0.1, 1.5 0.5, 1 1, 1 0.1), 
             (1 1, 1.5 1, 1.5 1.5, 1 1), (1 1, 0.5 1.5, 0.5 1, 1 1))
    

    【讨论】:

      【解决方案2】:

      您是否按照https://github.com/NetTopologySuite/NetTopologySuite/wiki/GettingStarted 尝试过“Buffer0”破解。我今天晚上遇到了类似的问题,在我为我的案例解决的时候发现了这个问题。

      注意: 有时您会遇到无效的几何图形(Geometry.IsValid == false)。这些将在进一步处理它们时引起问题。在大多数情况下,您可以使用 Buffer0 技巧解决此问题:

      geom = geom.Buffer(0);

      var wkt = @"polygon((0 0, 1 0.1, 1 1, 0.5 1, 0.5 1.5, 1 1, 1.5 1.5, 1.5 1, 1 1, 1.5 0.5, 1 0.1, 2 0, 2 2,0 2, 0 0))";
      var wktReader2 = new NetTopologySuite.IO.WKTReader();
      var initialGeometry = wktReader2.Read(wkt);
      var t = initialGeometry.IsValid;
      _logger.LogInformation(t.ToString());        // False
      
      var t2 = initialGeometry.Buffer(0).IsValid;
      _logger.LogInformation(t2.ToString());       // True
      

      【讨论】:

      • 现在你应该使用NetTopologySuite.Geometries.Utilities.GeometryFixer.Fix(invalidGeometry) 来修复无效的几何图形。
      • @FObermaier 尽管添加了 NetTopologySuite.Geometries.Utilities 作为依赖项,但在尝试使用上述方法修复几何时,我收到了GeometryFixer does not exist in the current context
      • @NickyLarson,您需要更新到 NTS v2.4
      猜你喜欢
      • 2020-07-17
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 2016-01-31
      • 2014-12-30
      • 1970-01-01
      • 1970-01-01
      • 2012-05-18
      相关资源
      最近更新 更多