package au.gov.amsa.geo.distance; import static au.gov.amsa.geo.distance.DistanceTravelledCalculator.calculateTrafficDensity; import static au.gov.amsa.geo.distance.Renderer.saveAsPng; import static com.google.common.base.Optional.of; import java.io.File; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import org.apache.log4j.Logger; import org.joda.time.DateTime; import rx.Observable; import rx.Observer; import rx.functions.Action1; import rx.functions.Func1; import au.gov.amsa.geo.Util; import au.gov.amsa.geo.distance.DistanceTravelledCalculator.CalculationResult; import au.gov.amsa.geo.model.Options; public class DistanceTravelledMovieMaker { private static Logger log = Logger .getLogger(DistanceTravelledMovieMaker.class); /** * Saves a sequence of image files of Vessel Traffic Density plots to the * <code>imageDirectory</code> with filenames map1.png, map2.png, etc. * * @param options * @param files * @param times * @param imageDirectory */ private static void saveImagesWithTimeRange(final Options options, final Observable<File> files, Observable<Long> times, final String imageDirectory) { times.buffer(2, 1).doOnNext(new Action1<List<Long>>() { AtomicInteger i = new AtomicInteger(); @Override public void call(List<Long> pair) { if (pair.size() < 2) return; Long startTime = pair.get(0); Long finishTime = pair.get(1); saveImageWithTimeRange(options, files, startTime, finishTime, imageDirectory + "/map" + i.incrementAndGet() + ".png"); } }).subscribe(reportErrors()); } private static Observer<Object> reportErrors() { return new Observer<Object>() { @Override public void onCompleted() { log.info("completed"); } @Override public void onError(Throwable e) { log.error(e.getMessage(), e); throw new RuntimeException(e); } @Override public void onNext(Object t) { // do nothing } }; } private static void saveImageWithTimeRange(Options options, final Observable<File> files, long startTime, long finishTime, String filename) { Options op = options.buildFrom() // set start time .startTime(of(startTime)) // set finish time .finishTime(of(finishTime)) // build .build(); CalculationResult result = calculateTrafficDensity(op, files); saveAsPng(Renderer.createImage(op, 2, 1600, result), new File(filename)); } private static Options createOptions(double cellSizeDegrees) { return Options.builder() // set origin latitude .originLat(0) // set origin longitudue .originLon(0) // square cell size in degrees .cellSizeDegrees(cellSizeDegrees) // set bounds // sabine bounds: // .bounds(new Bounds(-10, 110, -45, 158)) // .bounds(new Bounds(15, 90, -20, 125)) // build options .build(); } public static void main(String[] args) { double cellSizeDegrees = 0.2; Options options = createOptions(cellSizeDegrees); String directory = System.getProperty("user.home") + "/Downloads/positions-365-days"; final Observable<File> files = Util.getFiles(directory, "craft-"); Observable<Long> times = Observable.range(1, 13).map( new Func1<Integer, Long>() { @Override public Long call(Integer n) { return DateTime.parse("2013-06-01").plusMonths(n - 1) .getMillis(); } }); saveImagesWithTimeRange(options, files, times, "target"); } }