package com.revolsys.gis.graph.linestring;
import java.util.List;
import com.revolsys.geometry.graph.linestring.LineStringGraph;
import com.revolsys.geometry.model.GeometryFactory;
import com.revolsys.geometry.model.LineString;
import junit.framework.Assert;
public class LineStringGraphTest {
GeometryFactory geometryFactory = GeometryFactory.fixed(3005, 1000.0, 1000.0);
public void checkLines(final List<LineString> actualLines, final String... expectedLines) {
Assert.assertEquals("Number of lines", expectedLines.length, actualLines.size());
for (int i = 0; i < expectedLines.length; i++) {
final LineString expectedLine = this.geometryFactory.geometry(expectedLines[i]);
final LineString actualLine = actualLines.get(i);
Assert.assertEquals("Line not equal", expectedLine, actualLine);
}
}
public void testCleanupEndOfSegmentOverlap() {
final LineString line = this.geometryFactory
.geometry("LINESTRING(844000 1343000,844010 1343000,844020 1343000,844010 1343000)");
final LineStringGraph graph = new LineStringGraph(line);
final List<LineString> lines = graph.getLines();
checkLines(lines, "LINESTRING(844000 1343000,844010 1343000,844020 1343000)");
}
public void testCleanupFigure8WithOverlap() {
final LineString line = this.geometryFactory.geometry(
"LINESTRING(844000 1343000,844100 1343000,844200 1343000,844300 1343000,844300 1343100,844200 1343100,844200 1343000,844100 1343000,844100 1343100,844000 1343100,844000 1343000)");
final LineStringGraph graph = new LineStringGraph(line);
graph.splitEdgesCloseToNodes();
final List<LineString> lines = graph.getLines();
checkLines(lines, "LINESTRING(844000 1343000,844100 1343000)",
"LINESTRING(844100 1343000,844200 1343000)",
"LINESTRING(844200 1343000,844300 1343000,844300 1343100,844200 1343100,844200 1343000)",
"LINESTRING(844100 1343000,844100 1343100,844000 1343100,844000 1343000)");
}
public void testCleanupLoopSegmentOverlap() {
final LineString line = this.geometryFactory.geometry(
"LINESTRING(844000 1343000,844010 1343000,844020 1343000,844020 1343010,844010 1343010,844010 1343000,844020 1343000,844030 1343000)");
final LineStringGraph graph = new LineStringGraph(line);
final List<LineString> lines = graph.getLines();
checkLines(lines, "LINESTRING(844000 1343000,844010 1343000)",
"LINESTRING(844010 1343000,844020 1343000)",
"LINESTRING(844020 1343000,844020 1343010,844010 1343010,844010 1343000)",
"LINESTRING(844020 1343000,844030 1343000)");
}
public void testCleanupMidSegmentOverlap() {
final LineString line = this.geometryFactory.geometry(
"LINESTRING(844000 1343000,844010 1343000,844020 1343000,844010 1343000,844020 1343000,844030 1343000)");
final LineStringGraph graph = new LineStringGraph(line);
final List<LineString> lines = graph.getLines();
checkLines(lines, "LINESTRING(844000 1343000,844010 1343000,844020 1343000,844030 1343000)");
}
public void testCleanupOverlapSpike() {
final LineString line = this.geometryFactory.geometry(
"LINESTRING(844000 1343000,844010 1343000,844010 1343010,844010 1343000,844100 1343000)");
final LineStringGraph graph = new LineStringGraph(line);
final List<LineString> lines = graph.getLines();
checkLines(lines, "LINESTRING(844000 1343000,844010 1343000)",
"LINESTRING(844010 1343000,844010 1343010)", "LINESTRING(844010 1343000,844100 1343000)");
}
/**
* +---+ | | ===S---+
*/
public void testCleanupPOverlapNotStart() {
final LineString line = this.geometryFactory.geometry(
"LINESTRING(844100 1343000,844000 1343000,844100 1343000,844200 1343000,844200 1343100,844100 1343100,844100 1343000)");
final LineStringGraph lineGraph = new LineStringGraph(line);
lineGraph.splitEdgesCloseToNodes();
lineGraph.splitCrossingEdges();
final List<LineString> lines = lineGraph.getLines();
checkLines(lines, "LINESTRING(844100 1343000,844000 1343000)",
"LINESTRING(844100 1343000,844200 1343000,844200 1343100,844100 1343100,844100 1343000)");
}
public void testCleanupSplitCrossingEdgesMiddle() {
final LineString line = this.geometryFactory
.geometry("LINESTRING(844000 1343000,844100 1343100,844000 1343100,844100 1343000)");
final LineStringGraph graph = new LineStringGraph(line);
graph.splitCrossingEdges();
final List<LineString> lines = graph.getLines();
checkLines(lines, "LINESTRING(844000 1343000,844050 1343050)",
"LINESTRING(844050 1343050,844100 1343100,844000 1343100,844050 1343050)",
"LINESTRING(844050 1343050,844100 1343000)");
}
public void testCleanupSplitEdgesCloseToNodes() {
final LineString line = this.geometryFactory
.geometry("LINESTRING(844000 1343000.001,844100 1343000,844100 1343010,844050 1343000.001)");
final LineStringGraph graph = new LineStringGraph(line);
graph.splitEdgesCloseToNodes();
final List<LineString> lines = graph.getLines();
checkLines(lines, "LINESTRING(844000 1343000.001,844050 1343000.001)",
"LINESTRING(844050 1343000.001,844100 1343000,844100 1343010,844050 1343000.001)");
}
public void testCleanupStartOverlapWithPShapeAtEnd() {
final LineString line = this.geometryFactory.geometry(
"LINESTRING(844000 1343000,844100 1343000,844200 1343000,844200 1343100,844100 1343100,844100 1343000)");
final LineStringGraph graph = new LineStringGraph(line);
graph.splitEdgesCloseToNodes();
final List<LineString> lines = graph.getLines();
checkLines(lines, "LINESTRING(844000 1343000,844100 1343000)",
"LINESTRING(844100 1343000,844200 1343000,844200 1343100,844100 1343100,844100 1343000)");
}
public void testCleanupWholeSegmentOverlap() {
final LineString line = this.geometryFactory
.geometry("LINESTRING(844000 1343000,844100 1343000,844000 1343000)");
final LineStringGraph graph = new LineStringGraph(line);
final List<LineString> lines = graph.getLines();
checkLines(lines, "LINESTRING(844000 1343000,844100 1343000)");
}
public void testIntersectionFalseEndEnd() {
final LineString line1 = this.geometryFactory
.geometry("LINESTRING(844000 1343000,844100 1343000,844200 1343000)");
final LineStringGraph graph = new LineStringGraph(line1);
final LineString line2 = this.geometryFactory
.geometry("LINESTRING(844400 1343000,844300 1343000,844200 1343000)");
final boolean intersects = graph.intersects(line2);
Assert.assertEquals("Intersects incorrect", false, intersects);
}
public void testIntersectionFalseEndStart() {
final LineString line1 = this.geometryFactory
.geometry("LINESTRING(844000 1343000,844100 1343000,844200 1343000)");
final LineStringGraph graph = new LineStringGraph(line1);
final LineString line2 = this.geometryFactory
.geometry("LINESTRING(844200 1343000,844300 1343000,844400 1343000)");
final boolean intersects = graph.intersects(line2);
Assert.assertEquals("Intersects incorrect", false, intersects);
}
public void testIntersectionFalseLoopEndLoop() {
final LineString line1 = this.geometryFactory.geometry(
"LINESTRING(1190705.094 390263.56,1190787.013 390248.01,1190811.675 390258.037,1190810.052 390224.994,1190801.125 390198.639,1190799.709 390184.59,1190796.247 390171.454,1190786.65 390161.059,1190772.755 390157.479,1190737.214 390156.946)");
final LineStringGraph graph = new LineStringGraph(line1);
final LineString line2 = this.geometryFactory.geometry(
"LINESTRING(1190737.214 390156.946,1190735.656 390156.923,1190734.175 390153.953,1190737.214 390156.946)");
final boolean intersects = graph.intersects(line2);
Assert.assertEquals("Intersects incorrect", false, intersects);
}
public void testIntersectionFalseStartEnd() {
final LineString line1 = this.geometryFactory
.geometry("LINESTRING(844200 1343000,844300 1343000,844400 1343000)");
final LineStringGraph graph = new LineStringGraph(line1);
final LineString line2 = this.geometryFactory
.geometry("LINESTRING(844000 1343000,844100 1343000,844200 1343000)");
final boolean intersects = graph.intersects(line2);
Assert.assertEquals("Intersects incorrect", false, intersects);
}
//
//
// public void testIntersectionTrueCloseMiddleMiddle() {
// final LineString line1 =
// geometryFactory.createGeometry("LINESTRING(800000 1000000.001,800010
// 1000000.0005,800020 1000000)");
// final GeometryGraph graph = new GeometryGraph(line1);
// final LineString line2 =
// geometryFactory.createGeometry("LINESTRING(800000 1000000,800010
// 1000000,800020 1000000)");
//
// final boolean intersects = graph.intersects(line2);
// Assert.assertEquals("Intersects incorrect", true, intersects);
// }
public void testIntersectionFalseStartEndEndStart() {
final LineString line1 = this.geometryFactory
.geometry("LINESTRING(800000 1000000,800010 1000000,800010 1000010)");
final LineStringGraph graph = new LineStringGraph(line1);
final LineString line2 = this.geometryFactory
.geometry("LINESTRING(800010 1000010,800000 1000010,800000 1000000)");
final boolean intersects = graph.intersects(line2);
Assert.assertEquals("Intersects incorrect", false, intersects);
}
public void testIntersectionFalseStartLoop() {
final LineString line1 = this.geometryFactory.geometry(
"LINESTRING(800000 1000010,800010 1000010,800010 1000020,800000 1000020,800000 1000010)");
final LineStringGraph graph = new LineStringGraph(line1);
final LineString line2 = this.geometryFactory
.geometry("LINESTRING(800000 1000010,800000 1000000)");
final boolean intersects = graph.intersects(line2);
Assert.assertEquals("Intersects incorrect", false, intersects);
}
public void testIntersectionFalseStartLoop1() {
final LineString line1 = this.geometryFactory.geometry(
"LINESTRING(1189556.287 388686.558,1189562.632 388678.83,1189600.858 388676.435,1189628.151 388671.584,1189641.422 388666.145,1189652.815 388657.629,1189661.246 388647.99,1189673.352 388622.518,1189682.078 388581.915,1189682.664 388567.95,1189676.365 388550.699,1189664.681 388542.216,1189651.787 388538.678,1189609.68 388537.912,1189596.534 388540.359,1189585.183 388547.877,1189574.749 388557.432,1189566.276 388568.068,1189554.171 388593.541,1189552.039 388620.431,1189556.918 388647.614,1189556.58 388679.576,1189556.287 388686.558)");
final LineStringGraph graph = new LineStringGraph(line1);
final LineString line2 = this.geometryFactory
.geometry("LINESTRING(1189556.287 388686.558,1189555.995 388693.54,1189555.182 388694.284)");
final boolean intersects = graph.intersects(line2);
Assert.assertEquals("Intersects incorrect", false, intersects);
}
public void testIntersectionFalseStartStart() {
final LineString line1 = this.geometryFactory
.geometry("LINESTRING(844000 1343000,844100 1343000,844200 1343000)");
final LineStringGraph graph = new LineStringGraph(line1);
final LineString line2 = this.geometryFactory
.geometry("LINESTRING(844000 1343000,843900 1343000,843800 1343000)");
final boolean intersects = graph.intersects(line2);
Assert.assertEquals("Intersects incorrect", false, intersects);
}
public void testIntersectionTrueEndMiddle() {
final LineString line1 = this.geometryFactory
.geometry("LINESTRING(800020 1000010,800010 1000010,800000 1000010)");
final LineStringGraph graph = new LineStringGraph(line1);
final LineString line2 = this.geometryFactory
.geometry("LINESTRING(800000 1000000,800000 1000010,800000 1000020)");
final boolean intersects = graph.intersects(line2);
Assert.assertEquals("Intersects incorrect", true, intersects);
}
public void testIntersectionTrueMiddleEnd() {
final LineString line1 = this.geometryFactory
.geometry("LINESTRING(800000 1000000,800000 1000010,800000 1000020)");
final LineStringGraph graph = new LineStringGraph(line1);
final LineString line2 = this.geometryFactory
.geometry("LINESTRING(800020 1000010,800010 1000010,800000 1000010)");
final boolean intersects = graph.intersects(line2);
Assert.assertEquals("Intersects incorrect", true, intersects);
}
public void testIntersectionTrueMiddleMiddle() {
final LineString line1 = this.geometryFactory
.geometry("LINESTRING(800000 1000020,800010 1000010,800020 1000020)");
final LineStringGraph graph = new LineStringGraph(line1);
final LineString line2 = this.geometryFactory
.geometry("LINESTRING(800000 1000000,800010 1000010,800020 1000000)");
final boolean intersects = graph.intersects(line2);
Assert.assertEquals("Intersects incorrect", true, intersects);
}
public void testIntersectionTrueMiddleStart() {
final LineString line1 = this.geometryFactory
.geometry("LINESTRING(800000 1000000,800000 1000010,800000 1000020)");
final LineStringGraph graph = new LineStringGraph(line1);
final LineString line2 = this.geometryFactory
.geometry("LINESTRING(800000 1000010,800010 1000010,800020 1000010)");
final boolean intersects = graph.intersects(line2);
Assert.assertEquals("Intersects incorrect", true, intersects);
}
public void testIntersectionTrueStartMiddle() {
final LineString line1 = this.geometryFactory
.geometry("LINESTRING(800000 1000010,800010 1000010,800020 1000010)");
final LineStringGraph graph = new LineStringGraph(line1);
final LineString line2 = this.geometryFactory
.geometry("LINESTRING(800000 1000000,800000 1000010,800000 1000020)");
final boolean intersects = graph.intersects(line2);
Assert.assertEquals("Intersects incorrect", true, intersects);
}
}