地图显示模块

本文介绍了如何使用QT界面设计,通过百度地图API获取动态地图图片,并实现图片的放大缩小功能,同时允许用户通过鼠标或触摸屏幕改变地图显示的地理位置。着重讲解了网络请求处理、图片显示以及事件过滤器的实现。
摘要由CSDN通过智能技术生成

步骤

1.获取 API

我用的是百度地图的 API

QString url_msg = QString("http://api.map.baidu.com/staticimage?center=&markers=113.25,23.13&zoom=%1&width=800&height=480").arg(zoom);

参数:

  • markers: 坐标(经度,纬度)
  • zoom:放大倍数
  • width:图片显示宽度
  • height:图片显示高度

这个API的优点是:不用申请 token
图片显示的位置默认是广州(我代码里面的

2. 发送网络请求

//搜索位置
void MapWindow::on_pushButton_search_clicked()
{
    QString url_msg = QString("http://api.map.baidu.com/staticimage?center=&markers=113.25,23.13&zoom=%1&width=800&height=480").arg(zoom);
    QNetworkRequest request;
    //将图片存储为 map.png
    file = new QFile("map.png");
    file->open(QIODevice::WriteOnly);
    request.setUrl(url_msg);
    //发送网络请求
    reply = manager->get(request);
    //准备接收网络信息
    QObject::connect(reply, &QIODevice::readyRead, this, &MapWindow::get_read);
    //加载数据,加载完毕后显示地图图片
    QObject::connect(reply, &QNetworkReply::downloadProgress, this, &MapWindow::get_progress);
    //使能放大、缩小按钮
    ui->pushButton_zoom_in->setEnabled(true);
    ui->pushButton_zoom_out->setEnabled(true);
}

3. 处理网络响应得到的图片

//加载数据
void MapWindow::get_progress(qint64 bytesReceived, qint64 bytesTotal)
{
    qDebug() << "All:" << bytesTotal << endl << "Received:" << bytesReceived;
    if(bytesReceived == bytesTotal){
        qDebug() << "加载完毕";
        file->close();
        emit display_pic();
    }
}

//显示图片
void MapWindow::display_pic_slot()
{
    this->setStyleSheet("MapWindow{border-image: url(./map.png);}");
}

4.设置“图片放大\缩小”按钮

//地图放大
void MapWindow::on_pushButton_zoom_in_clicked()
{
    if(zoom >= 19)
        return;
    zoom++;
    show_map();
    if(zoom == 19)
        ui->pushButton_zoom_in->setEnabled(false);
    ui->pushButton_zoom_out->setEnabled(true);
}

//地图缩小
void MapWindow::on_pushButton_zoom_out_clicked()
{
    if(zoom <= 4)
        return;
    --zoom;
    show_map();
    if(zoom == 4)
        ui->pushButton_zoom_out->setEnabled(false);
    ui->pushButton_zoom_in->setEnabled(true);
}

设置拖到鼠标或者是点击屏幕 实现地点显示变化

//事件过滤器
bool MapWindow::eventFilter(QObject *watched, QEvent *event)
{
    if(watched == this){
        QTouchEvent *touch = static_cast<QTouchEvent*>(event);
        switch (event->type()) {
        //鼠标按下事件
        case QEvent::MouseButtonPress:
            pres_flag = 1;
            //记录按下点的 x 、 y 坐标
            last_point.setY(cursor().pos().y());
            last_point.setX(cursor().pos().x());
            break;
        //鼠标松开事件
        case QEvent::MouseButtonRelease:
            rele_flag = 1;
            //记录按下点的 x 、 y 坐标
            point.setY(cursor().pos().y());
            point.setX(cursor().pos().x());
            break;
        //触摸事件
        case QEvent::TouchBegin:
            //记录按下点的 x 、 y 坐标
            point.setY(touch->touchPoints().at(0).pos().y());
            point.setX(touch->touchPoints().at(0).pos().x());
            if(point.x() < 500 || point.y() < 350){
                rele_flag = 1;
                pres_flag = 1;
            }
            event->accept();
            break;
        default:
            break;
        }
    }
    if(pres_flag == 1 && rele_flag == 1){
        pres_flag = 0;
        rele_flag = 0;
        //触摸事件,算出移动的数据
        if(event->type() == QEvent::TouchBegin){
            m_x = 400 - point.x();
            m_y = 240 - point.y();
        }
        //鼠标事件,算出移动的数据
        else{
            m_x = point.x() - last_point.x();
            m_y = point.y() - last_point.y();
        }
        if(m_x > 10 || m_x < -10 || m_y > 10 || m_y < -10){
            //计算需要偏移多少东经北纬
            move_x = m_x*0.0000003*(19-zoom)*(19-zoom)*(19-zoom)*(19-zoom);
            move_y = m_y*0.0000003*(19-zoom)*(19-zoom)*(19-zoom)*(19-zoom);
            pos_x -= move_x;
            pos_y += move_y;
            show_map();
        }
    }
    //将事件传递给父类
    return QWidget::eventFilter(watched,event);
}

QT 界面设计

在这里插入图片描述

### 回答1: AGV(自动导引车)的地图显示模块是AGV系统中的重要组成部分。这个模块主要负责将AGV操作区域的地图信息可视化展示给用户。 地图显示模块可以通过连接AGV系统的控制中心,实时获取AGV运行区域的地图信息。它可以显示AGV在地图上的实时位置,以及各种标记和图标代表不同的物体、设备或者任务。通过这种方式,操作员可以方便地监控和管理多辆AGV的运行情况。 地图显示模块还可以配备一些交互功能,比如缩放、平移、旋转地图等,让用户能够更加具体地查看和控制AGV的运行。同时,地图显示模块也会显示一些运行状态信息,比如电量、速度等。 通过地图显示模块,操作员可以及时了解AGV的运行路线,判断是否遇到障碍物或者其他问题,并可以进行实时调整和干预。此外,地图显示模块还可以配合路径规划算法,为AGV提供最优的运行路线。 总而言之,地图显示模块在AGV系统中起到了非常重要的作用。它通过可视化的方式展示AGV运行区域的地图,帮助操作员更好地掌控和管理AGV的运行状态。同时,它也与其他模块相互配合,为AGV提供精确的位置信息和最优的运行路线,提高了AGV的运行效率和安全性。 ### 回答2: AGV中的地图显示模块是指在自动导航引导车(Automatic Guided Vehicle,AGV)中用来显示地图信息的一个重要组件。地图显示模块通常由硬件和软件两部分组成。 硬件方面,地图显示模块一般包括显示屏、显示控制器、触摸屏等组件。显示屏通常采用液晶技术,能够提供清晰的图像显示效果。显示控制器用于控制显示屏的显示内容和参数设置。触摸屏则提供了交互界面,用户可以通过触摸屏来选择地图显示的区域、放大缩小、搜索等操作。 软件方面,地图显示模块需要有地图管理和显示控制的软件。地图管理软件用于导入、编辑和保存地图数据。它可以将现实世界的地理信息转化为AGV可识别的地图数据,包括道路、障碍物、充电桩等。显示控制软件负责控制地图显示方式,包括层级、缩放比例、定位标识等。同时,还可以实现其他功能,如路径规划、实时位置显示等。 地图显示模块在AGV系统中起到了重要的作用。它通过直观的地图显示,方便用户了解当前AGV所处的位置和周围环境;通过与触摸屏的交互,用户可以通过选择地图上的区域来指定AGV前往的目的地;同时,地图显示模块支持路径规划功能,可以根据地图信息自动规划最优路径,提高AGV的导航效率。 总之,AGV中的地图显示模块通过硬件显示器和软件控制,为用户提供地图信息的显示和交互功能。它是AGV导航系统中不可或缺的重要组成部分,为AGV的自动导航和操作提供了便利。 ### 回答3: AGV(自动导引车)中的地图显示模块是一种能够实时显示地图信息的工具。它通常由软件和硬件组成,可以在AGV操作界面上显示地图的各种要素,包括建筑物、道路、障碍物和各种设备等。下面是关于AGV中地图显示模块的介绍。 首先,地图显示模块通常利用传感器和激光扫描等技术获取地图数据。AGV配备了激光雷达等传感器,可以实时扫描周围环境,获取地图所需的数据。然后,这些数据经过处理和分析,被转化为地图信息,并通过地图显示模块在AGV界面上进行显示。 其次,地图显示模块具有多种功能。它可以显示实时位置和运动轨迹,以及AGV传感器检测到的障碍物和其他目标。此外,它还可以显示各种设备和设施的位置和状态,如货架、输送机和机械手等。 此外,地图显示模块通常具有交互功能。用户可以通过触摸屏或按钮等操作界面,对地图进行放大、缩小和平移等操作,以便更好地观察地图细节。同时,地图显示模块还可以与其他控制模块和路径规划模块进行集成,实现对AGV的控制和导航功能。 最后,地图显示模块对于提高AGV的工作效率和安全性至关重要。通过实时显示地图信息,操作人员可以清晰地了解当前环境,并做出相应的决策。地图显示模块还可以提供预警功能,当检测到异常情况时,及时警示操作人员避免事故的发生。 总而言之,AGV中的地图显示模块是提供实时地图信息的工具,通过显示建筑物、道路、设备和障碍物等要素,帮助操作人员进行控制和导航,并提高AGV的工作效率和安全性。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值