/*
* 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.linearref;
import org.locationtech.jts.geom.Coordinate;
import org.locationtech.jts.geom.Geometry;
/**
* Tests the {@link LocationIndexedLine} class
*/
public class LocationIndexedLineTest
extends AbstractIndexedLineTest {
public static void main(String[] args) {
junit.textui.TestRunner.run(LocationIndexedLineTest.class);
}
public LocationIndexedLineTest(String name) {
super(name);
}
public void testMultiLineStringSimple()
throws Exception
{
runExtractLine("MULTILINESTRING ((0 0, 10 10), (20 20, 30 30))",
new LinearLocation(0, 0, .5),
new LinearLocation(1, 0, .5),
"MULTILINESTRING ((5 5, 10 10), (20 20, 25 25))");
}
public void testMultiLineString2()
throws Exception
{
runExtractLine("MULTILINESTRING ((0 0, 10 10), (20 20, 30 30))",
new LinearLocation(0, 0, 1.0),
new LinearLocation(1, 0, .5),
"MULTILINESTRING ((10 10, 10 10), (20 20, 25 25))");
}
private void runExtractLine(String wkt,
LinearLocation start, LinearLocation end, String expected)
{
Geometry geom = read(wkt);
LocationIndexedLine lil = new LocationIndexedLine(geom);
Geometry result = lil.extractLine(start, end);
//System.out.println(result);
checkExpected(result, expected);
}
protected Geometry indicesOfThenExtract(Geometry input, Geometry subLine)
{
LocationIndexedLine indexedLine = new LocationIndexedLine(input);
LinearLocation[] loc = indexedLine.indicesOf(subLine);
Geometry result = indexedLine.extractLine(loc[0], loc[1]);
return result;
}
protected boolean indexOfAfterCheck(Geometry linearGeom, Coordinate testPt)
{
LocationIndexedLine indexedLine = new LocationIndexedLine(linearGeom);
// check locations are consecutive
LinearLocation loc1 = indexedLine.indexOf(testPt);
LinearLocation loc2 = indexedLine.indexOfAfter(testPt, loc1);
if (loc2.compareTo(loc1) <= 0 ) return false;
// check extracted points are the same as the input
Coordinate pt1 = indexedLine.extractPoint(loc1);
Coordinate pt2 = indexedLine.extractPoint(loc2);
if (! pt1.equals2D(testPt)) return false;
if (! pt2.equals2D(testPt)) return false;
return true;
}
protected boolean indexOfAfterCheck(Geometry linearGeom, Coordinate testPt, Coordinate afterPt)
{
LocationIndexedLine indexedLine = new LocationIndexedLine(linearGeom);
// check that computed location is after check location
LinearLocation afterLoc = indexedLine.indexOf(afterPt);
LinearLocation testLoc = indexedLine.indexOfAfter(testPt, afterLoc);
if (testLoc.compareTo(afterLoc) < 0 ) return false;
return true;
}
protected Coordinate extractOffsetAt(Geometry linearGeom, Coordinate testPt, double offsetDistance)
{
LocationIndexedLine indexedLine = new LocationIndexedLine(linearGeom);
LinearLocation index = indexedLine.indexOf(testPt);
return indexedLine.extractPoint(index, offsetDistance);
}
}