扩展一个切片源提供者 |
切片源提供者类,将自定义的瓦片格式封装为切图可用的切片源,包括新建和加载瓦片集的能力,使切图的时候可以将瓦片存储为该扩展格式。
扩展时,切片源提供者类必须创建在 com.supermap.services.tilesource.impl 包下,否则部署后使用分布式切图时会找不到扩展的瓦片格式。扩展形式如:
@TileSourceProviderAnnotation(infoType = com.supermap.services.tilesource.NationalCacheStandardTileSourceInfo.class, name = "NationalMap", isLocal = true) public class NationalCacheStandardTileSourceProvider extends AbstractTileSourceProvider<NationalCacheStandardTileSourceInfo> { }
@TileSourceProviderAnnotation 注记标识了切片源信息类、名称,是否为本地存储的瓦片。其中,infoType 指向了当前切片源提供者所对应的切片源,本例为前文扩展的 NationalCacheStandardTileSourceInfo;isLocal 为 true 时表示存储类型为本地磁盘存储,false 表示存储类型为分布式存储。
扩展时需要实现 AbstractTileSourceProvider 类中未实现的方法,具体包括:
字段/方法 | 描述 |
protected boolean doConnect(NationalCacheStandardTileSourceInfo tilesourceInfo) | 创建并连接存储路径,将瓦片存储到该路径。 |
protected Tileset<ImageMetaData, ImageTileInfo> doCreateTileset(MetaData metaData) | 创建一个切片集。 |
public Tileset<ImageMetaData, ImageTileInfo>[] getTilesets() | 获取 Provider 中所有的 Tileset 的集合。 |
public Tileset<ImageMetaData, ImageTileInfo> getTileset(String name) | 根据切片集名字获取一个切片集。 |
public void refresh() | 刷新操作,会把文件夹下未加载进来的 Tileset 加载。 |
protected boolean doDisConnect() | 断开连接,清理掉所有切片集。 |
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; } //创建瓦片存储的目录。 outputFile = new File(outputPath); if (!outputFile.exists()) { outputFile.mkdirs(); } //将瓦片集存储到创建的目录。 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; }
完整扩展示例代码如下:
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; /** * * 地图瓦片切片源对应的提供者。提供了对测绘行业标准化指导性技术文件 CH/Z 9011——2011《地理信息公共服务平台——电子地图数据规范》中标准瓦片的支持,包括新建和加载瓦片缓存切片集的能力。 * 该规范下载地址:http://files.ngcc.sbsm.gov.cn/www/201206/20120611090020330.pdf。 * */ @TileSourceProviderAnnotation(infoType = com.supermap.services.tilesource.NationalCacheStandardTileSourceInfo.class, name = "NationalMap", isLocal = true) public class NationalCacheStandardTileSourceProvider extends AbstractTileSourceProvider<NationalCacheStandardTileSourceInfo> { //创建规范格式的瓦片集合。 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; } //创建瓦片存储的目录。 outputFile = new File(outputPath); if (!outputFile.exists()) { outputFile.mkdirs(); } //将瓦片集存储到创建的目录。 File[] files = outputFile.listFiles(); for (File file : files) { if (file.isDirectory()) { NationalCacheStandardTileset tileset = new NationalCacheStandardTileset(file); tilesets.put(tileset.getName(), tileset); } } return true; } //创建 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; } //断开连接,清理掉所有 Tileset。 @Override protected boolean doDisConnect() { this.tilesets.clear(); this.outputFile = null; return true; } //根据切片集名字获取 Tileset。 @Override public Tileset<ImageMetaData, ImageTileInfo> getTileset(String name) { return tilesets.get(name); } //获取 Provider 中所有的 Tileset 的集合。 @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; } //刷新操作,会把文件夹下未加载进来的 Tileset 加载。 @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(); } } //获取 MetaData 对应的 Tileset,通过地图名字来确定是否是匹配的 Tileset。 @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; } }