Qt怎么实现离线地图下载

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

创新互联建站是创新、创意、研发型一体的综合型网站建设公司,自成立以来公司不断探索创新,始终坚持为客户提供满意周到的服务,在本地打下了良好的口碑,在过去的10余年时间我们累计服务了上千家以及全国政企客户,如茶艺设计等企业单位,完善的项目管理流程,严格把控项目进度与质量监控加上过硬的技术实力获得客户的一致表扬。

一、前言

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

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

  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怎么实现离线地图下载这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


名称栏目:Qt怎么实现离线地图下载
文章来源:http://scyanting.com/article/igscdd.html