The majority of formats require the same two steps for visualization on a Lightspeed view. To visualize GeoPackage 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/GeoPackage/states.gpkg");
//Create a layer for the model
ILspLayer layer = createGeoPackageLayer(model);
//Add the layer to the Lightspeed view (an ILspView)
view.addLayer(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 ILspLayer createGeoPackageLayer(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) {
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(createGeoPackageLayer(childModel));
}
return node;
} else if (model.getModelDescriptor() instanceof TLcdGeoPackageModelDescriptor) {
//See the class javadoc of TLcdGeoPackageModelDescriptor
if (model.getModelDescriptor() instanceof ILcdEarthModelDescriptor || model.getModelDescriptor() instanceof ILcdImageModelDescriptor) {
//This is a model containing raster or elevation data
return TLspRasterLayerBuilder.newBuilder()
.model(model)
.build();
} else if (model.getModelDescriptor() instanceof ILcdDataModelDescriptor) {
//This is a model containing vector data
return TLspShapeLayerBuilder.newBuilder()
.model(model)
.build();
}
}
throw new IllegalArgumentException("Cannot create layer for model " + model);
}
The resulting layer(s) use the default raster or vector styling.
See Visualizing Vector Data for more information about visualizing and styling vector data and Visualizing Raster Data for more information about visualizing and styling raster data.
This code snippet uses the The model decoder class that is actually responsible for decoding GeoPackage data is the
|