package com.revolsys.gis.graph.linestring; import org.apache.commons.jexl.junit.Asserter; import org.junit.Assert; import org.junit.Test; import com.revolsys.jts.geom.GeometryFactory; import com.revolsys.gis.cs.epsg.EpsgCoordinateSystems; import com.revolsys.gis.jts.LineStringUtil; import com.revolsys.jts.geom.Point; import com.revolsys.gis.model.coordinates.SimpleGeometryFactory; import com.revolsys.gis.model.coordinates.list.DoubleCoordinatesList; import com.revolsys.io.wkt.WktParser; import com.revolsys.jts.geom.Geometry; import com.revolsys.jts.geom.LineString; import com.revolsys.jts.geom.MultiLineString; public class LineStringRelateTest { private static final GeometryFactory GEOMETRY_FACTORY = GeometryFactory.getFactory( 3005, 1000.0, 1.0); final WktParser wkt = new WktParser(GEOMETRY_FACTORY); private static final double[] OFFSETS = { 1200000, 570000, 0 }; public static LineString createLineString(double... coordinates) { final int axisCount = 2; DoubleCoordinatesList points = new DoubleCoordinatesList(coordinates.length / axisCount, axisCount); for (int i = 0; i < points.size(); i++) { for (int axisIndex = 0; axisIndex < axisCount; axisIndex++) { final double value = OFFSETS[axisIndex] + coordinates[i * axisCount + axisIndex]; points.setValue(i, axisIndex, value); } } return GEOMETRY_FACTORY.createLineString(points); } public static MultiLineString multiLineString(double... coordinates) { LineString line = createLineString(coordinates); return GEOMETRY_FACTORY.multiLineString(line); } @Test public void testIntersects() { LineString line1 = createLineString(20, 20, 40, 20, 60, 20); LineString line2 = createLineString(40, 20, 60, 20, 80, 20); MultiLineString expectedIntersection = multiLineString(40, 20, 60, 20); testIntersection(line1, line2, expectedIntersection); } @Test public void testEndOverlaps() { final LineString line1 = createLineString(20, 20, 40, 20, 60, 20); final LineString line2 = createLineString(40, 20, 60, 20, 80, 20); final MultiLineString line1OverlapLine2 = multiLineString(40, 20, 60, 20); // --- // --- testEndOverlaps(line1, line2, line1OverlapLine2, true); // --- // --- testEndOverlaps(line1, line1, null, false); // --- // \-- testEndOverlaps(line1, createLineString(60, 20, 60, 20, 80, 20), null, false); // --- // -- testEndOverlaps(line1, createLineString(20, 20, 40, 20), null, false); // --- // 10--- testEndOverlaps(line1, line2, 10, line1OverlapLine2, true); // --- // 5--- testEndOverlaps(line1, createLineString(20, 20, 40, 20), 5, null, false); } public void testEndOverlaps(LineString line1, LineString line2, MultiLineString expectedIntersection, boolean expectedValue) { LineStringRelate relate = new LineStringRelate(line1, line2); final boolean endOverlaps = relate.isEndOverlaps(1); Assert.assertEquals("Ends overlaps\n" + line1 + "\n" + line2 + "\n", expectedValue, endOverlaps); if (endOverlaps) { assertEquals(expectedIntersection, relate.getOverlap()); } } public void testEndOverlaps(LineString line1, LineString line2, double endDistance, MultiLineString expectedIntersection, boolean expectedValue) { LineStringRelate relate = new LineStringRelate(line1, line2); final boolean endOverlaps = relate.isEndOverlaps(1); Assert.assertEquals("Ends overlaps\n" + line1 + "\n" + line2 + "\n", expectedValue, endOverlaps); if (endOverlaps) { final MultiLineString overlap = relate.getOverlap(); final LineString overlapLine = (LineString)overlap.getGeometryN(0); if (!LineStringUtil.isEndsWithinDistance(overlapLine, line1, 30.0)) { assertEquals(expectedIntersection, overlap); } } } public void testIntersection(LineString line1, LineString line2, MultiLineString expectedIntersection) { LineStringRelate relate = new LineStringRelate(line1, line2); final MultiLineString intersection = relate.getOverlap(); assertEquals(expectedIntersection, intersection); } public void assertEquals(Geometry geometry1, final Geometry geometry2) { final boolean equals = geometry1.equalsExact(geometry2); Assert.assertTrue(geometry1 + "!=" + geometry2, equals); } }