您好,登錄后才能下訂單哦!
這篇文章主要講解了“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ù)保存成圖片即可。
瓦片地圖下載流程步驟如下:
獲取可視區(qū)域或者行政區(qū)域的范圍
拿到區(qū)域的左下角右上角經(jīng)緯度坐標(biāo)
根據(jù)層級(jí)數(shù)計(jì)算對應(yīng)層級(jí)的瓦片數(shù)
自動(dòng)生成下載瓦片地圖的地址并發(fā)出請求
解析收到的數(shù)據(jù)保存成圖片
更新對應(yīng)界面的下載數(shù)量和進(jìn)度
可選擇對應(yīng)保存的目錄、全選層級(jí)、中途停止下載等
可選擇是下載街道圖還是衛(wèi)星圖等
多線程同步下載多級(jí)別瓦片地圖,不卡界面。
內(nèi)置多個(gè)離線地圖下載請求地址,自動(dòng)隨機(jī)選擇一個(gè)發(fā)送請求。
下載地圖類型同時(shí)支持街道圖和衛(wèi)星圖。
自動(dòng)計(jì)算可視區(qū)域或者行政區(qū)域的下載瓦片數(shù)量。
下載的級(jí)別可以自定義范圍和選擇。
每個(gè)瓦片下載完成都發(fā)送信號(hào)通知,參數(shù)包括下載用時(shí)。
可設(shè)置下載最大超時(shí)時(shí)間,超過了則丟棄跳到下一個(gè)下載任務(wù)。
實(shí)時(shí)顯示下載進(jìn)度,以及當(dāng)前級(jí)別已經(jīng)下載的瓦片數(shù)和總瓦片數(shù)。
下載過程中可以停止下載,下載完成自動(dòng)統(tǒng)計(jì)總用時(shí)。
內(nèi)置經(jīng)緯度和屏幕坐標(biāo)互相轉(zhuǎn)換函數(shù)。
目前支持百度地圖,其他地圖比如谷歌地圖、騰訊地圖、高德地圖可以定制。
函數(shù)接口友好和統(tǒng)一,使用簡單方便,就一個(gè)類。
支持任意Qt版本、任意系統(tǒng)、任意編譯器。
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)注!
免責(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)容。