The majority of formats require the same two steps for visualization on a Lightspeed view. To visualize ASTERIX data:
-
Decode the data into an
ILcdModel
using anILcdModelDecoder
. -
Create an
ILspLayer
for theILcdModel
and 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
|