java - Geotools com.vividsolutions.jts.geom.TopologyException : side location conflict

标签 java geometry geospatial geotools

我收到此异常,但不知道我做错了什么。 我使用线性环创建了两个多边形。 然后我尝试找到是否相交。 我得到这个异常(exception):

com.vividsolutions.jts.geom.TopologyException:端位置冲突 [ (-1.7542192568359292E-100, 1.7542192568359284E-100, 0.0) ]

这是堆栈跟踪:

com.vividsolutions.jts.geom.TopologyException: side location conflict [ (-1.7542192568359292E-100, 1.7542192568359284E-100, 0.0) ]
    at com.vividsolutions.jts.geomgraph.EdgeEndStar.propagateSideLabels(EdgeEndStar.java:300)
    at com.vividsolutions.jts.geomgraph.EdgeEndStar.computeLabelling(EdgeEndStar.java:139)
    at com.vividsolutions.jts.operation.relate.RelateComputer.labelNodeEdges(RelateComputer.java:297)
    at com.vividsolutions.jts.operation.relate.RelateComputer.computeIM(RelateComputer.java:132)
    at com.vividsolutions.jts.operation.relate.RelateOp.getIntersectionMatrix(RelateOp.java:130)
    at com.vividsolutions.jts.operation.relate.RelateOp.relate(RelateOp.java:75)
    at com.vividsolutions.jts.geom.Geometry.relate(Geometry.java:1017)
    at com.vividsolutions.jts.geom.Geometry.intersects(Geometry.java:769)

异常发生在 EdgeEndStar 类中:

//Debug.print(rightLoc != currLoc, this);
          if (rightLoc != currLoc)
            throw new TopologyException("side location conflict", e.getCoordinate());
          if (leftLoc == Location.NONE) {
            Assert.shouldNeverReachHere("found single null side (at " + e.getCoordinate() + ")");
          }
          currLoc = leftLoc;

有坐标的边缘有问题:

  //coordinate: (-262.9001323617947, 313.3121772356619, 0.0)
    //coordinate: (-232.77552855071107, 332.43790711803985, 0.0)

请告诉我我的错误。 我在谷歌上看到了几篇有同样异常(exception)的帖子。有时我确实得到这个异常(exception),有时却没有。当然取决于图形形状:)

我在 linearRing 和 Polygon 上都调用了 isValid()。两个对象都有效。

System.out.println("=== === ===");
        LinearRing linearRing = geometryFactory.createLinearRing(coordinates.toArray(new Coordinate[coordinates.size()]));
        IsValidOp isValidOp  = new IsValidOp(linearRing);
        System.out.println("LinearRing: closed?" + linearRing.isClosed() + " valid?" + linearRing.isValid() + " isValidOp.isValid(); " + isValidOp.isValid());


        Polygon polygon =geometryFactory.createPolygon(linearRing, null);
        isValidOp  = new IsValidOp(polygon);
        System.out.println("Polygon valid? " + polygon.isValid() +" isValidOp" + isValidOp.isValid());
        return new BaseGeometry(polygon);

我不知道我做错了什么。

最佳答案

  1. 将 jts 从 1.12 更新到 1.13
  2. 将 getools 从 9.0 更新到 10-SNAPSHOT

然后验证操作返回 false。 描述说某些位置的点彼此太靠近,geotools 认为线性环与自身相交。 我在点后将坐标截断为 5 位数字,这很有帮助。精度太高。

问题解决了。

关于java - Geotools com.vividsolutions.jts.geom.TopologyException : side location conflict,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17565121/

相关文章:

javascript - 三.js/WebGL : Large spheres appear broken at intersection

c++ - 了解点相对于直线的相对位置的最佳方法是什么?

sql - SQL Spatial JOIN最近邻居

geometry - 给定一组任意点,我如何确定包含这些点的地理围栏?

java - 从 XML 文件添加类路径

java - Tuckey UrlRewrite 中的正则表达式

java - Java 基元数组上的 QuickSort 与 MergeSort

java - 模式版本可以与 jar 文件不同吗?

geometry - 重叠分割三角形

c# - 让 Entity Framework 与 SQL Server 地理空间索引一起使用