NodedSegmentStringTest.java

/*
 * Copyright (c) 2016 Vivid Solutions.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * and Eclipse Distribution License v. 1.0 which accompanies this distribution.
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v20.html
 * and the Eclipse Distribution License is available at
 *
 * http://www.eclipse.org/org/documents/edl-v10.php.
 */
package org.locationtech.jts.noding;

import java.util.List;

import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Geometry;

import test.jts.GeometryTestCase;

public class NodedSegmentStringTest extends GeometryTestCase {

  public static void main(String[] args) {
    junit.textui.TestRunner.run(NodedSegmentStringTest.class);
  }
  public NodedSegmentStringTest(String name) {
    super(name);
  }

  /**
   * Tests a case which involves nodes added when using the SnappingNoder.
   * In this case one of the added nodes is relatively "far" from its segment, 
   * and "near" the start vertex of the segment.
   * Computing the noding correctly requires the fix to {@link SegmentNode#compareTo(Object)}
   * added in https://github.com/locationtech/jts/pull/399
   * 
   * See https://trac.osgeo.org/geos/ticket/1051
   */
  public void testSegmentNodeOrderingForSnappedNodes() {
    checkNoding("LINESTRING (655103.6628454948 1794805.456674405, 655016.20226 1794940.10998, 655014.8317182435 1794941.5196832407)",
        "MULTIPOINT((655016.29615051334 1794939.965427252), (655016.20226531825 1794940.1099718122), (655016.20226 1794940.10998), (655016.20225819293 1794940.1099794197))",
        new int[] { 0, 0, 1, 1},
        "MULTILINESTRING ((655014.8317182435 1794941.5196832407, 655016.2022581929 1794940.1099794197), (655016.2022581929 1794940.1099794197, 655016.20226 1794940.10998), (655016.20226 1794940.10998, 655016.2022653183 1794940.1099718122), (655016.2022653183 1794940.1099718122, 655016.2961505133 1794939.965427252), (655016.2961505133 1794939.965427252, 655103.6628454948 1794805.456674405))");
  }
  
  private void checkNoding(String wktLine, String wktNodes, int[] segmentIndex, String wktExpected) {
    Geometry line = read(wktLine);
    Geometry pts = read(wktNodes);
    
    NodedSegmentString nss = new NodedSegmentString(line.getCoordinates(), null);
    Coordinate[] node = pts.getCoordinates();
    
    for (int i = 0; i < node.length; i++) {
      nss.addIntersection(node[i], segmentIndex[i]);
    }
    
    List nodedSS = NodingTestUtil.getNodedSubstrings(nss);
    Geometry result = NodingTestUtil.toLines(nodedSS, line.getFactory());
    //System.out.println(result);
    Geometry expected = read(wktExpected);
    checkEqual(expected, result);
  }

}