/** * ***************************************************************************** * Copyright 2013 Sebastian Müller * * 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 de.fub.agg2graph.agg.strategy; import de.fub.agg2graph.agg.AggConnection; import de.fub.agg2graph.agg.AggNode; import de.fub.agg2graph.agg.IMergeHandler; import de.fub.agg2graph.agg.ITraceDistance; import de.fub.agg2graph.structs.ClassObjectEditor; import de.fub.agg2graph.structs.GPSCalc; import de.fub.agg2graph.structs.GPSEdge; import de.fub.agg2graph.structs.GPSPoint; import java.util.List; public class GpxmergeTraceDistance implements ITraceDistance { private double angleFactor = 0.3; public double getAngleFactor() { return angleFactor; } public void setAngleFactor(double angleFactor) { this.angleFactor = angleFactor; } /** * Compute the difference of a path to the aggregation. This measure only * guarantees relative correctness when questioned repeatedly for different * paths. A difference of 0 indicates equality while larger values indicate * increasingly different paths. * * @param aggPath * @param tracePoints * @param startIndex * @param dmh * @return Object[] { double bestValue, int bestValueLength } */ @Override public Object[] getPathDifference(List<AggNode> aggPath, List<GPSPoint> tracePoints, int startIndex, IMergeHandler dmh) { if (aggPath.size() > 1 && tracePoints.size() > startIndex + 1) { return new Object[]{ getDistanceViaGradient( aggPath.get(0).getConnectionTo(aggPath.get(1)), new GPSEdge(tracePoints.get(startIndex), tracePoints.get(startIndex + 1))), 1}; } return new Object[]{Double.MAX_VALUE, 0}; } private double getDistanceViaGradient(AggConnection near, GPSEdge currentEdge) { double gradient = GPSCalc.getSmallGradientFromEdges(near, currentEdge); if (gradient > 0.7) { return Double.MAX_VALUE; } double distFrom = GPSCalc.getDistancePointToEdge(near.getFrom(), currentEdge); double distTo = GPSCalc.getDistancePointToEdge(near.getTo(), currentEdge); double length = GPSCalc.getDistance(currentEdge.getFrom(), currentEdge.getTo()); double dist = gradient * angleFactor + ((distFrom + distTo) / length) * (1 - angleFactor); return dist; } // private double getDistanceViaAngle(AggConnection near, GPSEdge // currentEdge) { // double angle = GPSCalc.getAngleBetweenEdges(near, currentEdge); // if (!CartesianCalc.isAngleMax(angle, 30)) { // return Double.MAX_VALUE; // } // double distFrom = GPSCalc.getDistancePointToEdge(near.getFrom(), // currentEdge); // double distTo = GPSCalc.getDistancePointToEdge(near.getTo(), // currentEdge); // double length = GPSCalc.getDistance(currentEdge.getFrom(), // currentEdge.getTo()); // double dist = Math.abs((angle - 180.0) / 180.0) * 3.0 // + (distFrom + distTo) / length; // return dist; // } @Override public List<ClassObjectEditor> getSettings() { return null; } }