• 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 提取码:o05q 文件名:bin_map.zip
    2. 国内站点:https://gitee.com/feiyangqingyun
    3. 国际站点:https://github.com/feiyangqingyun
    4. 个人主页:https://blog.csdn.net/feiyangqingyun
    5. 知乎主页: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);
        }
    }
    
  • 相关阅读:
    组合数据类型练习
    实验四、递归下降语法分析实验
    词法分析实验报告
    Python基础综合练习
    大数据概述
    一个词法分析程序
    linux基本命令
    有限自动机的构造与识别
    我对编译原理的小小了解
    Scrum 冲刺博客 2
  • 原文地址:https://www.cnblogs.com/feiyangqingyun/p/15806217.html
Copyright © 2020-2023  润新知