Writing a tile loader for a custom data source

To implement load-on-demand for a new data source, all you have to do is write a specific tile loader that implements the IlvTileLoader or the IlvMapTileLoader interface. Notice, however, that for the predefined map formats supplied with JViews Maps, load-on-demand has been implemented in a subclass of IlvTiledLayer that defines both the tile loader (as a private class) and the tiling parameters appropriate for the concerned format. The IlvMapTileLoader class and the predefined formats are described in Readers and writers.
For your tile loader to be fully efficient, the following requirements should be satisfied:
  • You should be able to determine which objects are to be loaded on the tile. These objects can be read from a file whose name is known, or be the result of a query to a cartographic database.
  • You should be able to have a direct random access to data.
  • The size of the data to be loaded should be in proportion to the size of the tiles to allow fast loading. For example, raster images with a size of 100x100 are faster to load than images with a size of 6000x6000.
The following example of a tile loader simulates the loading of two graphic objects, a rectangle and a label.
Its load() method takes the tile to be loaded as its parameter. It generates the graphic objects to be displayed within the tile and adds them to the tiled layer by calling the tile.addObject() method. When loading is complete, it calls the tile.loadComplete method to notify the listeners that the data in the tile is ready for use.
public class LodLoader implements IlvTileLoader
{
  [...]

  public void load(IlvTile tile) throws Exception
  {
    IlvRect bbox = new IlvRect();
    tile.boundingBox(bbox);

    // Add a rectangle inside the tile bounding box
    tile.addObject(new IlvRectangle(bbox),null);

    // Add text
    String text = this.layerName + 
      " (" + tile.getColumn() + "," + tile.getRow() + ")";
    IlvPoint textCenter = new IlvPoint(bbox.x + bbox.width / 2,
                                       bbox.y + bbox.height / 2);
    tile.addObject(new IlvLabel(textCenter,text),null);

    tile.loadComplete();
  }
   [...]
Its release() method is invoked when the tile cache releases a tile. The tile.deleteAll method clears the tile.
  /**
   * Releases the objects on this tile.
   */
  public void release(IlvTile tile) 
  {
    tile.deleteAll();
  }
The complete source code of this example can be found in the following file: