/**
* Copyright (C) 2011 Brian Ferris <bdferris@onebusaway.org>
* Copyright (C) 2011 Google, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onebusaway.transit_data_federation.impl.shapes;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
import org.onebusaway.geospatial.model.CoordinatePoint;
import org.onebusaway.geospatial.model.XYPoint;
import org.onebusaway.geospatial.services.UTMLibrary;
import org.onebusaway.geospatial.services.UTMProjection;
import org.onebusaway.transit_data_federation.model.ShapePoints;
import org.onebusaway.transit_data_federation.model.ShapePointsFactory;
public class ShapePointsLibraryTest {
@Test
public void test01() {
ShapePointsLibrary spl = new ShapePointsLibrary();
spl.setLocalMinimumThreshold(10);
List<XYPoint> points = new ArrayList<XYPoint>();
points.add(p(0, 0));
points.add(p(1, 0));
points.add(p(2, 0));
points.add(p(3, 0));
points.add(p(4, 0));
double[] shapePointDistances = shapePointDistances(points);
XYPoint target = p(1, 1);
List<PointAndIndex> result = spl.computePotentialAssignments(points,
shapePointDistances, target, 0, points.size());
assertEquals(1, result.size());
PointAndIndex pi = result.get(0);
assertEquals(1.0, pi.point.getX(), 0.0);
assertEquals(0.0, pi.point.getY(), 0.0);
target = p(2, 1);
result = spl.computePotentialAssignments(points, shapePointDistances,
target, 0, points.size());
assertEquals(1, result.size());
pi = result.get(0);
assertEquals(2.0, pi.point.getX(), 0.0);
assertEquals(0.0, pi.point.getY(), 0.0);
}
@Test
public void test02() {
ShapePointsLibrary spl = new ShapePointsLibrary();
spl.setLocalMinimumThreshold(5);
List<XYPoint> points = new ArrayList<XYPoint>();
points.add(p(0, 0));
points.add(p(10, 0));
points.add(p(10, 1));
points.add(p(0, 1));
double[] shapePointDistances = shapePointDistances(points);
XYPoint target = p(1, 0.5);
List<PointAndIndex> result = spl.computePotentialAssignments(points,
shapePointDistances, target, 0, points.size());
assertEquals(2, result.size());
PointAndIndex pi = result.get(0);
assertEquals(1.0, pi.point.getX(), 0.0);
assertEquals(0.0, pi.point.getY(), 0.0);
pi = result.get(1);
assertEquals(1.0, pi.point.getX(), 0.0);
assertEquals(1.0, pi.point.getY(), 0.0);
}
@Test
public void test03() {
ShapePointsLibrary spl = new ShapePointsLibrary();
spl.setLocalMinimumThreshold(15);
List<XYPoint> points = new ArrayList<XYPoint>();
points.add(p(0, 0));
points.add(p(10, 0));
points.add(p(10, 1));
points.add(p(0, 1));
double[] shapePointDistances = shapePointDistances(points);
XYPoint target = p(1, 0.5);
List<PointAndIndex> result = spl.computePotentialAssignments(points,
shapePointDistances, target, 0, points.size());
assertEquals(3, result.size());
PointAndIndex pi = result.get(0);
assertEquals(1.0, pi.point.getX(), 0.0);
assertEquals(0.0, pi.point.getY(), 0.0);
pi = result.get(1);
assertEquals(10.0, pi.point.getX(), 0.0);
assertEquals(0.5, pi.point.getY(), 0.0);
pi = result.get(2);
assertEquals(1.0, pi.point.getX(), 0.0);
assertEquals(1.0, pi.point.getY(), 0.0);
}
@Test
public void test04() {
ShapePointsFactory factory = new ShapePointsFactory();
factory.addPoint(47.66851509562011, -122.29019398384474);
factory.addPoint(47.66486634286269, -122.29014033966445);
factory.addPoint(47.66486634286269, -122.29560131721877);
ShapePoints shapePoints = factory.create();
UTMProjection projection = UTMLibrary.getProjectionForPoint(
shapePoints.getLatForIndex(0), shapePoints.getLonForIndex(0));
ShapePointsLibrary spl = new ShapePointsLibrary();
List<XYPoint> projectedShapePoints = spl.getProjectedShapePoints(
shapePoints, projection);
XYPoint stopPoint = projection.forward(new CoordinatePoint(
47.664922340500475, -122.29066873484038));
double[] distanceAlongShape = {0.0, 405.7, 814.0};
List<PointAndIndex> assignments = spl.computePotentialAssignments(
projectedShapePoints, distanceAlongShape, stopPoint, 0, 3);
assertEquals(2, assignments.size());
PointAndIndex assignment = assignments.get(0);
assertEquals(398.9, assignment.distanceAlongShape, 0.1);
assertEquals(39.6, assignment.distanceFromTarget, 0.1);
assignment = assignments.get(1);
assertEquals(445.4, assignment.distanceAlongShape, 0.1);
assertEquals(6.2, assignment.distanceFromTarget, 0.1);
}
private XYPoint p(double x, double y) {
return new XYPoint(x, y);
}
private double[] shapePointDistances(List<XYPoint> points) {
double[] distances = new double[points.size()];
double accumulatedDistance = 0;
for (int i = 0; i < points.size(); i++) {
XYPoint point = points.get(i);
if (i > 0)
accumulatedDistance += point.getDistance(points.get(i - 1));
distances[i] = accumulatedDistance;
}
return distances;
}
}