需要用到天地图开发者秘钥。注意天地图API访问次数限制。

代码分享:

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;/*** 天地图数据爬取* @author RainingTime* @date 2021.09.17*/
public class TianDiTuDownload {//矢量(行政) - 等经纬度public static String vec_c = "http://{server}.tianditu.gov.cn/vec_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";//矢量(行政) - 墨卡托public static String vec_w = "http://{server}.tianditu.gov.cn/vec_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=vec&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";//矢量注记(行政) - 等经纬度public static String cva_c = "http://{server}.tianditu.gov.cn/cva_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";//矢量注记(行政) - 墨卡托public static String cva_w = "http://{server}.tianditu.gov.cn/cva_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";//影像 - 等经纬度public static String img_c = "http://{server}.tianditu.gov.cn/img_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";//影像 - 墨卡托public static String img_w = "http://{server}.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";//影像注记 - 等经纬度public static String cia_c = "http://{server}.tianditu.gov.cn/cia_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cia&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";//影像注记 - 墨卡托public static String cia_w = "http://{server}.tianditu.gov.cn/cia_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cia&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";//地形 - 等经纬度public static String ter_c = "http://{server}.tianditu.gov.cn/ter_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=ter&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";//地形 - 墨卡托public static String ter_w = "http://{server}.tianditu.gov.cn/ter_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=ter&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";//地形注记 - 等经纬度public static String cta_c = "http://{server}.tianditu.gov.cn/cta_c/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cta&STYLE=default&TILEMATRIXSET=c&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";//地形注记 - 墨卡托public static String cta_w = "http://{server}.tianditu.gov.cn/cta_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cta&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk={tk}";public static String[] servers = {"t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7"};public static void main(String[] args){String basePath = "G:/天地图";//这里放你的天地图开发者秘钥,注意天地图API访问次数限制String tk = "9a02b3cdd29cd346de4df0422979****";String[] urlArr = {vec_c, vec_w, cva_c, cva_w, img_c, img_w, cia_c, cia_w, ter_c, ter_w, cta_c, cta_w};//要下载的图层int minZoom = 1;int maxZoom = 7;double startLat = 53.58;//开始纬度(从北到南)double endLat = 2.7;//结束纬度(从北到南)double startLon = 73.2;//开始经度(从西到东)double endLon = 135.15;//结束经度(从西到东)ExecutorService exe = Executors.newFixedThreadPool(6);//等经纬度第一层是1x2,纬度数量是2^0,经度数量是2^1//墨卡托投影第一层是2x2,纬度数量是2^1,经度数量是2^1for(int i=0; i<urlArr.length; i++){String url = urlArr[i].replace("{tk}", tk);System.out.println(url);String layerName = url.split("tianditu.gov.cn/")[1].split("/wmts?")[0];System.out.println(layerName);if(layerName.endsWith("c")){//等经纬度for(int z=minZoom; z<=maxZoom; z++){if(z > 10){//天地图10级以上只有中国区域startLat = startLat > 53.58 ? 53.58 : startLat;//开始纬度(从北到南)endLat = endLat < 2.7 ? 2.7 : endLat;//结束纬度(从北到南)startLon = startLon < 73.2 ? 73.2 : startLon;//开始经度(从西到东)endLon = endLon > 135.15 ? 135.15 : endLon;//结束经度(从西到东)}double deg = 360.0 / Math.pow(2, z) / 256;//一个像素点代表多少度int startX = (int)((startLon + 180) / deg / 256);//减数取整int endX = (int)((endLon + 180) / deg / 256);//加数取整int startY = (int)((90 - startLat) / deg / 256);int endY = (int)((90 - endLat) / deg / 256);for(int y=startY; y<=endY; y++){for(int x=startX; x<=endX; x++){final String newUrl = url.replace("{server}", servers[(int) (Math.random()*servers.length)]).replace("{z}", z+"").replace("{y}", y+"").replace("{x}", x+"");//System.out.println(newUrl);final String filePath = basePath + "/" + layerName + "/" + z + "/" + y + "/" + x + ".png";exe.execute(new Runnable() {@Overridepublic void run() {File file = new File(filePath);if(!file.exists()){if(!file.getParentFile().exists()){file.getParentFile().mkdirs();}boolean loop = true;int count = 0;while(loop && count<5){//下载出错进行重试,最多5次count++;try {InputStream in = getFileInputStream(newUrl);OutputStream out = new BufferedOutputStream(new FileOutputStream(file));byte[] b = new byte[8192];int len = 0;while((len = in.read(b)) > -1){out.write(b, 0, len);out.flush();}out.close();in.close();loop = false;} catch (Exception e) {loop = true;}}if(loop){System.out.println("下载失败:"+newUrl);}}}});}}}}else{//墨卡托for(int z=minZoom; z<=maxZoom; z++){if(z > 10){//天地图10级以上只有中国区域startLat = startLat > 53.58 ? 53.58 : startLat;//开始纬度(从北到南)endLat = endLat < 2.7 ? 2.7 : endLat;//结束纬度(从北到南)startLon = startLon < 73.2 ? 73.2 : startLon;//开始经度(从西到东)endLon = endLon > 135.15 ? 135.15 : endLon;//结束经度(从西到东)}double deg = 360.0 / Math.pow(2, z) / 256;//一个像素点代表多少度int startX = (int)((startLon + 180) / deg / 256);int endX = (int)((endLon + 180) / deg / 256);/*** 这里是基于等经纬度坐标转墨卡托坐标的公式得到的算法。()* 先算出当前地图级别下纬度方向用该有多少个像素点(一个瓦片是256个点,一共有Math.pow(2, z)个瓦片)* 再算出指定纬度坐标与赤道的距离(北半球为正南半球为负)(这里抵消了带入赤道周长的计算,因为它是一个固定值,把赤道周长定为1就抵消了):Math.log(Math.tan((90 + startLat) * Math.PI / 360)) / (Math.PI / 180)* 就可以得到纬度坐标距赤道有多少个点:(Math.log(Math.tan((90 + startLat) * Math.PI / 360)) / (Math.PI / 180)) / (360/Math.pow(2, z)/256) + 0.5)* 然后就可以计算出其瓦片坐标。*/int startY = (((int)Math.pow(2, z) * 256 / 2) - (int)((Math.log(Math.tan((90 + startLat) * Math.PI / 360)) / (Math.PI / 180)) / (360/Math.pow(2, z)/256) + 0.5)) / 256;int endY = (((int)Math.pow(2, z) * 256 / 2) - (int)((Math.log(Math.tan((90 + endLat) * Math.PI / 360)) / (Math.PI / 180)) / (360/Math.pow(2, z)/256) + 0.5)) / 256;for(int y=startY; y<=endY; y++){//加入判断是等经纬度还是墨卡托for(int x=startX; x<=endX; x++){final String newUrl = url.replace("{server}", servers[(int) (Math.random()*servers.length)]).replace("{z}", z+"").replace("{y}", y+"").replace("{x}", x+"");//System.out.println(newUrl);final String filePath = basePath + "/" + layerName + "/" + z + "/" + y + "/" + x + ".png";exe.execute(new Runnable() {@Overridepublic void run() {File file = new File(filePath);if(!file.exists()){if(!file.getParentFile().exists()){file.getParentFile().mkdirs();}boolean loop = true;int count = 0;while(loop && count<5){//下载出错进行重试,最多5次count++;try {InputStream in = getFileInputStream(newUrl);OutputStream out = new BufferedOutputStream(new FileOutputStream(file));byte[] b = new byte[8192];int len = 0;while((len = in.read(b)) > -1){out.write(b, 0, len);out.flush();}out.close();in.close();loop = false;} catch (Exception e) {loop = true;}}if(loop){System.out.println("下载失败:"+newUrl);}}}});}}}}}exe.shutdown();while (true) {try {Thread.sleep(1000L);//主线程休眠1秒,等待线程池运行结束,同时避免一直死循环造成CPU浪费} catch (InterruptedException e) {}if (exe.isTerminated()) {//线程池所有线程都结束运行break; }}}//获取文件下载流public static InputStream getFileInputStream(String url) throws Exception{InputStream is = null;CloseableHttpClient httpclient = HttpClients.createDefault();    HttpGet request = new HttpGet(url);request.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");HttpResponse response = httpclient.execute(request);response.setHeader("Content-Type", "application/octet-stream");int statusCode = response.getStatusLine().getStatusCode();if (statusCode == HttpStatus.SC_OK) {HttpEntity entity = response.getEntity();is = entity.getContent();}return is;}}

java下载天地图数据,天地图离线地图,可指定经纬度范围相关推荐

  1. python下载arcgis地图_使用下载器下载适用于arcgis的离线地图切片

    1.下载太乐地图下载器或水经注离线地图下载器(官网下载为适用版,加水印且控制下载大小) 2.地图下载器界面如下 太乐地图下载器 水经注离线地图下载器 3.两款软件操作类似,我们就以水经注离线地图下载器 ...

  2. linux版高德导航软件下载,【高德导航离线地图包下载】高德地图离线包 -ZOL软件下载...

    高德导航离线地图包正宗好地图正宗好应用,欢迎使用由pc操作系统领导企业微软为您冠名的windows8中国好地图--高德导航离线地图包. Win8系统第一款支持3d的地图应用,7500万用户的选择. 高 ...

  3. 如何使用万能地图下载器制作Oruxmaps离线地图

    对于喜欢户外登山和需要野外寻线的朋友,由于野外没有网络,需要手持设备内的地图是离线地图,离线地图可以通过水经注万能地图下载器获取,今天以手机使用Oruxmaps为例,介绍如何制作Oruxmaps离线地 ...

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

    如何发布ArcGIS Server离线地图(google 瓦片) 说明 本案例实现内容:GoogleEarth瓦片地图的获取.在ArcGIS Server Manger中发布下载好的影像瓦片数据. 工 ...

  5. 百度离线地图开发,node实现地图瓦片下载

    最近有个Web项目要用离线地图,项目是在内网环境,找了很多资料,踩了很多坑,好在已经实现了,下面把资料整理一下. 首先是百度离线地图开发包,原文地址是http://www.xiaoguo123.com ...

  6. 离线地图开发瓦片数据详解

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

  7. 【图吧导航】非常好的手机导航软件Mapbar,支持离线地图下载(就是谷歌地图)...

    以前发的百度离线地图存在两个问题,导航的时候当前位置不会居中,会跑到屏幕外面去,再就是地图数据太大.现在找到了图吧,因为名是Mapbar,在用Google地图的时候,就会看到中国的地图供应商是Mapb ...

  8. 【图吧导航】非常好的手机导航软件Mapbar,支持离线地图下载(就是谷歌地图)_我是亲民_新浪博客...

    以前发的百度离线地图存在两个问题,导航的时候当前位置不会居中,会跑到屏幕外面去,再就是地图数据太大.现在找到了图吧,因为名是Mapbar,在用Google地图的时候,就会看到中国的地图供应商是Mapb ...

  9. bigemap手机版离线地图的下载

    Bigemap手机离线地图下载,分手机端下载(方式一)和电脑端下载(方式二),电脑端下载支持个性化地图样式和更多设置 方式一.手机端下载 视频教程:传送门  启动Bigeamap移动app之后,点击界 ...

  10. GIS技术 离线地图实现

    前言 做了一个地理信息采集系统的项目,项目在部署时为单机环境,没有互联网环境.这就要求地图底图需要离线.导航也需要离线.这篇文章就是记录地图底图离线的方案以及在实现过程中遇到的一些问题.记录这篇文章不 ...

最新文章

  1. 资源 | 100+个自然语言处理数据集大放送,再不愁找不到数据!
  2. 深入RESTful无状态原则
  3. ASP.NET Web 项目文件类型
  4. Day8 字符串操作
  5. css 中的若干心得
  6. VTK:图片之ImageSliceMapper
  7. 大一计算机绩点3算什么水平,绩点只有3?我可以解释一下
  8. cmd - 使用curl命令的注意点
  9. Pseudo-document-based Topic Model(基于伪文档的主题模型)的理解以及源码解读
  10. php7 mcrypt模块_如何在php7.2/php7.3中安装mcrypt扩展?
  11. Linux内核网络协议栈5-socket地址绑定
  12. ARMLINUX学习笔记(1)
  13. java json float_java – Json解析问题(值自动更改为float)
  14. 浅谈Android垃圾回收机制
  15. 闲鱼易用高可扩的文章发布工具建设
  16. 微信小程序绘制地图轨迹线路
  17. 龙芯中科科创板上市:市值357亿 成国产CPU第一股
  18. Perl脚本执行方法小结
  19. LeetCode刷题——快慢指针
  20. 陆奇最新演讲:2021年,程序员们应该如何提升自我?

热门文章

  1. 计算机常见故障判断与排除,计算机常见故障的诊断与排除PPT课件.ppt
  2. StretchDIBits绘制原始YUV异常
  3. CentOS7 安装 7-zip 压缩工具
  4. 组合数学1--组合数学简介
  5. CentOS下ftp服务器配置andWin7下cuteftppro连接
  6. 国产Linux系统deepin 小白双系统安装详细教程+笔记本双显卡处理设置+使用体验
  7. 信噪比(dB)换算公式
  8. matlab中怎么计算信噪比,如何计算通信中的信噪比SNR
  9. ORL数据集百度网盘
  10. lmdb数据库的读取与转换(二) —— 数据集操作