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