项目中遇到一个需求,需要将某个地图区域的离线地图下载下来,整理很多网上的资料自己实现根据起始点的经纬度下载离线地图,代码如下

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.520211928int [] 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.522920921double minlon = startPoint[1];//103.480619123double maxlat = endPoint[0];//36.033726441double maxlon = endPoint[1];//103.520211928for (int k = z[0]; k <= z[1]; k ++){Map<String, Integer> minMap = getTileNumber(minlat, minlon, k);Map<String, Integer> maxMap = getTileNumber(maxlat, maxlon, k);int minX = minMap.get("x");int minY = minMap.get("y") ;int maxX = maxMap.get("x");int maxY = maxMap.get("y");//for (int i = minX; i <= maxX; i++) {for (int j = minY; j <= maxY; j++) {String url = String.format(src, i, j, k);System.out.println(url);downLaodImages(url, i, j, k,targetDir);}}}
}/*** 根据经纬度获取瓦片坐标 算法请参考* https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames* @param lat* @param lon* @param zoom* @return*/
public static Map getTileNumber(final double lat, final double lon, final int zoom) {Map<String,Integer> map = new HashMap<>();int xtile = (int)Math.floor( (lon + 180) / 360 * (1<<zoom) ) ;int ytile = (int)Math.floor( (1 - Math.log(Math.tan(Math.toRadians(lat)) + 1 / Math.cos(Math.toRadians(lat))) / Math.PI) / 2 * (1<<zoom) ) ;if (xtile < 0)xtile=0;if (xtile >= (1<<zoom))xtile=((1<<zoom)-1);if (ytile < 0)ytile=0;if (ytile >= (1<<zoom))ytile=((1<<zoom)-1);map.put("z",zoom);map.put("x",xtile);map.put("y",ytile);return map;
}/**** @param url 下载图片的url* @param x* @param y* @param z* @throws IOException*/
public static void downLaodImages(String url,int x,int y, int z,String targetDir) throws IOException {URL realUrl = new URL(url);// 打开和URL之间的连接URLConnection conn = realUrl.openConnection();// 设置通用的请求属性conn.setRequestProperty("Accept-Charset", "utf-8");conn.setRequestProperty("contentType", "utf-8");conn.setRequestProperty("accept", "*/*");conn.setRequestProperty("connection", "Keep-Alive");conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");File zFile = new File(targetDir+"\\"+z);if(!zFile.exists()){zFile.mkdir();}File xFile = new File(targetDir+"\\"+z+"\\"+x);if(!xFile.exists()){xFile.mkdir();}DataInputStream dataInputStream = new DataInputStream(conn.getInputStream()) ;;FileOutputStream fileOutputStream = null;//根据坐标 x y z生成文件名 下载png无损图片String imageName =  targetDir+"\\"+z+"\\"+x+"\\"+y+".png";fileOutputStream = new FileOutputStream(new File(imageName));ByteArrayOutputStream output = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int length;while ((length = dataInputStream.read(buffer)) > 0) {output.write(buffer, 0, length);}fileOutputStream.write(output.toByteArray());dataInputStream.close();fileOutputStream.close();output.close();System.out.println("已完成下载!");
}/*** 压缩*/public static void toZip(String srcDir, String outName, boolean KeepDirStructure)throws RuntimeException{long start = System.currentTimeMillis();ZipOutputStream zos = null ;try {FileOutputStream out= new FileOutputStream(new File(outName));zos = new ZipOutputStream(out);File sourceFile = new File(srcDir);compress(sourceFile,zos,sourceFile.getName(),KeepDirStructure);long end = System.currentTimeMillis();System.out.println("压缩完成,耗时:" + (end - start) +" ms");} catch (Exception e) {throw new RuntimeException("zip error",e);}finally{if(zos != null){try {zos.close();} catch (IOException e) {e.printStackTrace();}}}}
private static void compress(File sourceFile, ZipOutputStream zos, String name,boolean KeepDirStructure) throws Exception{byte[] buf = new byte[BUFFER_SIZE];if(sourceFile.isFile()){// 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字zos.putNextEntry(new ZipEntry(name));// copy文件到zip输出流中int len;FileInputStream in = new FileInputStream(sourceFile);while ((len = in.read(buf)) != -1){zos.write(buf, 0, len);}// Complete the entryzos.closeEntry();in.close();} else {//是文件夹File[] listFiles = sourceFile.listFiles();if(listFiles == null || listFiles.length == 0){// 需要保留原来的文件结构时,需要对空文件夹进行处理if(KeepDirStructure){// 空文件夹的处理zos.putNextEntry(new ZipEntry(name + "/"));// 没有文件,不需要文件的copyzos.closeEntry();}}else {for (File file : listFiles) {// 判断是否需要保留原来的文件结构if (KeepDirStructure) {// 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,// 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了compress(file, zos, name + "/" + file.getName(),KeepDirStructure);} else {compress(file, zos, file.getName(),KeepDirStructure);}}}}}}

安利一门Python超级好课!
扫码下单输优惠码【csdnfxzs】再减5元,比官网还便宜!

下载谷歌离线地图瓦片图相关推荐

  1. 如何下载谷歌离线地图瓦片数据

    离线地图分为两种:一种叫"金字塔瓦片"数据,一种叫"矢量地图数据".我们看的在线地图比如,百度,谷歌,高德等等网页上的地图,都是金字塔瓦片:另外一种是手机上用来 ...

  2. 如何下载高德离线地图瓦片数据

    离线地图分为两种:一种叫"金字塔瓦片"数据,一种叫"矢量地图数据".我们看的在线地图比如,百度,谷歌,高德等等网页上的地图,都是金字塔瓦片:另外一种是手机上用来 ...

  3. 如何下载百度离线地图瓦片数据

    离线地图分为两种:一种叫"金字塔瓦片"数据,一种叫"矢量地图数据".我们看的在线地图比如,百度,谷歌,高德等等网页上的地图,都是金字塔瓦片:另外一种是手机上用来 ...

  4. 如何下载TMS离线地图瓦片数据

    离线地图分为两种:一种叫"金字塔瓦片"数据,一种叫"矢量地图数据".我们看的在线地图比如,百度,谷歌,高德等等网页上的地图,都是金字塔瓦片:另外一种是手机上用来 ...

  5. 在线下载离线地图瓦片 (支持百度、高德和谷歌地图)

    制作离线地图,下载百度矢量数据制作3D地图,下载离线地图数据,下载离线地图瓦片.支持三个主流地图数据(百度.高德和谷歌). 下载网址:http://wmksj.com/ 1. 点击"地图下载 ...

  6. 谷歌地图离线地图瓦片下载_如何下载Google地图以供离线使用

    谷歌地图离线地图瓦片下载 If you've ever wanted to be able to download Google Maps data for offline use, you shou ...

  7. 如何下载离线地图瓦片数据

    离线地图分为两种:一种叫"金字塔瓦片"数据,一种叫"矢量地图数据".我们看的在线地图比如,百度,谷歌,高德等等网页上的地图,都是金字塔瓦片:另外一种是手机上用来 ...

  8. 下载OpenStreetMap离线地图数据并搭载瓦片服务器

    一.下载OpenStreetMap离线地图数据 OpenStreetMap可以在Geofabrik Download Server进行下载. 红框部位可直接下载洲区域地图. 也可以点击洲名称,进入下载 ...

  9. 全能电子地图下载器MapTileDownloader(该软件可提供地图瓦片图)的安装和使用

    本篇文章本人主要参考如下这位大佬的文章: 全能电子地图下载器-获取离线地图瓦片的工具_浩星的博客-CSDN博客_全能电子地图下载器 在该文章的基础上配上自己的使用: 第一步:下载,这是我自己的网盘下载 ...

  10. 高德离线地图瓦片坐标偏移纠偏

    对于地图坐标偏移,以leaflet为例,有如下解决办法 方法1.修改leaflet源码,解决地图坐标偏移问题 方法2.将点位真实的经纬度经过偏移算法,添加到加密的地图上 方法3.直接对离线地图瓦片进行 ...

最新文章

  1. 我在Suse 11 Sp3上使用anaconda安装TensorFlow的过程记录
  2. 使用typedef声明新类型及函数指针
  3. 2021 版 Spring Boot 基础知识复习手册(2w字,建议收藏)
  4. 大话设计模式—模板方法模式
  5. redis实现简单限流
  6. webpack 阅读笔记
  7. eureka自我保护时间_SpringCloud Eureka自我保护机制
  8. 进程通信之飞鸽传书2007绿色版
  9. php 路由实现_PHP操作路由器实现方法示例
  10. 计算机磁盘读取信息,VBA如何获取电脑磁盘信息,这个方法一定要知道
  11. 关于oracle的笔记
  12. 身份证前6位城市代码
  13. 小程序实现tab切换
  14. pack_padded_sequence;pad_packed_sequence
  15. 鲁大师4月安卓新机性能/流畅榜:ROG游戏手机7摘得性能桂冠 vivo登顶流畅榜
  16. 超宽带uwb精准定位,厘米级室内定位技术,实时高精度方案应用
  17. FreeRTOS 链表的深度讲解
  18. grad-cam原理
  19. 修改Android模拟器中System目录的内容(framework.jar)
  20. 【原创】年轻人接受指点,但不接受指指点点

热门文章

  1. 下载Chrome历史版本
  2. 华为杯数学建模2020什么时候出结果_第17届华为杯数学建模竞赛来啦
  3. i.MX应用处理器-iMX8系列产品介绍
  4. 2014Esri全球用户大会之ArcGIS Online
  5. 模板:微信小程序商城模板
  6. 《Redis开发与运维》读书笔记
  7. 正点原子STM32串口通讯实验详解
  8. Win7 便签设置字体方法
  9. 分区桌面背景制作方法-EXCEL
  10. python与工程造价的联系_终于知道工程造价专业面试技巧