use of au.gov.amsa.navigation.ShipStaticData.Info in project risky by amsa-code.
the class DistanceTravelledMain method calculateTrafficDensity.
private static void calculateTrafficDensity(String directory, Options options, boolean gui, Map<Integer, Info> shipInfo, Func1<Info, Boolean> shipSelector, String name) {
System.out.println("-----------------------------------------------------");
System.out.println("------ " + name);
System.out.println("-----------------------------------------------------");
final Observable<File> files = Util.getFiles(directory, ".*\\.track").filter(file -> {
String s = file.getName();
String mmsiString = s.substring(0, s.indexOf(".track"));
long mmsi = Long.parseLong(mmsiString);
Info info = shipInfo.get(mmsi);
return shipSelector.call(info);
});
CalculationResult result = DistanceTravelledCalculator.calculateTrafficDensity(options, files, 1, 1);
if (gui) {
DisplayPanel.displayGui(files, options, result);
}
String filename = result.getCells().lift(new OperatorCellValuesToBytes(options)).lift(new OperatorWriteBytes()).toBlocking().single();
log.info("result saved to file " + filename);
CalculationResult resultFromFile = new CalculationResult(BinaryCellValuesObservable.readValues(new File(filename)).skip(1).cast(CellValue.class), result.getMetrics());
boolean produceImage = false;
boolean produceDensitiesText = false;
boolean produceDensitiesNetcdf = true;
File outputDirectory = new File("/media/an/traffic-density/netcdf");
if (produceImage) {
// 8:5 is ok ratio
saveAsPng(Renderer.createImage(options, 2, 12800, resultFromFile), new File(outputDirectory, name + "-map.png"));
}
if (produceDensitiesText) {
DistanceTravelledCalculator.saveCalculationResultAsText(options, result, new File(outputDirectory, name + "-densities.txt").getAbsolutePath());
}
if (produceDensitiesNetcdf) {
DistanceTravelledCalculator.saveCalculationResultAsNetcdf(options, result, new File(outputDirectory, name + "-densities.nc").getAbsolutePath());
}
}
use of au.gov.amsa.navigation.ShipStaticData.Info in project risky by amsa-code.
the class CountCrossingsIntoRegionMain method main.
public static void main(String[] args) {
String shape = "/home/dxm/temp/amsa_atba_ningaloo_reef_pl.shp";
// String shape = "/home/dxm/temp/amb06_map_eez_pl.shp";
Shapefile region = Shapefile.from(new File(shape));
// test load
region.contains(0, 0);
Func2<Fix, Fix, Integer> ascendingTime = (a, b) -> ((Long) a.time()).compareTo(b.time());
Map<Integer, Info> ships = ShipStaticData.getMapFromResource("/ship-data.txt");
Pattern pattern = Pattern.compile(".*\\.track");
List<File> files = Files.find(new File("/media/an/binary-fixes-5-minute/2012"), pattern);
files.addAll(Files.find(new File("/media/an/binary-fixes-5-minute/2013"), pattern));
files.addAll(Files.find(new File("/media/an/binary-fixes-5-minute/2014"), pattern));
files.addAll(Files.find(new File("/media/an/binary-fixes-5-minute/2015"), pattern));
log.info("files=" + files.size());
int count = Observable.from(files).concatMap(file -> detectCrossings(file, region)).toSortedList(ascendingTime).flatMap(o -> Observable.from(o)).doOnNext(fix -> {
Info info = ships.get(fix.mmsi());
if (info != null) {
String type;
if (info.shipType.isPresent())
type = ShipTypeDecoder.getShipType(info.shipType.get());
else
type = "UNKNOWN";
String t = DateTimeFormatter.ISO_DATE_TIME.format(ZonedDateTime.ofInstant(Instant.ofEpochMilli(fix.time()), ZoneId.of("UTC")));
System.out.println(t + ", mmsi=" + fix.mmsi() + ", class=" + fix.aisClass().name() + ", lengthMetres=" + info.lengthMetres().orElse(null) + ", type=" + type + ", lat=" + fix.lat() + ", lon=" + fix.lon());
}
}).count().toBlocking().single();
System.out.println("count=" + count);
}
use of au.gov.amsa.navigation.ShipStaticData.Info in project risky by amsa-code.
the class CollisionDetectorMain method main.
public static void main(String[] args) throws IOException, InterruptedException {
VesselPosition.validate = true;
CollisionDetector c = new CollisionDetector();
// String filename = "/media/an/nmea/2013/NMEA_ITU_20130108.gz";
Map<Integer, Info> ships = ShipStaticData.getMapFromResource("/ship-data-2014.txt");
// nmea from file
// Streams.nmeaFromGzip(filename)
File file = new File("/media/an/daily-fixes/2014/2014-02-01.fix");
File candidates = new File("/media/an/temp/" + file.getName() + ".collision-candidates.txt");
try (PrintStream out = new PrintStream(candidates)) {
out.println("time,mmsi1,lat1, lon1, cog1, m/s, mmsi2, lat2, lon2, cog2, m/s");
BinaryFixes.from(file, true, BinaryFixesFormat.WITH_MMSI).map(VesselPositions.TO_VESSEL_POSITION).lift(Logging.<VesselPosition>logger().showCount().every(1000).showMemory().log()).filter(onlyClassA).filter(p -> p.speedMetresPerSecond().isPresent()).filter(p -> p.cogDegrees().isPresent()).filter(p -> {
Mmsi mmsi = (Mmsi) p.id();
Optional<Info> info = Optional.ofNullable(ships.get(mmsi.value()));
return (!info.isPresent() || !info.get().shipType.isPresent() || !isTugPilotTowing(info.get().shipType.get()));
}).filter(p -> p.speedKnots().get() >= 5).compose(CollisionDetector.detectCollisionCandidates()).lift(Logging.<CollisionCandidate>logger().showCount().every(1).showValue().showMemory().log()).doOnNext(cc -> out.format("%s,%s,%s,%s,%s,%s,%s,%s,%s,%s", cc.time(), cc.position1().id().uniqueId(), cc.position1().lat(), cc.position1().lon(), cc.position1().cogDegrees(), cc.position1().speedMetresPerSecond().map(x -> String.valueOf(x)).orElse(""), cc.position2().id().uniqueId(), cc.position2().lat(), cc.position2().lon(), cc.position2().cogDegrees(), cc.position2().speedMetresPerSecond().map(x -> String.valueOf(x)).orElse(""))).count().toBlocking().single();
}
}
use of au.gov.amsa.navigation.ShipStaticData.Info in project risky by amsa-code.
the class DriftCandidatesMain method main.
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).lift(Logging.<DriftCandidate>logger().showCount().showMemory().every(100000).log()).filter(c -> c.driftingSince() == c.fix().time()).distinct(c -> c.fix().mmsi() + ":" + DateTimeFormatter.ISO_DATE.format(Instant.ofEpochMilli(c.fix().time()).atZone(ZoneOffset.UTC))).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());
}).count().toBlocking().single();
}
out.close();
}
use of au.gov.amsa.navigation.ShipStaticData.Info in project risky by amsa-code.
the class LMSAdhocMain method main.
public static void main(String[] args) throws FileNotFoundException, IOException {
Map<Integer, Info> ships = ShipStaticData.getMapFromResource("/ship-data-2014.txt");
Pattern pattern = Pattern.compile(".*\\.track");
File base = new File("/media/an/binary-fixes-lms2");
List<File> files = Files.find(new File(base, "2016"), pattern);
log.info("files=" + files.size());
Func2<Fix, Fix, Integer> ascendingTime = (a, b) -> ((Long) a.time()).compareTo(b.time());
String[] shapes = new String[] { "fremantle_port_limits_pl.zip", "dampier_port_limits_pl.zip", "port_hedland_port_limits_pl.zip" };
File shapeBase = new File("/media/an/shapefiles/port-boundaries");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm").withZone(ZoneOffset.UTC);
System.out.println("region, mmsi, imo, class, type, lat, lon, timeUTC");
for (String shape : shapes) {
final String shapeName = shape.replace("_port_limits_pl.zip", "");
try (InputStream is = new FileInputStream(new File(shapeBase, shape))) {
Shapefile region = Shapefile.fromZip(is);
Observable.from(files).filter(file -> !file.getName().startsWith("503")).concatMap(file -> detectCrossings(file, region)).toSortedList(//
ascendingTime).flatMapIterable(//
Functions.identity()).doOnNext(fix -> {
Info info = ships.get(fix.mmsi());
String type = "";
if (info != null) {
if (info.shipType.isPresent())
type = ShipTypeDecoder.getShipType(info.shipType.get());
else
type = "";
}
String t = formatter.format(ZonedDateTime.ofInstant(Instant.ofEpochMilli(fix.time()), ZoneOffset.UTC)).replace("[UTC]", "");
String imo = info == null ? "" : info.imo.orElse("");
System.out.format("%s,%s,%s,%s,\"%s\",%s,%s,%s\n", shapeName, fix.mmsi(), imo, fix.aisClass().name(), type, fix.lat(), fix.lon(), t);
}).count().toBlocking().single();
}
}
}
Aggregations