package com.github.pfichtner.jrunalyser.base.showcase;
import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.Collection;
import java.util.Comparator;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import com.github.pfichtner.jrunalyser.base.data.DefaultDistance;
import com.github.pfichtner.jrunalyser.base.data.Distance;
import com.github.pfichtner.jrunalyser.base.data.DistanceUnit;
import com.github.pfichtner.jrunalyser.base.data.jaxb.GpxUnmarshaller;
import com.github.pfichtner.jrunalyser.base.data.stat.DefaultStatistics;
import com.github.pfichtner.jrunalyser.base.data.track.DefaultTrack;
import com.github.pfichtner.jrunalyser.base.data.track.Track;
import com.github.pfichtner.jrunalyser.base.data.track.Tracks;
import com.github.pfichtner.jrunalyser.base.data.track.comparator.TrackComparators;
import com.github.pfichtner.jrunalyser.base.data.track.comparator.TrackComparators.ChainedComparator;
import com.github.pfichtner.jrunalyser.base.data.track.comparator.TrackComparators.MultiWaypointDistanceComparator;
import com.google.common.base.Strings;
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.Iterators;
import com.google.common.collect.Ordering;
import com.google.common.collect.Range;
public class TrackCompareShowcase3 {
private static final DefaultDistance INFINITE = DefaultDistance.of(
Integer.MAX_VALUE, DistanceUnit.KILOMETERS);
public static void main(String[] args) throws IOException {
String dir = "/home/xck10h6/gpx/";
File[] allFiles = new File(dir).listFiles(new FileFilter() {
@Override
public boolean accept(File file) {
return file.isFile();
}
});
for (File fa : allFiles) {
final Track ta = loadTrack(fa);
for (File fb : allFiles) {
if (!fb.equals(fa)) {
final Track tb = loadTrack(fb);
ChainedComparator<Track> baseAttributes = TrackComparators.baseAttributes;
Comparator<Track> segmentStartPointsEqual = TrackComparators
.segmentStartPointsEqual(ta, tb, DefaultDistance
.of(150, DistanceUnit.METERS));
int r = ComparisonChain.start()
.compare(ta, tb, baseAttributes)
.compare(ta, tb, segmentStartPointsEqual).result();
if (r == 0) {
System.out.println(getDate(ta) + " =*= " + getDate(tb));
} else {
List<Comparator<Track>> comparators = baseAttributes
.getComparators();
Distance maxDiff = Ordering.natural().max(
TrackComparators.segmentStartPointsEqual(ta,
tb, INFINITE).getDiffs(ta, tb));
boolean diffInRange = Range.<Distance> lessThan(
DefaultDistance.of(300, DistanceUnit.METERS))
.apply(maxDiff);
if (countEq(ta, tb, comparators) > comparators.size() * 3 / 4
&& diffInRange) {
System.out.println(getDate(ta) + " vs. "
+ getDate(tb));
Util.dumpComparators(ta, tb, comparators);
System.out.println("maxDiff is " + maxDiff);
if (diffInRange) {
dumpDiffAmounts(ta, tb);
int i = 0;
for (Iterator<Distance> iterator = TrackComparators
.segmentStartPointsEqual(ta, tb,
INFINITE).getDiffs(ta, tb); iterator
.hasNext();) {
System.out.println(i++ + " "
+ iterator.next());
}
}
System.out.println(Strings.repeat("*", 80));
System.out.println();
}
}
}
}
}
}
private static void dumpDiffAmounts(final Track ta, final Track tb) {
Distance[] ds = new Distance[] {
DefaultDistance.of(300, DistanceUnit.METERS),
DefaultDistance.of(200, DistanceUnit.METERS),
DefaultDistance.of(150, DistanceUnit.METERS),
DefaultDistance.of(100, DistanceUnit.METERS),
DefaultDistance.of(75, DistanceUnit.METERS),
DefaultDistance.of(50, DistanceUnit.METERS),
DefaultDistance.of(25, DistanceUnit.METERS),
DefaultDistance.of(10, DistanceUnit.METERS) };
for (Distance distance : ds) {
MultiWaypointDistanceComparator mwdc = TrackComparators
.segmentStartPointsEqual(ta, tb, distance);
Iterator<Distance> wpDistanceDiffIterator = mwdc.getDiffs(ta, tb);
int count = Iterators.size(Iterators.filter(wpDistanceDiffIterator,
Range.lessThan(distance)));
System.out.println("Amount of Waypoints diffs < " + distance + ": "
+ count + " of " + Iterators.size(mwdc.getDiffs(ta, tb))
+ " waypoints");
}
}
private static <T> int countEq(T ta, T tb,
Collection<Comparator<T>> comparators) {
int eq = 0;
for (Comparator<T> comparator : comparators) {
if (comparator.compare(ta, tb) == 0) {
eq++;
}
}
return eq;
}
private static Date getDate(Track track) {
return new Date(Tracks.getStartPoint(track).getTime().longValue());
}
private static Track loadTrack(File file) throws IOException {
Track track = GpxUnmarshaller.loadTrack(file);
return new DefaultTrack(track.getId(), track.getMetadata(),
track.getWaypoints(), track.getSegments(),
DefaultStatistics.ofTrack(track));
}
}