package au.gov.amsa.geo.adhoc;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.time.Instant;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Map;
import java.util.Optional;
import com.github.davidmoten.rx.slf4j.Logging;
import au.gov.amsa.ihs.reader.IhsReader;
import au.gov.amsa.ihs.reader.Key;
import au.gov.amsa.navigation.DriftCandidate;
import au.gov.amsa.navigation.DriftCandidates;
import au.gov.amsa.navigation.ShipStaticData;
import au.gov.amsa.navigation.ShipStaticData.Info;
public class SabineDriftCandidatesMain {
public static void main(String[] args) throws FileNotFoundException {
PrintStream out = new PrintStream("target/output.txt");
out.format("%s\t%s\t%s\t%s\t%s\n", "mmsi", "imo", "date", "lat", "lon");
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
Map<Integer, Info> ships = ShipStaticData.getMapFromResource("/ship-data-2014.txt");
Map<String, Map<String, String>> ihs = IhsReader
.fromZipAsMapByMmsi(new File("/media/an/ship-data/ihs/608750-2015-04-01.zip"))
.toBlocking().single();
for (int year = 2012; year <= 2014; year++) {
DriftCandidates
.fromCsv(new File(
"/media/an/drift-candidates/drift-candidates-" + year + ".txt.gz"),
true)
// log
.lift(Logging.<DriftCandidate> logger().showCount().showMemory().every(100000)
.log())
// grab the first position of a drift track
.filter(c -> c.driftingSince() == c.fix().time())
// one report per vessel per day
.distinct(
c -> c.fix().mmsi() + ":"
+ DateTimeFormatter.ISO_DATE.format(Instant
.ofEpochMilli(c.fix().time()).atZone(ZoneOffset.UTC)))
// print results
.doOnNext(c -> {
// lookup the imo from ais ship static reports
Optional<Info> aisInfo = Optional.ofNullable(ships.get(c.fix().mmsi()));
Optional<String> aisImo;
Optional<String> ihsImo;
if (aisInfo.isPresent() && aisInfo.get().imo.isPresent()) {
aisImo = Optional.of(aisInfo.get().imo.get());
ihsImo = Optional.empty();
} else {
aisImo = Optional.empty();
// lookup the imo from ihs data
Optional<Map<String, String>> ihsInfo = Optional
.ofNullable(ihs.get(c.fix().mmsi()));
if (ihsInfo.isPresent()) {
ihsImo = Optional
.ofNullable(ihsInfo.get().get(Key.LRIMOShipNo.toString()));
} else {
ihsImo = Optional.empty();
}
}
String imo = aisImo.orElse(ihsImo.orElse(""));
out.format(
"%s\t%s\t%s\t%s\t%s\n", c.fix().mmsi(), imo, dtf.format(Instant
.ofEpochMilli(c.fix().time()).atZone(ZoneOffset.UTC)),
c.fix().lat(), c.fix().lon());
})
// go
.count().toBlocking().single();
}
out.close();
}
}