Extending a tile source provider |
The TileSourceProvider class. Custom tile format can be encapsulated as tile source for tiling, which possess the capability of creating and loading tileset and allows users to store tile as the extended format during tiling.
During extension, the TileSourceProvider class must be created under the com.supermap.services.tilesource.impl package. Otherwise, the tile format will not be able to be found during distributed tiling after deployment. The extension is as follows:
@TileSourceProviderAnnotation(infoType = com.supermap.services.tilesource.NationalCacheStandardTileSourceInfo.class, name = "NationalMap", isLocal = true) public class NationalCacheStandardTileSourceProvider extends AbstractTileSourceProvider<NationalCacheStandardTileSourceInfo> { }
@TileSourceProviderAnnotation Labels the TileSourceInfo class, name, whether the tile is stored locally or not. infoType indicates tile source corresponding to the current tile provider, which is NationalCacheStandardTileSourceInfo Extended in Previous Section for this example. isLocal represents the storage type, with true indicating local disk storage and false indicating distributed storage.
During extension, unimplemented methods in the AbstractTileSourceProvider class should be noticed, including:
Field/Method | Description |
protected boolean doConnect(NationalCacheStandardTileSourceInfo tilesourceInfo) | Create and connect storage path to store tiles to the path. |
protected Tileset<ImageMetaData, ImageTileInfo> doCreateTileset(MetaData metaData) | Create a tileset. |
public Tileset<ImageMetaData, ImageTileInfo>[] getTilesets() | Get the Tileset collection in Provider. |
public Tileset<ImageMetaData, ImageTileInfo> getTileset(String name) | Get a tileset according to the name. |
public void refresh() | Refresh the opeation to load Tileset that has not been loaded in folder. |
protected boolean doDisConnect() | Break the connection to clear all tilesets. |
private ConcurrentHashMap<String, NationalCacheStandardTileset> tilesets = new ConcurrentHashMap<String, NationalCacheStandardTileset>(); @Override protected Tileset<ImageMetaData, ImageTileInfo> doCreateTileset(MetaData metaData) { if (!(metaData instanceof ImageMetaData)) { throw new IllegalArgumentException("NationalCacheStandard TileSource only support ImageMetaData"); } NationalCacheStandardTileset tileset = new NationalCacheStandardTileset(new File(outputFile, metaData.mapName)); tilesets.put(tileset.getName(), tileset); return tileset; }
@Override protected boolean doConnect(NationalCacheStandardTileSourceInfo tilesourceInfo) { String outputPath = tilesourceInfo.getOutputPath(); if (isEmpty(outputPath)) { return false; } //Create tile storage directory outputFile = new File(outputPath); if (!outputFile.exists()) { outputFile.mkdirs(); } //Store tilesets to the created directory File[] files = outputFile.listFiles(); for (File file : files) { if (file.isDirectory()) { NationalCacheStandardTileset tileset = new NationalCacheStandardTileset(file); tilesets.put(tileset.getName(), tileset); } } return true; }
@Override public Tileset<ImageMetaData, ImageTileInfo>[] getTilesets() { Collection<NationalCacheStandardTileset> tilesets = this.tilesets.values(); int size = tilesets.size(); NationalCacheStandardTileset[] tilesetArray = new NationalCacheStandardTileset[size]; tilesets.toArray(tilesetArray); return tilesetArray; }
@Override public Tileset<ImageMetaData, ImageTileInfo> getTileset(String name) { return tilesets.get(name); }
@Override public void refresh() { if (!connected.get()) { return; } try { lock.lock(); File[] files = outputFile.listFiles(); for (File file : files) { if (file.isDirectory()) { NationalCacheStandardTileset tileset = new NationalCacheStandardTileset(file); if (!tilesets.containsKey(tileset.getName())) { tilesets.put(tileset.getName(), tileset); } } } } finally { lock.unlock(); } }
@Override protected boolean doDisConnect() { this.tilesets.clear(); this.outputFile = null; return true; }
The complete extension example is as follows:
NationalCacheStandardTileSourceProvider.java
package com.supermap.services.tilesource.impl; import static org.apache.commons.lang3.StringUtils.isEmpty; import java.io.File; import java.util.Collection; import java.util.concurrent.ConcurrentHashMap; import com.supermap.services.tilesource.ImageMetaData; import com.supermap.services.tilesource.ImageTileInfo; import com.supermap.services.tilesource.MetaData; import com.supermap.services.tilesource.NationalCacheStandardTileSourceInfo; import com.supermap.services.tilesource.TileSourceProviderAnnotation; import com.supermap.services.tilesource.Tileset; /** * * The provider corresponding to the map tile source * */ @TileSourceProviderAnnotation(infoType = com.supermap.services.tilesource.NationalCacheStandardTileSourceInfo.class, name = "NationalMap", isLocal = true) public class NationalCacheStandardTileSourceProvider extends AbstractTileSourceProvider<NationalCacheStandardTileSourceInfo> { //Create tileset of standard format private ConcurrentHashMap<String, NationalCacheStandardTileset> tilesets = new ConcurrentHashMap<String, NationalCacheStandardTileset>(); private File outputFile; @Override protected boolean doConnect(NationalCacheStandardTileSourceInfo tilesourceInfo) { String outputPath = tilesourceInfo.getOutputPath(); if (isEmpty(outputPath)) { return false; } //Create tile storage directory outputFile = new File(outputPath); if (!outputFile.exists()) { outputFile.mkdirs(); } //Store tiles to created directory File[] files = outputFile.listFiles(); for (File file : files) { if (file.isDirectory()) { NationalCacheStandardTileset tileset = new NationalCacheStandardTileset(file); tilesets.put(tileset.getName(), tileset); } } return true; } //Cereate Tileset @Override protected Tileset<ImageMetaData, ImageTileInfo> doCreateTileset(MetaData metaData) { if (!(metaData instanceof ImageMetaData)) { throw new IllegalArgumentException("NationalCacheStandard TileSource only support ImageMetaData"); } NationalCacheStandardTileset tileset = new NationalCacheStandardTileset(new File(outputFile, metaData.mapName)); tilesets.put(tileset.getName(), tileset); return tileset; } //Create the connection to clear all Tilesets @Override protected boolean doDisConnect() { this.tilesets.clear(); this.outputFile = null; return true; } //Get Tileset according to name @Override public Tileset<ImageMetaData, ImageTileInfo> getTileset(String name) { return tilesets.get(name); } //Get Tileset collection in Provider @Override public Tileset<ImageMetaData, ImageTileInfo>[] getTilesets() { Collection<NationalCacheStandardTileset> tilesets = this.tilesets.values(); int size = tilesets.size(); NationalCacheStandardTileset[] tilesetArray = new NationalCacheStandardTileset[size]; tilesets.toArray(tilesetArray); return tilesetArray; } //Refresh the operation to load Tilesets that have not been loaded in the folder @Override public void refresh() { if (!connected.get()) { return; } try { lock.lock(); File[] files = outputFile.listFiles(); for (File file : files) { if (file.isDirectory()) { NationalCacheStandardTileset tileset = new NationalCacheStandardTileset(file); if (!tilesets.containsKey(tileset.getName())) { tilesets.put(tileset.getName(), tileset); } } } } finally { lock.unlock(); } } //Acquire Tileset corresponding to MetaData. Determin whether it is matched Tilset according to map name @Override protected Tileset<?, ?> getCompatibleTileset(MetaData metaData) { if ((!(metaData instanceof ImageMetaData)) || metaData.mapName == null) { return null; } Collection<NationalCacheStandardTileset> tilesets = this.tilesets.values(); for (NationalCacheStandardTileset tileset : tilesets) { if (tileset == null) { continue; } if (metaData.mapName.equals(tileset.getCacheName())) { return tileset; } } return null; } }