最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Qt實現(xiàn)離線瓦片地圖下載器

 更新時間:2022年02月10日 16:28:00   作者:feiyangqingyun  
這篇文章主要介紹了如何通過Qt實現(xiàn)離線瓦片地圖下載器,文中的示例代碼對我們學習或工作有一定的幫助,感興趣的可以跟隨小編一起學習一下

一、前言

寫這個離線地圖下載器的初衷,就是為了方便自己的幾個需要離線地圖的程序,客戶需求,既然地圖程序已經(jīng)可以支持離線地圖,那如何獲取到這些離線瓦片地圖文件是個關鍵,而且這是這個功能的關鍵,拿到這些一張張的瓦片圖片文件,才能根據(jù)js函數(shù)繪制組合成離線地圖。

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

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

  1. 獲取可視區(qū)域或者行政區(qū)域的范圍。
  2. 拿到區(qū)域的左下角右上角經(jīng)緯度坐標。
  3. 根據(jù)層級數(shù)計算對應層級的瓦片數(shù)。
  4. 自動生成下載瓦片地圖的地址并發(fā)出請求。
  5. 解析收到的數(shù)據(jù)保存成圖片。
  6. 更新對應界面的下載數(shù)量和進度。
  7. 可選擇對應保存的目錄、全選層級、中途停止下載等。
  8. 可選擇是下載街道圖還是衛(wèi)星圖等。

二、功能特點

多線程同步下載多級別瓦片地圖,不卡界面。

內置多個離線地圖下載請求地址,自動隨機選擇一個發(fā)送請求。

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

自動計算可視區(qū)域或者行政區(qū)域的下載瓦片數(shù)量。

下載的級別可以自定義范圍和選擇。

每個瓦片下載完成都發(fā)送信號通知,參數(shù)包括下載用時。

可設置下載最大超時時間,超過了則丟棄跳到下一個下載任務。

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

下載過程中可以停止下載,下載完成自動統(tǒng)計總用時。

內置經(jīng)緯度和屏幕坐標互相轉換函數(shù)。

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

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

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

三、體驗地址

體驗地址:https://pan.baidu.com/s/15ZKAlptW-rDcNq8zlzdYLg  提取碼:uyes 文件名:bin_map.zip

國內站點:https://gitee.com/feiyangqingyun

國際站點:https://github.com/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);
    }

    //局部的事件循環(huán),不卡主界面
    QEventLoop eventLoop;

    //設置超時 5.15開始自帶了超時時間函數(shù) 默認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) {
        //讀取所有數(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)計
        error = true;
        qDebug() << TIMEMS << "下載出錯" << reply->errorString();
    }

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

到此這篇關于基于Qt實現(xiàn)離線瓦片地圖下載器的文章就介紹到這了,更多相關Qt離線瓦片地圖下載內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++實現(xiàn)線程同步的四種方式總結

    C++實現(xiàn)線程同步的四種方式總結

    這篇文章主要為大家詳細介紹了C++實現(xiàn)線程同步的四種方式,文中的示例代碼講解詳細,對我們學習C++有一定的幫助,需要的可以參考一下
    2022-11-11
  • 基于C/C++將派生類賦值給基類的超詳細講解

    基于C/C++將派生類賦值給基類的超詳細講解

    類其實也是一種數(shù)據(jù)類型,也可以發(fā)生數(shù)據(jù)類型轉換,下面這篇文章主要給大家介紹了關于基于C/C++將派生類賦值給基類的超詳細講解,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • C++高性能服務器框架之協(xié)程調度模塊

    C++高性能服務器框架之協(xié)程調度模塊

    這篇文章主要介紹了C++高性能服務器框架中的協(xié)程調度模塊,文中通過代碼示例介紹的非常詳細,對我們的學習或工作有一定的幫助,需要的朋友可以參考下
    2023-06-06
  • 深入理解C++中的文件操作

    深入理解C++中的文件操作

    這篇文章主要給大家深入的介紹了C++中的文件操作,文件的操作對每個程序員來說都是很重要的,本文的介紹的很詳細,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • C++異步數(shù)據(jù)交換實現(xiàn)方法介紹

    C++異步數(shù)據(jù)交換實現(xiàn)方法介紹

    這篇文章主要介紹了C++異步數(shù)據(jù)交換實現(xiàn)方法,異步數(shù)據(jù)交換,除了阻塞函數(shù) send() 和 recv() 之外,Boost.MPI 還支持與成員函數(shù) isend() 和 irecv() 的異步數(shù)據(jù)交換
    2022-11-11
  • C字符串與C++中string的區(qū)別詳解

    C字符串與C++中string的區(qū)別詳解

    以下是對C字符串與C++中string的區(qū)別進行了詳細的分析介紹,需要的朋友可以過來參考下
    2013-09-09
  • 淺談C語言中的注釋風格小結

    淺談C語言中的注釋風格小結

    今天小編就為大家分享一篇淺談C語言中的注釋風格小結,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • C++基礎入門教程(四):枚舉和指針

    C++基礎入門教程(四):枚舉和指針

    這篇文章主要介紹了C++基礎入門教程(四):枚舉和指針,本文重點講解了指針,有幽默搞笑的語言描述了指針,需要的朋友可以參考下
    2014-11-11
  • C++ 如何判斷四個點是否構成正方形

    C++ 如何判斷四個點是否構成正方形

    這篇文章主要介紹了C++ 如何判斷四個點是否構成正方形的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • C++ 中約瑟夫環(huán)替換計數(shù)器m(數(shù)組解決)

    C++ 中約瑟夫環(huán)替換計數(shù)器m(數(shù)組解決)

    這篇文章主要介紹了C++ 中約瑟夫環(huán)替換計數(shù)器m(數(shù)組解決)的相關資料,需要的朋友可以參考下
    2017-05-05

最新評論

巴中市| 湖南省| 永德县| 唐山市| 五指山市| 汤原县| 黄浦区| 丰原市| 什邡市| 马边| 砀山县| 金寨县| 英山县| 蕲春县| 博白县| 双牌县| 鹿邑县| 高青县| 宁阳县| 周口市| 和顺县| 新源县| 偃师市| 平安县| 南丹县| 手游| 囊谦县| 永登县| 海盐县| 南郑县| 巴塘县| 泽普县| 靖远县| 兴山县| 泰宁县| 普兰店市| 日喀则市| 子长县| 娄烦县| 茂名市| 博湖县|