切片源提供者类,将自定义的瓦片格式封装为切图可用的切片源,包括新建和加载瓦片集的能力,使切图的时候可以将瓦片存储为该扩展格式。
扩展时,切片源提供者类必须创建在 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() | 断开连接,清理掉所有切片集。 |
- 指定使用自定义扩展的瓦片格式,并创建该类型的切片集,本例中为 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;
}
- 根据扩展的切片源信息类创建瓦片存储路径,并将获取的扩展格式的切片存储到创建的目录中。
@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;
}
- 获取 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;
}
- 根据切片集名字获取一个切片集
@Override
public Tileset<ImageMetaData, ImageTileInfo> getTileset(String name) {
return tilesets.get(name);
}
- 刷新操作,会把文件夹下未加载进来的 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();
}
}
- 断开连接,清理掉所有切片集
@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;
}
}