由于瓦片太多,拷贝时耗时太久,所以想要将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失败");
}
}
具体应用可能会不一样,大家自行辨别,这只是我在项目中的应用,本人也是刚接触这个,可能有说的不对的地方,麻烦大家指出,也欢迎大家进行讨论