温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Qt怎么实现离线地图下载

发布时间:2021-12-15 10:04:01 来源:亿速云 阅读:310 作者:iii 栏目:互联网科技

这篇文章主要讲解了“Qt怎么实现离线地图下载”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Qt怎么实现离线地图下载”吧!

一、前言

网上其实有很多各种各样的离线地图下载器,大部分都是要收费的,免费的要么是限制了下载的瓦片数量或者级别,要么是下载的瓦片图打上了水印,看起来很难看,由于经常需要用到离线地图,摆脱这个限制,特意花了点时间重新研究了瓦片地图的原理,做了个离线地图下载器,其实瓦片地图下载没有那么复杂,其实就是从开放的几个服务器地址组建要请求的瓦片地图的地址,发送请求以后会自动将图片返回给你,你只需要拿到图片数据保存成图片即可。

瓦片地图下载流程步骤如下:

  1. 获取可视区域或者行政区域的范围

  2. 拿到区域的左下角右上角经纬度坐标

  3. 根据层级数计算对应层级的瓦片数

  4. 自动生成下载瓦片地图的地址并发出请求

  5. 解析收到的数据保存成图片

  6. 更新对应界面的下载数量和进度

  7. 可选择对应保存的目录、全选层级、中途停止下载等

  8. 可选择是下载街道图还是卫星图等

二、功能特点

  1. 多线程同步下载多级别瓦片地图,不卡界面。

  2. 内置多个离线地图下载请求地址,自动随机选择一个发送请求。

  3. 下载地图类型同时支持街道图和卫星图。

  4. 自动计算可视区域或者行政区域的下载瓦片数量。

  5. 下载的级别可以自定义范围和选择。

  6. 每个瓦片下载完成都发送信号通知,参数包括下载用时。

  7. 可设置下载最大超时时间,超过了则丢弃跳到下一个下载任务。

  8. 实时显示下载进度,以及当前级别已经下载的瓦片数和总瓦片数。

  9. 下载过程中可以停止下载,下载完成自动统计总用时。

  10. 内置经纬度和屏幕坐标互相转换函数。

  11. 目前支持百度地图,其他地图比如谷歌地图、腾讯地图、高德地图可以定制。

  12. 函数接口友好和统一,使用简单方便,就一个类。

  13. 支持任意Qt版本、任意系统、任意编译器。

三、效果图

Qt怎么实现离线地图下载

五、相关代码

void MapDownload::download(const QString &url, const QString &dirName, const QString &fileName, int zoom)
{
    if (url.isEmpty()) {
        return;
    }

    //启动计时
    QTime time;
    time.start();

    //先判断文件夹是否存在,不存在则新建
    QDir dir(dirName);
    if (!dir.exists()) {
        dir.mkpath(dirName);
    }

    //局部的事件循环,不卡主界面
    QEventLoop eventLoop;
    QNetworkReply *reply = manager->get(QNetworkRequest(QUrl(url)));
    connect(reply, SIGNAL(finished()), &eventLoop, SLOT(quit()));

    //设置下载超时
    QTimer timer;
    connect(&timer, SIGNAL(timeout()), &eventLoop, SLOT(quit()));
    timer.setSingleShot(true);
    timer.start(timeout);
    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();
    }

    int useTime = time.elapsed();
    emit finsh(url, fileName, zoom, useTime, error);
}

感谢各位的阅读,以上就是“Qt怎么实现离线地图下载”的内容了,经过本文的学习后,相信大家对Qt怎么实现离线地图下载这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

qt
AI