大家好,又见面了,我是你们的朋友全栈君。 项目中遇到一个需求,需要将某个地图区域的离线地图下载下来,整理很多网上的资料自己实现根据起始点的经纬度下载离线地图,代码如下 import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class Test {
private static final int BUFFER_SIZE = 2 * 1024;
public static void main(String[] args) throws Exception {
double [] start = new double[]{36.03267263,103.480619123};//最大纬度 最小精度 起点
double [] end = new double[]{35.522920921,103.520211928};//最小纬度 最大精度 终点
// 36.03267263 103.480619123 35.522920921 103.520211928
int [] z = new int[] {8,9};
/**
* 谷歌地图地址参数
* lyrs = 类型
*
* h = roads only 路线图
* m = standard roadmap
* p = terrain 地形图
* r = somehow altered roadmap
* s = satellite only 卫星图
* t = terrain only
* y = hybrid 混合
*/
String src = "http://mt0.google.cn/vt/lyrs=m@180000000&hl=zh-CN&gl=cn&x=%s&y=%s&z=%s&s=Ga";
String targetDir ="D:\\map";
//getGoogleMap(start,end,z,src,targetDir); //获取谷歌地图瓦片图
getFileInfo(targetDir);//获取下载之后的文件信息
toZip(targetDir, "D:/map.zip",true);//压缩下载的文件
}
/**
* 获取下载之后的文件信息
* @param targetDir
*/
public static void getFileInfo(String targetDir){
File file = new File(targetDir);
System.out.println("下载后的文件大小:"+file.length()/1024+"M");
File[] files = file.listFiles();
for (File f : files){
String level = f.getName();
int count =0;
File[] cfiles = f.listFiles();
for (File cf : cfiles){
count+=cf.list().length;
}
System.out.println("L"+level+"文件数量: "+count);
}
}
/**
* 根据起始点经纬度获取地图信息
* @param startPoint 数组 如:new double[]{35.522920921,103.480619123};
* @param endPoint 数组 如:new double[]{36.033726441,103.520211928};
* @param z 地图级别 new int[] {8,9}; 0-17
* @param src 地图下载地址
* @param targetDir 本地保存的路径
* @throws IOException
*/
public static void getGoogleMap(double [] startPoint,double [] endPoint,int [] z,String src,String targetDir) throws IOException {
// int zoom = 15;
double minlat = startPoint[0]; //35.522920921
double minlon = startPoint[1];//103.480619123
double maxlat = endPoint[0];//36.033726441
double maxlon = endPoint[1];//103.520211928
for (int k = z[0]; k |