use of au.gov.amsa.ais.HasMmsi in project risky by amsa-code.
the class OperatorCraftProperty method call.
@Override
public Subscriber<? super Timestamped<? extends AisMessage>> call(final Subscriber<? super CraftProperty> child) {
return new Subscriber<Timestamped<? extends AisMessage>>(child) {
@Override
public void onCompleted() {
if (!isUnsubscribed())
child.onCompleted();
}
@Override
public void onError(Throwable e) {
if (!isUnsubscribed())
child.onError(e);
}
@SuppressWarnings("unchecked")
@Override
public void onNext(Timestamped<? extends AisMessage> m) {
if (m.message() instanceof AisShipStaticA) {
handleShipStatic((Timestamped<AisShipStaticA>) m, child);
} else if (m.message() instanceof AisPositionBExtended)
handleAisPositionBExtended((Timestamped<AisPositionBExtended>) m, child);
}
private void handleShipStatic(Timestamped<AisShipStaticA> m, Subscriber<? super CraftProperty> child) {
handleProperty(child, m, CraftPropertyName.CALLSIGN, m.message().getCallsign());
handleProperty(child, m, CraftPropertyName.DESTINATION, m.message().getDestination());
handleProperty(child, m, CraftPropertyName.DIMENSION_A, m.message().getDimensionA());
handleProperty(child, m, CraftPropertyName.DIMENSION_B, m.message().getDimensionB());
handleProperty(child, m, CraftPropertyName.DIMENSION_C, m.message().getDimensionC());
handleProperty(child, m, CraftPropertyName.DIMENSION_D, m.message().getDimensionD());
handleProperty(child, m, CraftPropertyName.IMO_NUMBER, m.message().getImo());
handleProperty(child, m, CraftPropertyName.LENGTH_METRES, m.message().getLengthMetres());
handleProperty(child, m, CraftPropertyName.DRAUGHT_METRES, m.message().getMaximumPresentStaticDraughtMetres());
handleProperty(child, m, CraftPropertyName.NAME, m.message().getName());
handleProperty(child, m, CraftPropertyName.SHIP_TYPE, m.message().getShipType());
handleProperty(child, m, CraftPropertyName.WIDTH_METRES, m.message().getWidthMetres());
}
private void handleAisPositionBExtended(Timestamped<AisPositionBExtended> m, Subscriber<? super CraftProperty> child) {
handleProperty(child, m, CraftPropertyName.DIMENSION_A, m.message().getDimensionA());
handleProperty(child, m, CraftPropertyName.DIMENSION_B, m.message().getDimensionB());
handleProperty(child, m, CraftPropertyName.DIMENSION_C, m.message().getDimensionC());
handleProperty(child, m, CraftPropertyName.DIMENSION_D, m.message().getDimensionD());
handleProperty(child, m, CraftPropertyName.LENGTH_METRES, m.message().getLengthMetres());
handleProperty(child, m, CraftPropertyName.NAME, m.message().getName());
handleProperty(child, m, CraftPropertyName.SHIP_TYPE, m.message().getShipType());
handleProperty(child, m, CraftPropertyName.WIDTH_METRES, m.message().getWidthMetres());
}
private <R extends AisMessage & HasMmsi> void handleProperty(Subscriber<? super CraftProperty> child, Timestamped<R> m, CraftPropertyName name, Object value) {
if (!isUnsubscribed() && value != null)
child.onNext(new CraftProperty(new Mmsi(m.message().getMmsi()), name, value.toString(), m.time()));
}
};
}
use of au.gov.amsa.ais.HasMmsi 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