Qt编写地图综合应用52-加载离线地图
一、前言
离线地图的加载其实和在线地图的加载方法几乎一样,唯一的最大区别就是,之前可能一个js文件引入即可,现在需要多个本地的js文件引入,而且网上流传的js文件的版本比较旧,意味着现在新版的支持opengl形式的地图无法支持,后期再去网上搜索找找看能不能搞到最新的版本。
离线地图加载依赖一堆的js文件,整个文件夹可以自定义放置的位置,在网页代码引入的时候指定位置就行,一般建议就放在可执行文件下新建一个目录专门存放,这样管理方便,离线地图对应的图片文件目录也是可配置的,也建议放在这个目录下。
二、功能特点
- 多线程同步下载多级别瓦片地图,不卡界面。
- 内置多个离线地图下载请求地址,自动随机选择一个发送请求。
- 下载地图类型同时支持街道图和卫星图。
- 自动计算可视区域或者行政区域的下载瓦片数量。
- 下载的级别可以自定义范围和选择。
- 每个瓦片下载完成都发送信号通知,参数包括下载用时。
- 可设置下载最大超时时间,超过了则丢弃跳到下一个下载任务。
- 实时显示下载进度,以及当前级别已经下载的瓦片数和总瓦片数。
- 下载过程中可以停止下载,下载完成自动统计总用时。
- 内置经纬度和屏幕坐标互相转换函数。
- 目前支持百度地图,其他地图比如谷歌地图、腾讯地图、高德地图可以定制。
- 函数接口友好和统一,使用简单方便,就一个类。
- 支持任意Qt版本、任意系统、任意编译器。
三、体验地址
- 体验地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 文件名:bin_map.zip
- 国内站点:https://gitee.com/feiyangqingyun
- 国际站点:https://github.com/feiyangqingyun
- 个人主页:https://blog.csdn.net/feiyangqingyun
- 知乎主页:https://www.zhihu.com/people/feiyangqingyun/
四、效果图

五、相关代码
void frmMapDownload::getCount()
{
//计算瓦片数
QString pointLeftBottom = ui->txtPointLeftBottom->text();
QString pointRightTop = ui->txtPointRightTop->text();
QStringList listLeftBottom = pointLeftBottom.split(",");
QStringList listRightTop = pointRightTop.split(",");
double lngLeftBottom = listLeftBottom.at(0).toDouble();
double latLeftBottom = listLeftBottom.at(1).toDouble();
double lngRightTop = listRightTop.at(0).toDouble();
double latRightTop = listRightTop.at(1).toDouble();
//mapType=0表示百度地图 =4表示谷歌地图
int mapType = ui->cboxMapType->currentIndex();
for (int zoom = indexMin; zoom <= indexMax; zoom++) {
int index = zoom - indexMin;
//不同的地图计算的坐标不一样
QPoint pt1, pt2;
if (mapType == 3) {
pt1 = WebHelper::lngLatToTileTian(lngLeftBottom, latLeftBottom, zoom);
pt2 = WebHelper::lngLatToTileTian(lngRightTop, latRightTop, zoom);
} else if (mapType == 4) {
pt1 = WebHelper::lngLatToTileGoogle(lngLeftBottom, latLeftBottom, zoom);
pt2 = WebHelper::lngLatToTileGoogle(lngRightTop, latRightTop, zoom);
} else {
pt1 = WebHelper::lngLatToTileBaiDu(lngLeftBottom, latLeftBottom, zoom);
pt2 = WebHelper::lngLatToTileBaiDu(lngRightTop, latRightTop, zoom);
}
//计算XY坐标最大值最小值
int xmin = qMin(pt1.x(), pt2.x());
int xmax = qMax(pt1.x(), pt2.x());
int ymin = qMin(pt1.y(), pt2.y());
int ymax = qMax(pt1.y(), pt2.y());
pt1 = QPoint(xmin, ymin);
pt2 = QPoint(xmax, ymax);
//方便打印查看计算的结果
if (zoom == 20) {
qDebug() << lngLeftBottom << latLeftBottom << lngRightTop << latRightTop << pt1 << pt2;
}
//当前级别的瓦片数
int count = 0;
for (int j = xmin; j <= xmax; j++) {
for (int k = ymin; k <= ymax; k++) {
count++;
}
}
//显示对应的瓦片总数,设置进度条参数,并更新对应的值
if (count > 0) {
bars.at(index)->setRange(0, count);
}
bars.at(index)->setValue(0);
labs.at(index)->setText(QString::number(count));
pointLeftBottoms[index] = pt1;
pointRightTops[index] = pt2;
}
}
void frmMapDownload::clear()
{
//先进度条全部置为0
currentCount = 0;
foreach (QProgressBar *bar, bars) {
bar->setValue(0);
}
}
void frmMapDownload::receiveDataFromJs(const QString &type, const QVariant &data)
{
if (data.isNull()) {
return;
}
//qDebug() << "frmMapDownload" << type << data;
QString result = data.toString();
if (type == "zoom") {
float zoom = result.toFloat();
QString strZoom = QString::number(zoom, 'f', 3);
ui->txtZoom->setText(strZoom);
} else if (type == "bounds") {
QStringList list = result.split(",");
if (list.count() == 7) {
QString lat, lng, point;
lng = WebHelper::getLngLat1(list.at(0));
lat = WebHelper::getLngLat1(list.at(1));
point = QString("%1,%2").arg(lng).arg(lat);
ui->txtPointLeftBottom->setText(point);
lng = WebHelper::getLngLat1(list.at(2));
lat = WebHelper::getLngLat1(list.at(3));
point = QString("%1,%2").arg(lng).arg(lat);
ui->txtPointRightTop->setText(point);
lng = WebHelper::getLngLat1(list.at(4));
lat = WebHelper::getLngLat1(list.at(5));
point = QString("%1,%2").arg(lng).arg(lat);
ui->txtPointCenter->setText(point);
float zoom = list.at(6).toFloat();
QString strZoom = QString::number(zoom, 'f', 3);
ui->txtZoom->setText(strZoom);
//自动统计瓦片数
this->getCount();
//滚动条滚到最下面,一般都是需要下载级别大的
ui->tableWidget->scrollToBottom();
}
} else if (type == "point") {
QString point = WebHelper::getLngLat2(result);
ui->txtPointCenter->setText(point);
}
}
Qt编写地图综合应用52-加载离线地图的更多相关文章
- WebGIS开发之用openlayers加载离线百度地图
因为项目需要,只有内网环境,没有外网环境,所以需要下载地图瓦片. 一.下载瓦片地图 这个可以自行在网上找一些地图瓦片下载器,下好的瓦片地图是分级的.大概如图这种类型. 二.在地图上显示标记 首先使用o ...
- Qt编写安防视频监控系统17-在线地图
一.前言 在线地图模块在一开始设计整个系统的时候就考虑进去了,主要功能就是在摄像机管理中,提供经纬度信息,然后加载百度地图在浏览器中显示,根据摄像机信息表中的每个摄像机的经纬度信息,自动生成设备点在地 ...
- OpenLayers加载QQ地图(转)
OpenLayers加载QQ地图 http://www.openlayers.cn/portal.php?mod=view&aid=4 2012-10-21 17:22| 发布者: admin ...
- (转) Arcgis for js加载百度地图
http://blog.csdn.net/gisshixisheng/article/details/44853709 概述: 在前面的文章里提到了Arcgis for js加载天地图,在本节,继续讲 ...
- Arcgis for js加载百度地图
看转:https://blog.csdn.net/qq_41046162/article/details/80248281 通过学习了一段时间的arcgis for js,让我来讲一下如何在arcgi ...
- Flex加载google地图、百度地图以及天地图作底图
一 Flex加载Google地图作底图 (1)帮助类GoogleLayer.as /* * 根据输入的地图类型加载Google地图(by chenyuming) */ package Layers ...
- ArcGIS API for Silverlight 加载google地图
原文:ArcGIS API for Silverlight 加载google地图 using System; using System.Net; using System.Windows; using ...
- ArcGIS API for Silverlight加载google地图(后续篇)
原文:ArcGIS API for Silverlight加载google地图(后续篇) 之前在博客中(http://blog.csdn.net/taomanman/article/details/8 ...
- Delphi中用Webbrowser加载百度地图滚轮失效(ApplicationEvents里使用IsChild提前判断是哪个控件的消息)
在Delphi中使用Webbrowser加载百度地图时,点击了其它界面,再回到百度地图中,即使点击了鼠标,再用滚轮也不能缩 放地图,除非点地图里面的自带的控件,之后才能缩放,原因是因为其它窗体控件获得 ...
- ArcGIS API for JavaScript 4.4 版本加载谷歌地图
ArcGIS API for JavaScript 4.X 版本升级后,API发生了很大的变化. 其中就支持了WebEarth展示,主要是通过 esri/views/SceneView 实现的. 在新 ...
随机推荐
- 内核级流量治理引擎Kmesh八大新特性解读
本文分享自华为云社区<内核级流量治理引擎 Kmesh v0.5 发布!进击的Sidecarless服务网格>,作者:云容器大未来. 我们非常高兴地宣布 Kmesh v0.5.0 的发布.首 ...
- 基于.NET8 + Vue/UniApp前后端分离的快速开发框架,开箱即用!
前言 今天大姚给大家分享一款基于.NET8 + Vue/UniApp前后端分离的快速开发框架,开箱即用:ZR.Admin.NET. 开源免费(基于MIT License开源协议).代码量少.学习简单. ...
- 从零开始学机器学习——构建一个推荐web应用
首先给大家介绍一个很好用的学习地址:https://cloudstudio.net/columns 今天,我们终于将分类器这一章节学习完活了,和回归一样,最后一章节用来构建web应用程序,我们会回顾之 ...
- 开源之夏 2023|欢迎报名 Apache RocketMQ 社区项目!
开源之夏是由中科院软件所"开源软件供应链点亮计划"发起并长期支持的一项暑期开源活动,旨在鼓励在校学生积极参与开源软件的开发维护,培养和发掘更多优秀的开发者,促进优秀开源软件社区的蓬 ...
- 宝塔linux 搭建
前言 2020年的时候,用宝塔搭了个WordPress,一个人的博客不算是博客,没有社区氛围.就转到博客园了. 21年跟着教程,写了一个PHP的个人博客项目. 又有一台阿里云的服务器,就把代码部署上去 ...
- CSS动画(波光粼粼登录页面)
1.整体效果 https://mmbiz.qpic.cn/sz_mmbiz_gif/EGZdlrTDJa4AbemkU3vLRIDzTIgPHSjicia97wfvMVAhqZL4lsGbQQCbsV ...
- Python 潮流周刊#75:用 Python 开发 NoSQL 数据库(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- 使用 ollama 在本地试玩 LLM
在 chatGPT 的推动下.LLM 简直火出天际,各行各业都在蹭.听说最近 meta 开源的 llama3 模型可以轻松在普通 PC 上运行,这让我也忍不住来蹭一层.以下是使用 ollama 试玩 ...
- NATAPP实现内网穿透简易教程
NATAPP是什么 NATAPP是一个十分容易上手的内网穿透工具,可以把本机的ip和端口映射到公网,将本机暴露在公网中供他人访问. 这在进行一些回调接口的本地测试(如支付宝微信支付的回调接口)时十分好 ...
- games101_Homework7
实现完整的 Path Tracing 算法 需要修改这一个函数: • castRay(const Ray ray, int depth)in Scene.cpp: 在其中实现 Path Tracing ...