JAVA操作mbtiles写入写出瓦片
再项目中我们可能会遇到数据导入导出的问题,特别在GIS开发过程中,使用mapbox引擎涉及到使用矢量瓦片等数据,如何将提供的mbtiles文件导入到postgresql中或者将postgresql数据导出成mbtiles文件
这里推荐一个工具包–mbtiles4j
Maven 引入方式:
<dependency>
<groupId>org.imintel</groupId>
<artifactId>mbtiles4j</artifactId>
<version>1.0.6</version>
</dependency>
github地址: https://github.com/imintel/mbtiles4j
优点:可以快速实现mbtiles文件的操作
缺点:包功能比较基础,没有pbf类型格式,不支持批量功能,需要自己进行修改
java操作mbtiles读取写入数据库
MBTilesReader r = new MBTilesReader(new File("文件路径"));
//获取到对应的数据元基础信息
MetadataEntry metadata = r.getMetadata();
String tileSetName = metadata.getTilesetName();
MetadataEntry.TileSetType type = metadata.getTilesetType();
String tilesetVersion = metadata.getTilesetVersion();
String description = metadata.getTilesetDescription();
MetadataEntry.TileMimeType tileMimeType = metadata.getTileMimeType();
MetadataBounds bounds = metadata.getTilesetBounds();
String attribution = metadata.getAttribution();
//tiles 遍历瓦片数据
TileIterator tiles = r.getTiles();
while (tiles.hasNext()) {
Tile next = tiles.next();
int zoom = next.getZoom();
int column = next.getColumn();
int row = next.getRow();
InputStream tileData = next.getData();
}
tiles.close();
r.close();
java操作数据库导出mbtiles
我们这里基于上述工具包源码进行改造实现支持批量操作(源码内容不多很容易修改):
MBTilesWriter write = new MBTilesWriter(new File("生成的文件路径"));
MetadataEntry ent = new MetadataEntry();
//创建一个元数据信息对象 补充相关参数
ent.setTilesetName("瓦片名称")
.setTilesetType(MetadataEntry.TileSetType.BASE_LAYER)
.setTilesetVersion("切片版本")
.setTilesetDescription("相关描述")
//瓦片格式 这里有png jpg pbf
.setTileMimeType(MetadataEntry.TileMimeType.PNG)
.setAttribution("描述属性")
// 四至范围瓦片的
.setTilesetBounds(-180, -85, 180, 85);
// 同时支持通过key value方式进行添加属性到元数据对象中
metadataEntry.addKeyValue("minzoom",7);
write.addMetadataEntry(ent);
//单个添加瓦片数据
write.addTile(someTileBytes, 0, 0, 0);
//批量添加瓦片数据
List<TileDto> tileDtos = new ArrayList<>();
for (Map<String, Object> tile : results) {
TileDto tileDto = new TileDto();
int zoom_level = (int) tile.get("zoom_level");
int tile_column = (int) tile.get("tile_column");
int tile_row = (int) tile.get("tile_row");
tile_row = (int) (Math.pow(2, zoom_level) - tile_row - 1);
byte[] tile_data = (byte[]) tile.get("tile_data");
tileDto.setZoomLevel(zoom_level);
tileDto.setTileColumn(tile_column);
tileDto.setTileRow(tile_row);
tileDto.setTileData(tile_data);
tileDtos.add(tileDto);
}
write.addBatchTile(tileDtos);
write.close();
批量添加对应sql处理
public static void addBatchTile(Connection connection, List<TileDto> tileDtoList) throws MBTilesException {
try {
PreparedStatement stmt = connection.prepareStatement("INSERT INTO tiles (zoom_level,tile_column,tile_row,tile_data) VALUES(?,?,?,?)");
connection.setAutoCommit(false);
for (TileDto tileDto:tileDtoList){
stmt.setInt(1, tileDto.getZoomLevel());
stmt.setInt(2, tileDto.getTileColumn());
stmt.setInt(3, tileDto.getTileRow());
stmt.setBytes(4, tileDto.getTileData());
stmt.addBatch();
}
stmt.executeBatch();
connection.commit();
stmt.close();
} catch (SQLException e) {
throw new MBTilesException("Add Tile failed.", e);
}
}