use of au.gov.amsa.ais.message.AisShipStatic in project risky by amsa-code.
the class ShipTypeBreakdownMain method main.
public static void main(String[] args) throws FileNotFoundException, IOException {
// load a shapefile
final GeometryFactory gf = new GeometryFactory();
File file = new File("/home/dxm/temp/srr.shp");
Map<String, Serializable> map = new HashMap<>();
map.put("url", file.toURI().toURL());
DataStore datastore = DataStoreFinder.getDataStore(map);
String typeName = datastore.getTypeNames()[0];
System.out.println(typeName);
SimpleFeatureSource source = datastore.getFeatureSource(typeName);
final SimpleFeatureCollection features = source.getFeatures();
final List<PreparedGeometry> geometries = new ArrayList<>();
SimpleFeatureIterator it = features.features();
while (it.hasNext()) {
SimpleFeature feature = it.next();
Geometry g = (Geometry) feature.getDefaultGeometry();
geometries.add(PreparedGeometryFactory.prepare(g));
}
// System.exit(0);
String filename = "/media/analysis/nmea/2014/NMEA_ITU_20140815.gz";
final Set<Long> mmsi = new HashSet<Long>();
final Set<Long> mmsiA = new HashSet<Long>();
final Set<Long> mmsiB = new HashSet<Long>();
Streams.extract(Streams.nmeaFromGzip(filename)).flatMap(aisPositionsOnly).lift(Logging.<TimestampedAndLine<AisPosition>>logger().showCount().every(100000).log()).doOnNext(m -> {
AisPosition p = m.getMessage().get().message();
if (p.getLatitude() != null && p.getLongitude() != null && contains(gf, geometries, p.getLatitude(), p.getLongitude())) {
long mmsiNo = m.getMessage().get().message().getMmsi();
mmsi.add(mmsiNo);
if (m.getMessage().get().message() instanceof AisPositionA)
mmsiA.add(mmsiNo);
else
mmsiB.add(mmsiNo);
}
}).subscribe();
final Map<ShipTypeClass, Set<Integer>> countsByShipType = new ConcurrentHashMap<>();
Streams.extract(Streams.nmeaFromGzip(filename)).flatMap(aisShipStaticOnly).doOnNext(m -> {
AisShipStatic s = m.getMessage().get().message();
if (mmsi.contains(Long.valueOf(s.getMmsi()))) {
boolean isClassA = s instanceof AisShipStaticA;
ShipTypeClass shipTypeClass = new ShipTypeClass(isClassA, s.getShipType());
if (countsByShipType.get(shipTypeClass) == null)
countsByShipType.put(shipTypeClass, new HashSet<Integer>());
else
countsByShipType.get(shipTypeClass).add(s.getMmsi());
}
}).subscribe();
System.out.println(countsByShipType);
Set<String> set = new TreeSet<String>();
int sizeA = 0;
int sizeB = 0;
for (Entry<ShipTypeClass, Set<Integer>> s : countsByShipType.entrySet()) {
set.add(ShipTypeDecoder.getShipType(s.getKey().shipType) + "\t" + (s.getKey().isClassA ? "A" : "B") + "\t" + s.getValue().size());
if (s.getKey().isClassA)
sizeA += s.getValue().size();
else
sizeB += s.getValue().size();
}
set.stream().forEach(System.out::println);
System.out.println("Unknown\tA\t" + (mmsiA.size() - sizeA));
System.out.println("Unknown\tB\t" + (mmsiB.size() - sizeB));
log.info("finished");
}
use of au.gov.amsa.ais.message.AisShipStatic in project risky by amsa-code.
the class ShipStaticDataCreator method writeStaticDataToFileWithTimestamps.
public static Observable<Timestamped<AisShipStatic>> writeStaticDataToFileWithTimestamps(List<File> files, File outputFile, Scheduler scheduler) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
Func0<PrintStream> resourceFactory = Checked.f0(() -> new PrintStream(outputFile));
Func1<PrintStream, Observable<Timestamped<AisShipStatic>>> observableFactory = out -> Observable.from(files).buffer(Math.max(1, files.size() / Runtime.getRuntime().availableProcessors() - 1)).flatMap(list -> //
Observable.from(list).lift(//
Logging.<File>logger().showValue().showMemory().log()).concatMap(//
file -> timestampedShipStatics(file))).groupBy(//
m -> m.message().getMmsi()).flatMap(//
g -> collect(g).subscribeOn(scheduler)).compose(Transformers.doOnFirst(x -> {
out.println("# MMSI, Time, IMO, AisClass, AisShipType, MaxPresentStaticDraughtMetres, DimAMetres, DimBMetres, DimCMetres, DimDMetres, LengthMetres, WidthMetres, Name");
out.println("# columns are tab delimited");
out.println("# -1 = not present");
})).filter(//
set -> set.size() <= 10).flatMapIterable(//
set -> set).doOnNext(k -> {
AisShipStatic m = k.message();
out.format("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", m.getMmsi(), sdf.format(new Date(k.time())), getImo(m).orElse(-1), m instanceof AisShipStaticA ? "A" : "B", m.getShipType(), getMaximumPresentStaticDraughtMetres(m).orElse(-1F), m.getDimensionA().orElse(-1), m.getDimensionB().orElse(-1), m.getDimensionC().orElse(-1), m.getDimensionD().orElse(-1), AisShipStaticUtil.lengthMetres(m).orElse(-1), AisShipStaticUtil.widthMetres(m).orElse(-1), prepareName(m.getName()));
out.flush();
});
Action1<PrintStream> disposeAction = out -> out.close();
return Observable.using(resourceFactory, observableFactory, disposeAction);
}
use of au.gov.amsa.ais.message.AisShipStatic in project risky by amsa-code.
the class ShipStaticDataCreator method writeStaticDataToFile.
public static Observable<AisShipStatic> writeStaticDataToFile(List<File> files, File outputFile, Scheduler scheduler) {
Func0<PrintStream> resourceFactory = Checked.f0(() -> new PrintStream(outputFile));
Func1<PrintStream, Observable<AisShipStatic>> observableFactory = out -> Observable.from(files).buffer(Math.max(1, files.size() / Runtime.getRuntime().availableProcessors() - 1)).flatMap(list -> //
Observable.from(list).lift(//
Logging.<File>logger().showValue().showMemory().log()).concatMap(file -> //
Streams.extract(Streams.nmeaFromGzip(file)).flatMap(//
aisShipStaticOnly).map(//
m -> m.getMessage().get().message()).distinct(//
m -> m.getMmsi()).doOnError(e -> System.err.println("could not read " + file + ": " + //
e.getMessage())).onErrorResumeNext(//
Observable.<AisShipStatic>empty())).distinct(//
m -> m.getMmsi()).subscribeOn(//
scheduler)).distinct(//
m -> m.getMmsi()).compose(//
Transformers.mapWithIndex()).doOnNext(indexed -> {
if (indexed.index() == 0) {
out.println("# MMSI, IMO, AisClass, AisShipType, MaxPresentStaticDraughtMetres, DimAMetres, DimBMetres, DimCMetres, DimDMetres, LengthMetres, WidthMetres, Name");
out.println("# columns are tab delimited");
out.println("# -1 = not present");
}
}).map(indexed -> indexed.value()).doOnNext(m -> {
out.format("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n", m.getMmsi(), getImo(m).orElse(-1), m instanceof AisShipStaticA ? "A" : "B", m.getShipType(), getMaximumPresentStaticDraughtMetres(m).orElse(-1F), m.getDimensionA().orElse(-1), m.getDimensionB().orElse(-1), m.getDimensionC().orElse(-1), m.getDimensionD().orElse(-1), AisShipStaticUtil.lengthMetres(m).orElse(-1), AisShipStaticUtil.widthMetres(m).orElse(-1), prepareName(m.getName()));
out.flush();
});
Action1<PrintStream> disposeAction = out -> out.close();
return Observable.using(resourceFactory, observableFactory, disposeAction);
}
use of au.gov.amsa.ais.message.AisShipStatic in project risky by amsa-code.
the class ExtractStaticDataAsCsvFromNmeaGz method extractStaticData.
public static void extractStaticData(File input, File output) throws IOException {
output.getParentFile().mkdirs();
try (PrintStream out = new PrintStream(output)) {
//
Streams.nmeaFromGzip(input).compose(//
o -> Streams.extractMessages(o)).filter(x -> //
(x.message() instanceof AisShipStatic) || //
(x.message() instanceof AisBStaticDataReportPartA) || //
(x.message() instanceof AisBStaticDataReportPartB)).groupBy(//
x -> ((HasMmsi) x.message()).getMmsi()).flatMap(o -> //
o.scan(//
new Timed<State>(new State(o.getKey(), null, null, null, null, null), 0L), (timed, x) -> {
State state = timed.object;
String name = state.name;
String callsign = state.callsign;
Integer imo = state.imo;
Integer shipType = state.shipType;
AisClass aisClass = state.aisClass;
if (x.message() instanceof AisShipStaticA) {
AisShipStaticA a = (AisShipStaticA) x.message();
callsign = a.getCallsign();
name = a.getName();
imo = a.getImo().orElse(null);
shipType = a.getShipType();
aisClass = AisClass.A;
} else if (x.message() instanceof AisPositionBExtended) {
AisPositionBExtended a = (AisPositionBExtended) x.message();
name = a.getName();
shipType = a.getShipType();
aisClass = AisClass.B;
} else if (x.message() instanceof AisBStaticDataReportPartA) {
AisBStaticDataReportPartA a = (AisBStaticDataReportPartA) x.message();
if (a.getName().isPresent()) {
name = a.getName().get();
}
aisClass = AisClass.B;
} else if (x.message() instanceof AisBStaticDataReportPartB) {
aisClass = AisClass.B;
}
return new Timed<State>(new State(o.getKey(), aisClass, name, callsign, imo, shipType), x.time());
}).skip(//
1).distinctUntilChanged(ts -> ts.object)).doOnNext(x -> {
State y = x.object;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
String line = //
y.mmsi + "," + sdf.format(new Date(x.time)) + //
"," + y.aisClass + //
"," + integer(y.imo) + //
"," + integer(y.shipType) + //
"," + string(y.name) + ",";
out.println(line);
}).subscribe();
}
}
Aggregations