#include "frmmapgps.h" #include "ui_frmmapgps.h" #include "quihelper.h" #include "webview.h" #include "maphelper.h" #include "mapbaidu.h" //#include "windows.h" #include "QSound" #include "math.h" #include #define DEVICE_SIZE 40 frmMapGps::frmMapGps(QString mapKey,QWidget *parent) : QWidget(parent), bInited(false), bLoaded(false), ui(new Ui::frmMapGps) { ListGPSPoints.reserve(100000); ui->setupUi(this); this->MapKey = mapKey; this->initForm(); } frmMapGps::~frmMapGps() { delete ui; } void frmMapGps::showEvent(QShowEvent *) { } //调试状态 bool frmMapGps::CheckBeingDebugged() { return IsDebuggerPresent(); } //-------------------------------------------------------- void frmMapGps::AddPoint(GPS *pGPS,QDateTime datetime) { double longitude = pGPS->BD09Longitude ; double Latitude = pGPS->BD09Latitude; int count = ListGPSPoints.count(); if(!bLoaded) return; if(count==0) { ListGPSPoints.append(GPSPoint(longitude,Latitude)); //qDebug() <<"longtude = "<< longitude <<"latitude = "<< Latitude<<" Counts =" << count << "\r\n"; //ListGPSPoints.append(GPSPoint(longitude+0.003,Latitude+0.003)); AddDeviceMark(); } else { //求和上一点的距离,如果经纬度偏差不超过(1m),不予添加 GPSPoint lastpoint = ListGPSPoints[count-1]; double latitudeError = abs(lastpoint.latitude-Latitude); double longtudeError = abs(lastpoint.longtude-longitude); double error_torrent = 0.0001f; if((latitudeError>error_torrent)||(longtudeError>error_torrent)||CheckBeingDebugged()) { ListGPSPoints.append(GPSPoint(longitude,Latitude)); moveMarker(); //() <<"longtude = "<< longitude <<"latitude = "<< Latitude <<" Counts =" << count << "\r\n"; } } int count1 = ListGPSPoints.count(); ui->tableWidgetSource->setRowCount(count1); for (int i = 0; i < count1; ++i) { addItem(ui->tableWidgetSource, i, ListGPSPoints[i].toString()); } ui->tableWidgetSource->scrollToBottom(); } //============================================================== void frmMapGps::UpdateGPSInfo(GPS *pGPS,QDateTime datetime) { //longitude 经度 //Latitude 纬度 if( ( pGPS->gga_data.quality==1)||(pGPS->gga_data.quality==2))// GGA =1 定位有效 { AddPoint(pGPS,datetime); } } void frmMapGps::initForm() { //设置右侧固定宽度 ui->widgetRight->setFixedWidth(AppData::RightWidth); //选项卡居中 ui->tabWidget->setStyleSheet("QTabWidget::tab-bar{alignment:center;}"); //实例化百度地图类 baidu = new MapBaiDu(this); //读取商用AK 并设置 baidu->setMapVersionKey(MapKey); //实例化通用浏览器控件 web = new WebView(this); //加入到布局 web->setLayout(ui->gridLayout); //关联浏览器控件信号 connect(web, SIGNAL(receiveDataFromJs(QString, QVariant)), this, SLOT(receiveDataFromJs(QString, QVariant))); connect(web, SIGNAL(loadFinished(bool)), this, SLOT(loadFinished(bool))); //定时器模拟轨迹 //timer = new QTimer(this); //connect(timer, SIGNAL(timeout()), this, SLOT(moveMarker())); QMetaObject::invokeMethod(this, "loadMap", Qt::QueuedConnection); } //TODO: //1.根据GPS坐标下载离线地图 //2.根据坐标显示地图 // void frmMapGps::loadMap() { QString fileName = QString("%1/map_web.html").arg(ConfigPath); QString url = "file:///" + fileName; //设置缩放级别 baidu->setMapZoom(15); //设置单击获取经纬度 baidu->setEnableClickPoint(true); //设置默认的中心点坐标 //baidu->setMapCenterPoint("117.13,36.18"); ListGPSPoints.clear(); //设置离线地图 baidu->setMapLocal(true);//true 离线 baidu->setShowNavigationControl(true); baidu->setSaveFile(SaveFile); baidu->setFileName(fileName); QString html = baidu->newMap(); //写入文件【重点】 QFile file; file.setFileName("config/map_web.html"); if(file.open(QIODevice::WriteOnly |QIODevice::Text)){ QTextStream stream(&file); stream.setCodec("utf-8"); stream<getSaveFile()) { web->load(url); } else { QString baseUrl = QString("%1/").arg(ConfigPath); web->load("", html, baseUrl); } } void frmMapGps::setInfo(int angle, int index, int count) { QString info = QString("角度 %1°/第 %2 个/共 %3 个").arg(angle).arg(index).arg(count); // ui->labTip->setText(info); } //---------------------------------------------------------------------------------------- void frmMapGps::initTable() { initTable(ui->tableWidgetSource); } void frmMapGps::initTable(QTableWidget *tableWidget) { //初始化表格控件 QUIHelper::initTableView(tableWidget); tableWidget->setColumnCount(2); tableWidget->setHorizontalHeaderLabels(QStringList() << "序号" << "经纬度"); tableWidget->setColumnWidth(0, 100); tableWidget->setColumnWidth(1, 180); } void frmMapGps::addItem(QTableWidget *tableWidget, int index, const QString &point,const QString ppm) { //编号 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); if(ppm!="") { QTableWidgetItem *itemppm = new QTableWidgetItem; itemppm->setText(ppm); //itemppm->setData(Qt::UserRole, ppm); itemppm->setTextAlignment(Qt::AlignCenter); tableWidget->setItem(index, 2, itemppm); } } void frmMapGps::loadFinished(bool bFinished) { bLoaded = bFinished; if(bLoaded&&!bInited) { initTable(); bInited = true; qDebug() << "frmMapGps Load = " <runJs(js); } void frmMapGps::AddDeviceMark() { if(name!="测量位置") { name = "测量位置"; //第一步: 添加一个标记 //图片文件在可执行文件下的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); moveMarker(); } } void frmMapGps::moveMarker() { double angle = 0; int count = ListGPSPoints.count(); int row = count-1; QString point = ListGPSPoints[row].toString(); //第一个点和最后一个点不用处理 if (row > 1 )//&& row < count - 1) { //上一个点坐标 QString point2 = ListGPSPoints[row - 1].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 <