溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Qt怎么實(shí)現(xiàn)離線地圖下載

發(fā)布時(shí)間:2021-12-15 10:04:01 來源:億速云 閱讀:309 作者:iii 欄目:互聯(lián)網(wǎng)科技

這篇文章主要講解了“Qt怎么實(shí)現(xiàn)離線地圖下載”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Qt怎么實(shí)現(xiàn)離線地圖下載”吧!

一、前言

網(wǎng)上其實(shí)有很多各種各樣的離線地圖下載器,大部分都是要收費(fèi)的,免費(fèi)的要么是限制了下載的瓦片數(shù)量或者級(jí)別,要么是下載的瓦片圖打上了水印,看起來很難看,由于經(jīng)常需要用到離線地圖,擺脫這個(gè)限制,特意花了點(diǎn)時(shí)間重新研究了瓦片地圖的原理,做了個(gè)離線地圖下載器,其實(shí)瓦片地圖下載沒有那么復(fù)雜,其實(shí)就是從開放的幾個(gè)服務(wù)器地址組建要請求的瓦片地圖的地址,發(fā)送請求以后會(huì)自動(dòng)將圖片返回給你,你只需要拿到圖片數(shù)據(jù)保存成圖片即可。

瓦片地圖下載流程步驟如下:

  1. 獲取可視區(qū)域或者行政區(qū)域的范圍

  2. 拿到區(qū)域的左下角右上角經(jīng)緯度坐標(biāo)

  3. 根據(jù)層級(jí)數(shù)計(jì)算對應(yīng)層級(jí)的瓦片數(shù)

  4. 自動(dòng)生成下載瓦片地圖的地址并發(fā)出請求

  5. 解析收到的數(shù)據(jù)保存成圖片

  6. 更新對應(yīng)界面的下載數(shù)量和進(jìn)度

  7. 可選擇對應(yīng)保存的目錄、全選層級(jí)、中途停止下載等

  8. 可選擇是下載街道圖還是衛(wèi)星圖等

二、功能特點(diǎn)

  1. 多線程同步下載多級(jí)別瓦片地圖,不卡界面。

  2. 內(nèi)置多個(gè)離線地圖下載請求地址,自動(dòng)隨機(jī)選擇一個(gè)發(fā)送請求。

  3. 下載地圖類型同時(shí)支持街道圖和衛(wèi)星圖。

  4. 自動(dòng)計(jì)算可視區(qū)域或者行政區(qū)域的下載瓦片數(shù)量。

  5. 下載的級(jí)別可以自定義范圍和選擇。

  6. 每個(gè)瓦片下載完成都發(fā)送信號(hào)通知,參數(shù)包括下載用時(shí)。

  7. 可設(shè)置下載最大超時(shí)時(shí)間,超過了則丟棄跳到下一個(gè)下載任務(wù)。

  8. 實(shí)時(shí)顯示下載進(jìn)度,以及當(dāng)前級(jí)別已經(jīng)下載的瓦片數(shù)和總瓦片數(shù)。

  9. 下載過程中可以停止下載,下載完成自動(dòng)統(tǒng)計(jì)總用時(shí)。

  10. 內(nèi)置經(jīng)緯度和屏幕坐標(biāo)互相轉(zhuǎn)換函數(shù)。

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

  12. 函數(shù)接口友好和統(tǒng)一,使用簡單方便,就一個(gè)類。

  13. 支持任意Qt版本、任意系統(tǒng)、任意編譯器。

三、效果圖

Qt怎么實(shí)現(xiàn)離線地圖下載

五、相關(guān)代碼

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

    //啟動(dòng)計(jì)時(shí)
    QTime time;
    time.start();

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

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

    //設(shè)置下載超時(shí)
    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) {
        //讀取所有數(shù)據(jù)保存成文件
        QByteArray data = reply->readAll();
        QFile file(dirName + fileName);
        if (file.open(QFile::WriteOnly | QFile::Truncate)) {
            file.write(data);
            file.close();
        }
    } else {
        //可以自行增加下載失敗的統(tǒng)計(jì)
        error = true;
        qDebug() << TIMEMS << "下載出錯(cuò)" << reply->errorString();
    }

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

感謝各位的閱讀,以上就是“Qt怎么實(shí)現(xiàn)離線地圖下載”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Qt怎么實(shí)現(xiàn)離線地圖下載這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

qt
AI