Qt编写地图综合应用51-离线瓦片地图下载
2023-09-14 09:01:42 时间
一、前言
写这个离线地图下载器的初衷,就是为了方便自己的几个需要离线地图的程序,客户需求,既然地图程序已经可以支持离线地图,那如何获取到这些离线瓦片地图文件是个关键,而且这是这个功能的关键,拿到这些一张张的瓦片图片文件,才能根据js函数绘制组合成离线地图。
网上其实有很多各种各样的离线地图下载器,大部分都是要收费的,免费的要么是限制了下载的瓦片数量或者级别,要么是下载的瓦片图打上了水印,看起来很难看,由于经常需要用到离线地图,摆脱这个限制,特意花了点时间重新研究了瓦片地图的原理,做了个离线地图下载器,其实瓦片地图下载没有那么复杂,其实就是从开放的几个服务器地址组建要请求的瓦片地图的地址,发送请求以后会自动将图片返回给你,你只需要拿到图片数据保存成图片即可。
瓦片地图下载流程步骤如下:
- 获取可视区域或者行政区域的范围。
- 拿到区域的左下角右上角经纬度坐标。
- 根据层级数计算对应层级的瓦片数。
- 自动生成下载瓦片地图的地址并发出请求。
- 解析收到的数据保存成图片。
- 更新对应界面的下载数量和进度。
- 可选择对应保存的目录、全选层级、中途停止下载等。
- 可选择是下载街道图还是卫星图等。
二、功能特点
- 多线程同步下载多级别瓦片地图,不卡界面。
- 内置多个离线地图下载请求地址,自动随机选择一个发送请求。
- 下载地图类型同时支持街道图和卫星图。
- 自动计算可视区域或者行政区域的下载瓦片数量。
- 下载的级别可以自定义范围和选择。
- 每个瓦片下载完成都发送信号通知,参数包括下载用时。
- 可设置下载最大超时时间,超过了则丢弃跳到下一个下载任务。
- 实时显示下载进度,以及当前级别已经下载的瓦片数和总瓦片数。
- 下载过程中可以停止下载,下载完成自动统计总用时。
- 内置经纬度和屏幕坐标互相转换函数。
- 目前支持百度地图,其他地图比如谷歌地图、腾讯地图、高德地图可以定制。
- 函数接口友好和统一,使用简单方便,就一个类。
- 支持任意Qt版本、任意系统、任意编译器。
三、体验地址
- 体验地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 文件名:bin_map.zip
- 国内站点:https://gitee.com/feiyangqingyun
- 国际站点:https://github.com/feiyangqingyun
- 个人主页:https://blog.csdn.net/feiyangqingyun
- 知乎主页:https://www.zhihu.com/people/feiyangqingyun/
四、效果图
五、相关代码
void MapDownload::download(const QString &path, int mapType, int downType, int xmin, int xmax, int ymin, int ymax, int zoom)
{
for (int x = xmin; x <= xmax; x++) {
for (int y = ymin; y <= ymax; y++) {
if (stopped) {
return;
}
QString url = getUrl(mapType, downType, x, y, zoom);
QString dirName = QString("%1/%2/%3/").arg(path).arg(zoom).arg(x);
QString fileName = QString("%1.jpg").arg(y);
downloadImage(url, dirName, fileName, zoom);
}
}
}
void MapDownload::downloadBaiDu(const QString &path, int downType, int xmin, int xmax, int ymin, int ymax, int zoom)
{
download(path, 0, downType, xmin, xmax, ymin, ymax, zoom);
}
void MapDownload::downloadTian(const QString &path, int downType, int xmin, int xmax, int ymin, int ymax, int zoom)
{
download(path, 3, downType, xmin, xmax, ymin, ymax, zoom);
}
void MapDownload::downloadGoogle(const QString &path, int downType, int xmin, int xmax, int ymin, int ymax, int zoom)
{
download(path, 4, downType, xmin, xmax, ymin, ymax, zoom);
}
void MapDownload::downloadImage(const QString &url, const QString &dirName, const QString &fileName, int zoom)
{
if (url.isEmpty()) {
return;
}
//启动计时
QElapsedTimer time;
time.start();
//先判断文件夹是否存在,不存在则新建
QDir dir(dirName);
if (!dir.exists()) {
dir.mkpath(dirName);
}
//局部的事件循环,不卡主界面
QEventLoop eventLoop;
//设置超时 5.15开始自带了超时时间函数 默认30秒
#if (QT_VERSION >= QT_VERSION_CHECK(5,15,0))
manager->setTransferTimeout(timeout);
#else
QTimer timer;
connect(&timer, SIGNAL(timeout()), &eventLoop, SLOT(quit()));
timer.setSingleShot(true);
timer.start(timeout);
#endif
QNetworkReply *reply = manager->get(QNetworkRequest(QUrl(url)));
connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));
eventLoop.exec();
bool error = false;
if (reply->bytesAvailable() > 0 && reply->error() == QNetworkReply::NoError) {
//读取所有数据保存成文件
QByteArray data = reply->readAll();
QFile file(dirName + fileName);
if (file.open(QFile::WriteOnly | QFile::Truncate)) {
file.write(data);
file.close();
}
} else {
//可以自行增加下载失败的统计
error = true;
qDebug() << TIMEMS << "下载出错" << reply->errorString();
}
reply->deleteLater();
int useTime = time.elapsed();
emit finsh(url, fileName, zoom, useTime, error);
}
相关文章
- qlineedit 不可编辑_qt中获取lineedit文本内容
- Python3 :PyCharm + Qt designer 学习 + 实例[通俗易懂]
- Qt-改变tabBar位置并改变文字方向
- C/C++ Qt StandardItemModel 数据模型应用
- C/C++ Qt 标准Dialog对话框组件应用
- C/C++ Qt 选择夹TabWidget组件应用
- C/C++ Qt 基本文件读写方法
- C/C++ Qt QThread 线程组件应用
- Qt-qmake install相关
- 编程在Linux下学习Qt界面编程(linux下qt界面)
- Linux下Qt安装指南:快速部署Qt运行环境(linux下qt安装教程)
- Linux下 Qt 安装指南(linux下qt的安装)
- 在Linux上体验Qt的魅力(linux下运行qt)
- 实现Linux下Qt应用静态编译的方法(linux下qt静态编译)
- 使用Qt快速连接MySQL数据库(qt连接mysql)
- 在Linux上高效打包Qt程序(qtlinux程序打包)
- Linux上的Qt 4.7:开拓者的路径(qt4.7linux)
- Linux上Qt的快速安装(linux下载qt)
- 数据库使用Qt连接Oracle数据库:一步一步实现(qt连接oracle)
- Qt与Oracle数据库的高效结合(qt数据库oracle)
- Qt for Linux:下载与安装指南(qt下载linux)
- 探索Linux世界:体验Qt桌面之美(linux桌面qt)
- Linux下的Qt媒体播放器(qtlinux播放器)
- 如何在QT应用程序中使用MYSQL进行编程?(qt的mysql编程)
- 配置Linux的QT环境变量,轻松打造高效开发环境(qt环境变量linux)
- 提高数据处理效率:探究Qt与MySQL数据库的结合应用(qt与mysql数据库)
- 使用QT连接MySQL数据库(qt数据库mysql)
- Qt 5 与 MySQL 数据库联合使用:简单高效的开发实践(qt 5 mysql)