日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

下载谷歌离线地图瓦片图

發布時間:2023/12/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 下载谷歌离线地图瓦片图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

項目中遇到一個需求,需要將某個地圖區域的離線地圖下載下來,整理很多網上的資料自己實現根據起始點的經緯度下載離線地圖,代碼如下

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元,比官網還便宜!

總結

以上是生活随笔為你收集整理的下载谷歌离线地图瓦片图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美黄色网络 | 嫩嫩av| 久久婷婷视频 | 裸体一区二区三区 | 自拍偷拍视频网站 | 国产免费午夜 | www香蕉| 亚洲精品在线不卡 | 亚洲一区二区三区四区视频 | 日韩精品一区在线视频 | 91美女免费看| 欧美在线观看一区二区三区 | 国产丝袜在线播放 | 999资源站 | 国产性生活 | 国产亚洲一区二区不卡 | av在线免费播放网址 | 黄色一级片在线看 | 二三区视频 | 实拍女处破www免费看 | 亚洲黄色免费在线观看 | 日韩黄色网址 | 欧美色激情| 四虎国产成人精品免费一女五男 | 色射射| 夜夜骑天天干 | 强行挺进皇后紧窄湿润小说 | 吻胸摸激情床激烈视频 | 国产精品成人无码免费 | 老司机综合网 | 成人蜜桃视频 | 少妇性xxxxxxxxx色武功 | www欧美在线 | 伊人亚洲天堂 | 日本中文字幕成人 | 在线观看福利片 | 成人做爰66片免费看网站 | 国外亚洲成av人片在线观看 | 一区在线视频 | 日本少妇高潮抽搐 | a毛片大片 | 高清国产午夜精品久久久久久 | 国产av电影一区二区三区 | 国产av无码专区亚洲a∨毛片 | 人人爱爱 | 人人草人人搞 | 亚洲高清免费观看 | av在线浏览 | 亚洲天堂2018av | 制服丝袜av在线播放 | 污在线观看 | 亚洲一区在线电影 | 东北少妇高潮抽搐 | 亚洲第三区 | 亚洲一级Av无码毛片久久精品 | 天天爽夜夜爽夜夜爽精品 | 亚洲一区二区三区久久 | 欧美日韩国产免费观看 | 中文字幕一区二区三区四区免费看 | 日韩中文字幕影院 | 国产三级理论片 | 欧美日韩国产图片 | 欧美成人一区二区三区高清 | 成人在线观看一区二区三区 | 91小仙女jk白丝袜呻吟 | 精品综合久久 | 精品国产99一区二区乱码综合 | 亚洲大片免费看 | 羞羞色视频 | 污片在线观看 | 被黑人各种姿势猛c哭h文1 | 黄瓜视频91 | a黄视频 | 国产真人做爰毛片视频直播 | 国产精品国产精品国产专区蜜臀ah | 精品一区在线观看视频 | 日韩成人影视 | 麻豆视频在线免费看 | 国产精品爱啪在线线免费观看 | 亚洲麻豆一区 | 欧美亚洲国产日韩 | 一级黄色免费大片 | 亚洲国产97在线精品一区 | 国产精品久久久久久久午夜 | www.黄色一片 | 德国性猛交xxxxhd | 黄色在线观看免费 | 丝袜操 | 7777奇米影视 | 精品少妇久久久久久888优播 | 99精品久久久 | 日本一区高清 | 美女主播在线观看 | 美女扒开大腿让男人桶 | 91亚洲专区| 午夜88 | 大奶子情人 | 欧美日韩国产网站 | 国产第八页 |