项目需要用到离线GIS,研究了一下,做个记录

需要百度离线api的js

参考:
于忠达 https://my.oschina.net/smzd/blog/548538
giao00000 https://blog.csdn.net/wml00000/article/details/82219015

第一个是api2.0 第二个是在此基础上的3.0,我用的是2.0
使用起来和在线的差不多,引入api.js就可以,具体看大佬博客吧

另外一个是地图瓦片,因为是离线地图,所以需要把地图资源下载到本地,百度地图背景是一张张的图片,比如放大级别(zoom)是1,是一张最大的图,放大级别为2,地图会被拆成4份,放大级别为3,地图会被拆成16份 ,这样理解。
地图瓦片的坐标是(zoom,x,y)三元素,zoom是缩放级别,X是横坐标,Y是纵坐标,左下角为原点,具体看下图。


比如你想抓15级地图,目测一个矩形区域,找到左下角的一个点,一路放大到需要的级别,看下x,y的范围即可

中国地图15级范围

左下x 左下y 右上x 右上y
15 3825 626 8614 3301

网上很多抓取瓦片的工具,不是有水印,就是要收费,所以自己写了个爬虫去爬。

首先一个配置文件,定义级别和范围,存储路径,线程数
config.properties

zIndex=15
left-bottom-x=3825
left-bottom-y=626
right-top-x=8614
right-top-y=3301
thread-size=10
#\u76EE\u5F55\u540E\u9762\u4E0D\u52A0\u659C\u7EBF\u662F\u50BB\u903C
savepath=D:\\work\\tiles\\tiles\\

主进程读取配置信息,启动线程

static{Properties pro = new Properties();try{// 开发用这一行 读取当前目录配置文件// pro.load(Demo1.class.getResourceAsStream("config.properties"));// 打jar包用这一行 方便外部修改配置文件pro.load(new FileInputStream("config.properties"));zIndex = pro.getProperty("zIndex");savePath = pro.getProperty("savepath");String leftbottomx = pro.getProperty("left-bottom-x");String leftbottomy = pro.getProperty("left-bottom-y");String righttopx = pro.getProperty("right-top-x");String righttopy = pro.getProperty("right-top-y");String threadsize = pro.getProperty("thread-size");xmin = Integer.valueOf(leftbottomx);ymin = Integer.valueOf(leftbottomy);xmax = Integer.valueOf(righttopx);ymax = Integer.valueOf(righttopy);threadSize = Integer.valueOf(threadsize);System.out.println("读取数据完成xmin:" + xmin + " ymin:" + ymin + " xmax:"+ xmax + " ymax:" + ymax);}catch (IOException e){e.printStackTrace();}
}

根据线程数确定每个线程的任务,线程池什么的都没用,直接跑把。。。

private void getImg(){// 以x分开多线程Integer needRunTaskSize = xmax - xmin;Integer erevtSize = needRunTaskSize / threadSize;for (int i = 0; i < threadSize; i++){// 算出这个线程的范围ImgTask imgTask = new ImgTask(zIndex, erevtSize * (i) + xmin,erevtSize * (i + 1) + xmin, ymin, ymax);imgTask.setSavePath(savePath);imgTask.start();}int lave = needRunTaskSize % threadSize;if (lave != 0){// 多跑一个处理剩余的ImgTask imgTask = new ImgTask(zIndex, xmax - lave, xmax, ymin,ymax);imgTask.setSavePath(savePath);imgTask.start();}
}

单个任务的话,只要从网上拿到图片保存起来就ok

这是个日志文件根据当前任务的范围命名,记录任务状态,下面的都写在了run()里面

File logfile = new File(xmin + "to" + xmax);
BufferedWriter bWriter = null;
if (!logfile.exists())
{try{logfile.createNewFile();}catch (IOException e){e.printStackTrace();}
}
try
{bWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(logfile, true), "utf-8"));
}
catch (UnsupportedEncodingException e)
{e.printStackTrace();
}
catch (FileNotFoundException e1)
{e1.printStackTrace();
}

接下来就是根据参数构建url,这个url可以去官网随便找个demo看下最新的网址是什么,udt=20181205这个参数越新,数据也就越新。
先去判断是不是有这个文件了,有的话就不用请求了,比如任务中断了,下次再跑不用把前面的再请求一遍。

String link = "http://online0.map.bdimg.com/tile/?qt=vtile&x={x}&y={y}&z={z}&styles=pl&scaler=1&udt=20181205&xxx={rand}";
for (int i = xmin; i <= xmax; i++)
{ // 循环Xfor (int j = ymin; j <= ymax; j++){ // 循环Ytry{File dir = new File(savePath + z + "/" + i);if (!dir.exists()){dir.mkdirs();}File file = new File(savePath + z + "/" + i + "/" + j + ".png");// System.out.println(file);if (!file.exists()){file.createNewFile();}else{bWriter.write("文件存在跳过" + file);bWriter.newLine();bWriter.flush();System.out.println("文件存在跳过" + file);continue;}

如果本地没有这个文件,那就下载下来

URL url = new URL(link.replace("{x}", i + "").replace("{y}", j + "").replace("{z}", z + "").replace("{rand}", new Date().getTime() + ""));
//System.out.println(url);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(100);
conn.connect();
InputStream in = conn.getInputStream();
OutputStream out = new FileOutputStream(file);
byte[] bytes = new byte[1024 * 20];
int len = 0;
while ((len = in.read(bytes)) != -1)
{out.write(bytes, 0, len);
}
out.close();
in.close();
bWriter.write("成功下载" + file);
bWriter.newLine();
bWriter.flush();

然后导出个jar包,放在那里跑把



15级抓完有10个G, 1-14级才2个多G

代码仍在了这里
https://gitee.com/localhost_liangbing/baiduTiles

抓取百度地图瓦片(离线GIS)相关推荐

  1. python爬取地图地址_用Python抓取百度地图里的店名,地址和联系方式

    原标题:用Python抓取百度地图里的店名,地址和联系方式 每日干货好文分享丨请点击+关注 欢迎关注天善智能微信公众号,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区. 对商业智能BI.大数 ...

  2. 如何用python抓地图_用Python抓取百度地图里的店名,地址和联系方式!屌不屌?...

    昨晚看到一篇爬取百度地图信息的的代码,我更改了城市,关键词,页码等,完成了获取有关"筛网"店铺的信息. 代码如下: import requests import re import ...

  3. python抓取百度地图数据_Python 百度地图爬虫 - 搜索数据采集

    class Hot_City_Coordinates(): """获取热门城市""" def __init__(self): self.he ...

  4. 离线版百度地图瓦片下载html版

    离线版百度地图瓦片下载html版:http://download.csdn.net/detail/wyazyf/9858560

  5. Python爬取百度地图的瓦片图

    Python爬取百度地图的瓦片图 需求 代码 爬虫结果 需求 采用Python + Selenium + phantomJs,自动爬取百度地图的栅格图(瓦片图),支持自定义区域.级别.无文字地图. 去 ...

  6. 最全面的百度地图JavaScript离线版开发

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/5822231.html 项目要求web版百度地图要离线开发.这里总结下自己的开发过程和经验. 大概需求是:每辆 ...

  7. python爬取地图地址_Python爬取百度地图poi数据 !

    锵锵锵,我来啦.10天过的好快呀,4月份都已经过了三分之一,我的体重还居高不下,qwq.今天给大家分享python爬取百度地图小区的数据,希望大家看后,可以尝试自己编写爬取自己所在市的中学,公园,银行 ...

  8. 运用百度地图API离线版(在线版)实现网管系统中终端定位和终端信息获取的功能...

    一.了解百度地图API 1.百度地图JavaScript API简介 百度地图JavaScript API是一套由JavaScript语言编写的应用程序接口,可在网站中构建功能丰富.交互性强的地图应用 ...

  9. python爬取百度贴吧中的所有邮箱_使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号...

    原标题:使用 Python 编写多线程爬虫抓取百度贴吧邮箱与手机号 不知道大家过年都是怎么过的,反正栏主是在家睡了一天,醒来的时候登QQ发现有人找我要一份贴吧爬虫的源代码,想起之前练手的时候写过一个抓 ...

最新文章

  1. 如何在“首选项”摘要中显示Android首选项的当前值?
  2. 儿童学python编程入门用途-干货 | 看了此文,家长就知道为啥要让孩子学Python?...
  3. keepalived之 Keepalived 原理(定义、VRRP 协议、VRRP 工作机制)
  4. spring源码分析之spring-web remoting模块概况及基本概念
  5. 中leetcode提示未登录_分享一款将 LeetCode 中 AC 的题目转化为 MarkDown 表格的插件...
  6. [译]Java 垃圾回收介绍
  7. mysql connection是什么_记一次MySQL出现too many connection
  8. 在SQLSERVER企业管理器中如何创建触发器
  9. 深入浅出的webpack4构建工具--webpack4+react构建环境(二十)
  10. php 多进程 常驻内存,PHP 多进程与信号中断实现多任务常驻内存管理 [Master/Worker 模型]...
  11. java web 生命周期_JavaWeb的生命周期
  12. java 算法比较,java几种面消隐算法的比较
  13. mysql 忘记root密码的解决办法
  14. linux shell编程if语句内判断参数
  15. 金山视频云推出QUIC+,畅快直播再升级
  16. Python单元测试报告框架PyTestReport
  17. 清华自动化大一 C++作业引爆全网,特奖得主、阿里P6:我们也做不到
  18. win10街头篮球服务器维护中,win10系统玩街头篮球游戏延迟不顺畅的处理技巧
  19. spark(1)---概述
  20. 中国自主研制出的速度最高的巨型计算机是,2018年,中国自主研制出的速度最高的巨型计算机是()?...

热门文章

  1. java循环例题while型_Java基础--while、do-while、for循环结构(附例题)
  2. hadoop SWAP交换空间
  3. python变量名可以用下划线开头吗_python以下划线开头的变量和函数的作用
  4. 质量、质量要求、检验、验证和确认
  5. 对话霍金弟子:AI能帮助人类到其他星球进行时空旅行 | AI英雄
  6. P1458 [USACO2.1]顺序的分数 Ordered Fractions
  7. 7-39 抽卡游戏 (30分) 本题的灵感来源于一个古典的概率模型。 AliceAliceAlice 在一个卡池里抽卡,里面有 xxx 张 sss 卡和 yyy 张 aaa 卡。 AliceAlice
  8. 青鸟锦江学员车宏鑫正面回答面试官的十大面试问题
  9. android备份recovery,Recovery(Android手机备份功能)
  10. matlab多孔介质蒸发,随机生成多孔介质matlab程序.doc