JAVA操作mbtiles读写瓦片

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);
        }
    }
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值