Search in sources :

Example 1 with Info

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());
    }
}
Also used : CalculationResult(au.gov.amsa.geo.distance.DistanceTravelledCalculator.CalculationResult) OperatorCellValuesToBytes(au.gov.amsa.geo.OperatorCellValuesToBytes) CellValue(au.gov.amsa.geo.model.CellValue) Info(au.gov.amsa.navigation.ShipStaticData.Info) File(java.io.File) OperatorWriteBytes(au.gov.amsa.util.rx.OperatorWriteBytes)

Example 2 with Info

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);
}
Also used : Info(au.gov.amsa.navigation.ShipStaticData.Info) Logger(org.slf4j.Logger) ShipTypeDecoder(au.gov.amsa.ais.ShipTypeDecoder) ZonedDateTime(java.time.ZonedDateTime) LoggerFactory(org.slf4j.LoggerFactory) Instant(java.time.Instant) Files(au.gov.amsa.util.Files) File(java.io.File) ZoneId(java.time.ZoneId) Observable(rx.Observable) List(java.util.List) BinaryFixes(au.gov.amsa.risky.format.BinaryFixes) Func2(rx.functions.Func2) DateTimeFormatter(java.time.format.DateTimeFormatter) Map(java.util.Map) Fix(au.gov.amsa.risky.format.Fix) Shapefile(au.gov.amsa.gt.Shapefile) Pattern(java.util.regex.Pattern) ShipStaticData(au.gov.amsa.navigation.ShipStaticData) Pattern(java.util.regex.Pattern) Info(au.gov.amsa.navigation.ShipStaticData.Info) Fix(au.gov.amsa.risky.format.Fix) Shapefile(au.gov.amsa.gt.Shapefile) File(java.io.File)

Example 3 with Info

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();
    }
}
Also used : PrintStream(java.io.PrintStream) Info(au.gov.amsa.navigation.ShipStaticData.Info) Func1(rx.functions.Func1) BinaryFixes(au.gov.amsa.risky.format.BinaryFixes) Map(java.util.Map) Logging(com.github.davidmoten.rx.slf4j.Logging) Optional(java.util.Optional) Set(java.util.Set) IOException(java.io.IOException) File(java.io.File) Sets(com.google.common.collect.Sets) BinaryFixesFormat(au.gov.amsa.risky.format.BinaryFixesFormat) PrintStream(java.io.PrintStream) Optional(java.util.Optional) Info(au.gov.amsa.navigation.ShipStaticData.Info) File(java.io.File)

Example 4 with Info

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();
}
Also used : PrintStream(java.io.PrintStream) Key(au.gov.amsa.ihs.reader.Key) Info(au.gov.amsa.navigation.ShipStaticData.Info) IhsReader(au.gov.amsa.ihs.reader.IhsReader) Logging(com.github.davidmoten.rx.slf4j.Logging) Instant(java.time.Instant) File(java.io.File) FileNotFoundException(java.io.FileNotFoundException) DriftCandidates(au.gov.amsa.navigation.DriftCandidates) DriftCandidate(au.gov.amsa.navigation.DriftCandidate) DateTimeFormatter(java.time.format.DateTimeFormatter) Map(java.util.Map) Optional(java.util.Optional) ZoneOffset(java.time.ZoneOffset) ShipStaticData(au.gov.amsa.navigation.ShipStaticData) PrintStream(java.io.PrintStream) Optional(java.util.Optional) Info(au.gov.amsa.navigation.ShipStaticData.Info) DateTimeFormatter(java.time.format.DateTimeFormatter) Map(java.util.Map) File(java.io.File)

Example 5 with Info

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();
        }
    }
}
Also used : Info(au.gov.amsa.navigation.ShipStaticData.Info) Logger(org.slf4j.Logger) ShipTypeDecoder(au.gov.amsa.ais.ShipTypeDecoder) ZonedDateTime(java.time.ZonedDateTime) LoggerFactory(org.slf4j.LoggerFactory) IOException(java.io.IOException) FileInputStream(java.io.FileInputStream) Instant(java.time.Instant) Files(au.gov.amsa.util.Files) File(java.io.File) FileNotFoundException(java.io.FileNotFoundException) Observable(rx.Observable) List(java.util.List) BinaryFixes(au.gov.amsa.risky.format.BinaryFixes) Func2(rx.functions.Func2) DateTimeFormatter(java.time.format.DateTimeFormatter) Map(java.util.Map) Fix(au.gov.amsa.risky.format.Fix) Shapefile(au.gov.amsa.gt.Shapefile) ZoneOffset(java.time.ZoneOffset) Pattern(java.util.regex.Pattern) ShipStaticData(au.gov.amsa.navigation.ShipStaticData) InputStream(java.io.InputStream) Functions(com.github.davidmoten.rx.Functions) Pattern(java.util.regex.Pattern) FileInputStream(java.io.FileInputStream) InputStream(java.io.InputStream) Info(au.gov.amsa.navigation.ShipStaticData.Info) FileInputStream(java.io.FileInputStream) Fix(au.gov.amsa.risky.format.Fix) Shapefile(au.gov.amsa.gt.Shapefile) File(java.io.File) DateTimeFormatter(java.time.format.DateTimeFormatter)

Aggregations

Info (au.gov.amsa.navigation.ShipStaticData.Info)7 File (java.io.File)6 Map (java.util.Map)5 ShipStaticData (au.gov.amsa.navigation.ShipStaticData)4 BinaryFixes (au.gov.amsa.risky.format.BinaryFixes)3 IOException (java.io.IOException)3 Instant (java.time.Instant)3 DateTimeFormatter (java.time.format.DateTimeFormatter)3 List (java.util.List)3 Observable (rx.Observable)3 ShipTypeDecoder (au.gov.amsa.ais.ShipTypeDecoder)2 OperatorCellValuesToBytes (au.gov.amsa.geo.OperatorCellValuesToBytes)2 CalculationResult (au.gov.amsa.geo.distance.DistanceTravelledCalculator.CalculationResult)2 CellValue (au.gov.amsa.geo.model.CellValue)2 Shapefile (au.gov.amsa.gt.Shapefile)2 Fix (au.gov.amsa.risky.format.Fix)2 Files (au.gov.amsa.util.Files)2 OperatorWriteBytes (au.gov.amsa.util.rx.OperatorWriteBytes)2 Logging (com.github.davidmoten.rx.slf4j.Logging)2 FileInputStream (java.io.FileInputStream)2