The majority of formats require the same two steps for visualization on a Lightspeed view. To visualize ASTERIX data:
-
Decode the data into an
ILcdModelusing anILcdModelDecoder. -
Create an
ILspLayerfor theILcdModeland add it to theILspView.
//First create the model
ILcdModelDecoder decoder =
new TLcdCompositeModelDecoder(TLcdServiceLoader.getInstance(ILcdModelDecoder.class));
ILcdModel model = decoder.decode("Data/ASTERIX/atx_cat21.astfin");
//Create a layer for the model
ILspLayer layer = createAsterixLayer(model);
//Add the layer to the Lightspeed view (an ILspView)
view.addLayer(layer);
The ASTERIX model decoder returns a model container with sub-models for the different categories. The layer creation must deal with all types of categories.
/**
* The ASTERIX model decoder returns an ILcdModelContainer with sub-models.
* Each of the sub-models potentially contains different data, so this code
* needs to be able to deal with all types of ASTERIX data
*/
static ILspLayer createAsterixLayer(ILcdModel model) {
//The model container itself does not contain any data,
//so we create an empty layer node for it
if (model instanceof ILcdModelContainer) {
TLspLayerTreeNode node = new TLspLayerTreeNode(model);
for (int i = 0; i < ((ILcdModelContainer) model).modelCount(); i++) {
ILcdModel childModel = ((ILcdModelContainer) model).getModel(i);
//Use recursion to create layers for the child models
node.addLayer(createAsterixLayer(childModel));
}
return node;
} else if (model.getModelDescriptor() instanceof TLcdASTERIXRadarVideoModelDescriptor) {
//Use the radar layer builder to create the layer
return TLspRadarVideoLayerBuilder.newBuilder()
.model(model)
.selectable(false)
.build();
} else if (model.getModelDescriptor() instanceof TLcdASTERIXWeatherModelDescriptor) {
return createWeatherLayer(model);
} else if (model.getModelDescriptor() instanceof TLcdASTERIXPlotModelDescriptor ||
model.getModelDescriptor() instanceof TLcdASTERIXTrajectoryModelDescriptor ||
model.getModelDescriptor() instanceof TLcdASTERIXTrackModelDescriptor) {
return TLspShapeLayerBuilder.newBuilder()
.model(model)
.build();
}
throw new IllegalArgumentException("Cannot create layer for model " + model);
}
private static ILspLayer createWeatherLayer(ILcdModel model) {
ILspStyler weatherStyler = new ALspStyler() {
private final List<TLspLineStyle> fLineStyles = Arrays.asList(
TLspLineStyle.newBuilder().color(new Color(231, 232, 255)).build(),
TLspLineStyle.newBuilder().color(new Color(157, 162, 255)).build(),
TLspLineStyle.newBuilder().color(new Color(0, 9, 120)).build(),
TLspLineStyle.newBuilder().color(new Color(255, 112, 112)).build(),
TLspLineStyle.newBuilder().color(new Color(255, 51, 51)).build(),
TLspLineStyle.newBuilder().color(new Color(190, 0, 0)).build(),
TLspLineStyle.newBuilder().color(new Color(216, 0, 202)).build()
);
@Override
public void style(Collection<?> aObjects, ALspStyleCollector aStyleCollector, TLspContext aContext) {
for (Object object : aObjects) {
//Customize the color based on the intensity of the precipitation of the weather data
int intensity = ((TLcdASTERIXPrecipitationZone) object).getIntensity();
//Intensity level 0 signifies no precipitation, so we will only paint levels 1 through 7.
if (intensity == 0) {
continue;
}
aStyleCollector.object(object).style(fLineStyles.get(intensity - 1)).submit();
}
}
};
return TLspShapeLayerBuilder.newBuilder()
.model(model)
.bodyStyler(TLspPaintState.REGULAR, weatherStyler)
.build();
}
This results in a ASTERIX layer with default styling. See Visualizing Vector Data for more information about visualizing and styling vector data.
|
This code snippet uses the The model decoder class that is actually responsible for decoding ASTERIX data is the
|