/* * 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 v1.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-v10.html * and the Eclipse Distribution License is available at * * http://www.eclipse.org/org/documents/edl-v10.php. */ package org.locationtech.jts.dissolve; import java.util.List; import org.locationtech.jts.geom.Geometry; import org.locationtech.jts.io.ParseException; import junit.framework.TestCase; import junit.textui.TestRunner; import test.jts.junit.GeometryUtils; public class LineDissolverTest extends TestCase { public static void main(String args[]) { TestRunner.run(LineDissolverTest.class); } public LineDissolverTest(String name) { super(name); } public void testDebug() throws ParseException { //testSingleLine(); testIsolatedRing(); } public void testSingleSegmentLine() throws ParseException { checkDissolve("LINESTRING (0 0, 1 1)", "LINESTRING (0 0, 1 1)"); } public void testTwoSegmentLine() throws ParseException { checkDissolve("LINESTRING (0 0, 1 1, 2 2)", "LINESTRING (0 0, 1 1, 2 2)"); } public void testOverlappingTwoSegmentLines() throws ParseException { checkDissolve( new String[] {"LINESTRING (0 0, 1 1, 2 2)", "LINESTRING (1 1, 2 2, 3 3)"}, "LINESTRING (0 0, 1 1, 2 2, 3 3)"); } public void testOverlappingLines3() throws ParseException { checkDissolve( new String[] {"LINESTRING (0 0, 1 1, 2 2)", "LINESTRING (1 1, 2 2, 3 3)", "LINESTRING (1 1, 2 2, 2 0)" }, "MULTILINESTRING ((0 0, 1 1, 2 2), (2 0, 2 2), (2 2, 3 3))"); } public void testDivergingLines() throws ParseException { checkDissolve( "MULTILINESTRING ((0 0, 1 0, 2 1), (0 0, 1 0, 2 0), (1 0, 2 1, 2 0, 3 0))", "MULTILINESTRING ((0 0, 1 0), (1 0, 2 0), (1 0, 2 1, 2 0), (2 0, 3 0))"); } public void testLollipop() throws ParseException { checkDissolve( "LINESTRING (0 0, 1 0, 2 0, 2 1, 1 0, 0 0)", "MULTILINESTRING ((0 0, 1 0), (1 0, 2 0, 2 1, 1 0))"); } public void testDisjointLines() throws ParseException { checkDissolve( "MULTILINESTRING ((0 0, 1 0, 2 1), (10 0, 11 0, 12 0))", "MULTILINESTRING ((0 0, 1 0, 2 1), (10 0, 11 0, 12 0))"); } public void testSingleLine() throws ParseException { checkDissolve( "MULTILINESTRING ((0 0, 1 0, 2 1))", "LINESTRING (0 0, 1 0, 2 1)"); } public void testOneSegmentY() throws ParseException { checkDissolve("MULTILINESTRING ((0 0, 1 1, 2 2), (1 1, 1 2))", "MULTILINESTRING ((0 0, 1 1), (1 1, 2 2), (1 1, 1 2))"); } public void testTwoSegmentY() throws ParseException { checkDissolve("MULTILINESTRING ((0 0, 9 9, 10 10, 11 11, 20 20), (10 10, 10 20))", "MULTILINESTRING ((10 20, 10 10), (10 10, 9 9, 0 0), (10 10, 11 11, 20 20))"); } public void testIsolatedRing() throws ParseException { checkDissolve("LINESTRING (0 0, 1 1, 1 0, 0 0)", "LINESTRING (0 0, 1 1, 1 0, 0 0)"); } public void testIsolateRingFromMultipleLineStrings() throws ParseException { checkDissolve("MULTILINESTRING ((0 0, 1 0, 1 1), (0 0, 0 1, 1 1))", "LINESTRING (0 0, 0 1, 1 1, 1 0, 0 0)"); } /** * Shows that rings with incident lines are created with the correct node point. * * @throws ParseException */ public void testRingWithTail() throws ParseException { checkDissolve("MULTILINESTRING ((0 0, 1 0, 1 1), (0 0, 0 1, 1 1), (1 0, 2 0))", "MULTILINESTRING ((1 0, 0 0, 0 1, 1 1, 1 0), (1 0, 2 0))"); } public void testZeroLengthStartSegment() throws ParseException { checkDissolve( "MULTILINESTRING ((0 0, 0 0, 2 1))", "LINESTRING (0 0, 2 1)"); } private void checkDissolve(String wkt, String expectedWKT) throws ParseException { checkDissolve(new String[] { wkt }, expectedWKT); } private void checkDissolve(String[] wkt, String expectedWKT) throws ParseException { List geoms = GeometryUtils.readWKT(wkt); Geometry expected = GeometryUtils.readWKT(expectedWKT); checkDissolve(geoms, expected); } private void checkDissolve(List geoms, Geometry expected) { LineDissolver d = new LineDissolver(); d.add(geoms); Geometry result = d.getResult(); boolean equal = result.norm().equalsExact(expected.norm()); if (! equal) { //System.out.println("Expected = " + expected // + " actual = " + result.norm()); } assertTrue(equal); } }