The majority of formats require the same two steps for visualization on a GXY view. To visualize GeoPackage data:
-
Decode the data into an
ILcdModel
using anILcdModelDecoder
. -
Create an
ILcdGXYLayer
for theILcdModel
and add it to theILcdGXYView
.
//First create the model
ILcdModelDecoder decoder =
new TLcdCompositeModelDecoder(TLcdServiceLoader.getInstance(ILcdModelDecoder.class));
ILcdModel model = decoder.decode("Data/GeoPackage/states.gpkg");
//Create a layer for the model with default styling
ILcdGXYLayer layer = createGXYGeoPackageLayer(model);
//Wrap the layer with an async layer wrapper to ensure
//that the view remains responsive while data is being painted
layer = ILcdGXYAsynchronousLayerWrapper.create(layer);
//Add the async layer to the GXY view (an ILcdGXYView)
view.addGXYLayer(layer);
A GeoPackage file can contain:
-
One or more vector data sets
-
One or more raster data sets
-
One or more elevation data sets
-
A mix of the above
The actual creation of the layer depends on the kind of model:
/**
* A GeoPackage file can contain:
* <ul>
* <li>one or more vector data sets</li>
* <li>one or more raster data sets</li>
* <li>one or more elevation data sets</li>
* <li>a mix of the above</li>
* </ul>
* This method can deal with all those scenarios
*/
static ILcdGXYLayer createGXYGeoPackageLayer(ILcdModel model) {
//The model decoder returns a model tree node when the file contains multiple data sets
//The node itself is just an empty container. We create an empty layer node for that container.
//Then we loop over the child models (=the actual data), and create layers for those as well
if (model instanceof ILcdModelContainer) {
TLcdGXYLayerTreeNode node = new TLcdGXYLayerTreeNode(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(createGXYGeoPackageLayer(childModel));
}
return node;
} else if (model.getModelDescriptor() instanceof TLcdGeoPackageModelDescriptor) {
//The TLcdGXYLayer.create method can deal with both raster and vector data,
//so no need to check what the model contains
//The class javadoc of TLcdGeoPackageModelDescriptor describes how to
//discover whether the model contains vector or raster data
return TLcdGXYLayer.create(model);
}
throw new IllegalArgumentException("Cannot create layer for model " + model);
}
The resulting layer(s) use the default raster or vector styling.
This code snippet uses the The model decoder class that is actually responsible for decoding GeoPackage data is the
|