扩展一个切片源提供者

发送反馈


切片源提供者类,将自定义的瓦片格式封装为切图可用的切片源,包括新建和加载瓦片集的能力,使切图的时候可以将瓦片存储为该扩展格式。

扩展时,切片源提供者类必须创建在 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() 断开连接,清理掉所有切片集。

 

  1. 指定使用自定义扩展的瓦片格式,并创建该类型的切片集,本例中为 NationalCacheStandardTileset:
        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;
    }
  1. 根据扩展的切片源信息类创建瓦片存储目录,并将获取的扩展格式的切片存储到创建的目录中。
    @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;
    }
  1. 获取 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;
    }
  1. 根据切片集名字获取一个切片集
    @Override
    public Tileset<ImageMetaData, ImageTileInfo> getTileset(String name) {
        return tilesets.get(name);
    }
  1. 刷新操作,会把文件夹下未加载进来的 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();
        }
    }
  1. 断开连接,清理掉所有切片集
    @Override
    protected boolean doDisConnect() {
        this.tilesets.clear();
        this.outputFile = null;
        return true;
    }

完整扩展示例代码如下:

NationalCacheStandardTileSourceProvider.java