#include "frmmapgps2.h" #include "ui_frmmapgps2.h" #include "quihelper.h" #include "webview.h" #include "maphelper.h" #include "mapbaidu.h" frmMapGps2::frmMapGps2(QWidget *parent) : QWidget(parent), ui(new Ui::frmMapGps2) { ui->setupUi(this); this->initForm(); this->initData(); } frmMapGps2::~frmMapGps2() { delete ui; } void frmMapGps2::showEvent(QShowEvent *) { //只需要加载一次,避免重复初始化 static bool isShow = false; if (!isShow) { isShow = true; QMetaObject::invokeMethod(this, "loadMap", Qt::QueuedConnection); } } void frmMapGps2::initForm() { //设置右侧固定宽度 ui->widgetRight->setFixedWidth(AppData::RightWidth); //实例化百度地图类 baidu = new MapBaiDu(this); //实例化通用浏览器控件 web = new WebView(this); //加入到布局 web->setLayout(ui->gridLayout); connect(web, SIGNAL(loadFinished(bool)), this, SLOT(loadFinished(bool))); //定时器模拟轨迹 name = "国产大飞机C919"; timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(moveMarker())); //初始化表格控件 this->initTable(ui->tableWidget); connect(ui->cboxMap, SIGNAL(currentIndexChanged(int)), this, SLOT(loadMap())); } void frmMapGps2::initData() { //如果想要更平滑的效果可以将经纬度坐标密度加大定时器间隔改小这样就可以看到飞机更缓慢的平滑移动 QStringList list; list << "121.424647,31.175186" << "121.424638,31.175267" << "121.424584,31.175410"; list << "121.424494,31.175654" << "121.424404,31.175909" << "121.424301,31.176013"; list << "121.424274,31.176214" << "121.424220,31.176318" << "121.424166,31.176476"; list << "121.424162,31.176569" << "121.424341,31.176669" << "121.424557,31.176712"; list << "121.424808,31.176747" << "121.425276,31.176874" << "121.425792,31.176971"; list << "121.426106,31.177032" << "121.426740,31.177183" << "121.427876,31.177419"; list << "121.428824,31.177623" << "121.429821,31.177851" << "121.430189,31.177897"; list << "121.430387,31.177955" << "121.430203,31.178245" << "121.430113,31.178415"; list << "121.429956,31.178674" << "121.429776,31.179025" << "121.429520,31.179469"; int count = list.count(); ui->tableWidget->setRowCount(count); for (int i = 0; i < count; ++i) { addItem(ui->tableWidget, i, list.at(i)); } } void frmMapGps2::loadMap() { QString fileName = QString("%1/map_web.html").arg(ConfigPath); QString url = "file:///" + fileName; //设置缩放级别 baidu->setMapZoom(19); //显示地图类型切换控件 baidu->setShowMapTypeControl(true); //设置默认的中心点坐标 baidu->setMapCenterPoint("121.424362,31.175942"); //设置地图类型 baidu->setMapLocal(ui->cboxMap->currentIndex() == 1); baidu->setSaveFile(SaveFile); baidu->setFileName(fileName); QString html = baidu->newMap(); //两种方式加载,一种是传入html文件,一种是html内容 if (baidu->getSaveFile()) { web->load(url); } else { QString baseUrl = QString("%1/").arg(ConfigPath); web->load("", html, baseUrl); } } void frmMapGps2::setInfo(int angle, int index, int count) { QString info = QString("角度 %1°/第 %2 个/共 %3 个").arg(angle).arg(index).arg(count); ui->labTip->setText(info); } void frmMapGps2::initTable(QTableWidget *tableWidget) { //初始化表格控件 QUIHelper::initTableView(tableWidget); tableWidget->setColumnCount(2); tableWidget->setHorizontalHeaderLabels(QStringList() << "编号" << "经纬度值"); tableWidget->setColumnWidth(0, 45); tableWidget->setColumnWidth(1, 100); } void frmMapGps2::addItem(QTableWidget *tableWidget, int index, const QString &point) { //编号 QTableWidgetItem *itemId = new QTableWidgetItem; itemId->setText(QString::number(index + 1)); itemId->setTextAlignment(Qt::AlignCenter); tableWidget->setItem(index, 0, itemId); QTableWidgetItem *itemPoint = new QTableWidgetItem; //重新过滤小数点,对齐更好看 itemPoint->setText(MapHelper::getLngLat2(point)); //设置原始数据更准确 itemPoint->setData(Qt::UserRole, point); tableWidget->setItem(index, 1, itemPoint); } void frmMapGps2::loadFinished(bool ok) { //加载完成后立即切换到卫星图 runJs("setMapType(2)"); } void frmMapGps2::runJs(const QString &js) { web->runJs(js); } void frmMapGps2::moveMarker() { QTableWidget *tableWidget = ui->tableWidget; int row = tableWidget->currentRow(); int count = tableWidget->rowCount(); if (row >= 0 && row < count) { //找出和上一个点之间的角度 int angle = 0; QString point = tableWidget->item(row, 1)->data(Qt::UserRole).toString(); //第一个点和最后一个点不用处理 if (row > 0 && row < count - 1) { //上一个点坐标 QString point2 = tableWidget->item(row - 1, 1)->data(Qt::UserRole).toString(); //计算当前上一个点和当前点的旋转角度 angle = MapHelper::getAngle(point2, point); } //执行移动设备点函数,参数带旋转角度 QString js = QString("moveMarker('%1', '%2', %3)").arg(name).arg(point).arg(angle); runJs(js); //重新绘制轨迹点 //清空之前的轨迹点 js = QString("deleteOverlay('Polyline')"); runJs(js); //取出第一个点到当前焦点所在行的点组成已经走过的轨迹点集合重新绘制 QStringList points; for (int i = 0; i <= row; ++i) { points << tableWidget->item(i, 1)->data(Qt::UserRole).toString(); } //绘制路径集合 具体参数含义参见 mapbaidu.cpp 函数对应处 js = QString("addPolyline('%1', '#ff0000', 10, 0.5)").arg(points.join("|")); runJs(js); //移动中心点到当前点,不需要可以注释掉 js = QString("setCenter('%1')").arg(point); runJs(js); //显示当前第几个数据 setInfo(angle, row + 1, count); tableWidget->setCurrentCell(row + 1, 0); } else { on_btnStart_clicked(); } } void frmMapGps2::on_btnStart_clicked() { QTableWidget *tableWidget = ui->tableWidget; ui->btnPause->setText("暂停回放"); if (ui->btnStart->text() == "开始回放") { //限制最小数量 if (tableWidget->rowCount() < 2) { return; } //第一步: 添加一个标记 //图片文件在可执行文件下的config/device目录 QString icon = "./device/device_airplane.png"; int size = 60; QString js = QString("addMarker('%1', '', '', '', 60, '%1', 0, 0, '%2', %3)").arg(name).arg(icon).arg(size); runJs(js); //第二步: 移到第一个点 tableWidget->setFocus(); tableWidget->setCurrentCell(0, 0); timer->start(300); ui->btnStart->setText("停止回放"); moveMarker(); } else { //清空所有 runJs("deleteOverlay('')"); timer->stop(); ui->btnStart->setText("开始回放"); } } void frmMapGps2::on_btnPause_clicked() { //启动阶段才能暂停 if (ui->btnStart->text() == "开始回放"){ return; } if (ui->btnPause->text() == "暂停回放") { timer->stop(); ui->btnPause->setText("继续回放"); } else { timer->start(); ui->btnPause->setText("暂停回放"); } }