java中使用MBUtil工具将png转mbtiles

由于瓦片太多,拷贝时耗时太久,所以想要将png转mbtiles

 先下载mbutil工具mbutil地址:
mbutil地址:GitHub - mapbox/mbutil: Importer and Exporter of MBTiles

解压后得到

 此处以我本地下载的瓦片数据为例,存放格式z/x/y

 1.png转mbtiles

思路:mbutil工具除了需要瓦片数据外,还需要一个很重要的文件:metadata.json,该文件中最重要的一个参数就是bounds,在使用该工具前,先去根据你格网的原始层级以及行列号计算出坐标

注意:坐标顺序为左下右上

{"version":"1.2","bounds":"116.27929687500001,34.74161249883172,116.3671875,34.813803317113155","description": "A Test Metadata","format":"png"}

除bounds和format外,其他随意,json文件和下载层级目录放在一起

 

cmd打开命令提示符,输入如下命令

第一个参数是python的路径,第二个路径是工具解压后的mb-util的路径,第三个参数是切片存储的路径,第四个参数是mbtiles文件保存路径(其中**自己命名就好,mbtiles必须是不存在,最好不要出现中午路径,QGIS中打开mbtiles会无法查看)。

 2.mbtiles转png

cmd打开命令提示符,输入如下命令

 第一个参数是python的路径,第二个路径是工具解压后的mb-util的路径,第三个参数是mbtiles路径,第四个参数是png文件保存路径。

注意

mbtiles文件可以在qgis中打开,mbtiles类似于sqllite数据库,本人用navicat打开

 

其中metadata就是存储的我们坐标数据的json文件,tiles是行列层级对应的png的二进制流

重点就是根据行列号层级生成坐标

部分代码如下

生成json的代码:bounds是左下右上坐标,path是输出路径

private static void createJson(String bounds,String path){
        File file = new File(path + "/" + "metadata.json");
        if (!file.exists()) {
            try {
                file.createNewFile();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
        }
        String json = "{\"version\":\"1.2\",\"bounds\":\"" +
                bounds +
                "\",\"description\": \"A Test Metadata\",\"format\":\"png\"}";
        try {
            BufferedWriter writer = new BufferedWriter(new FileWriter(file));
            writer.write(json);
            writer.flush();//清空缓冲区数据
            writer.close();//关闭读写流
        }catch (Exception e){
            e.printStackTrace();
        }
    }

 调用工具的方法:path为输出路径,mapcode是我输出的mbtiles名字,你们可以随意

private static void createMBTile(String path,String mapCode){
        try {
            String[] args = new String[] { "python", "D:\\mbutil-master\\mb-util", path, "D:\\data\\"+mapCode+".mbtiles"};
            final Process proc = Runtime.getRuntime().exec(args);// 执行py文件
            proc.waitFor();
            System.out.println("生成"+mapCode+".mbtiles成功");
            proc.destroy();
        } catch (Exception e) {
            System.out.println("生成"+mapCode+".mbtiles失败");
        }
    }

具体应用可能会不一样,大家自行辨别,这只是我在项目中的应用,本人也是刚接触这个,可能有说的不对的地方,麻烦大家指出,也欢迎大家进行讨论

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值