继上次用Qt实现了显示地图和MQTT通信之后(X-MagicBox-820的luatOS之路连载系列5),说是要研究下地图的开放接口,也看了标记点和线的方法(地图上自定义标记点和轨迹线的实现)。这次就来调试剩下的部分:GPS数据在地图上的呈现。

下图就是测试的结果

这个轨迹的测试还是让家里小闺女帮助完成的

结合之前的基础,实现图上的轨迹标记主要两个技术点。一是Qt的WebEngineView模块实现C++层面与HTML层面的通信,二是JS数据的解析。

(1)增加派生类WebClass,用来在JS中访问。

class WebClass : public QObject
{
Q_OBJECT
Q_PROPERTY(QString content MEMBER m_content NOTIFY contentChanged) //该属性可由页面访问 public:
WebClass(){};
QString getContent(){return m_content;}
signals:
void contentChanged(QString nc); private:
QString m_content;
};

(2)WebChannel的实例化,注册JS的访问对象。

 webch = new QWebChannel(this);
webobj = new WebClass();
webch->registerObject("webobj", webobj);
ui->widget->page()->setWebChannel(webch);

(3)在MQTT消息槽内更新注册类的变量内容。

connect(m_client, &QMqttClient::messageReceived, this, [this](const QByteArray &message, const QMqttTopicName &topic) {
const QString content = message;
//qDebug() << content;
webobj->setProperty("content", message);
});

二、JavaScript代码的实现:

(1)获取Qt中的对象的值

//这里的webChannel是全局的变量,可以在其它位置访问
var webChannel = new QWebChannel(qt.webChannelTransport,
function(channel){
var webobj = channel.objects.webobj; webobj.contentChanged.connect(updateattribute);
});

(2)解析更新的变量,就是上面updateattribute的函数体实现,同时地图的标记过程也在该函数内实现。

var updateattribute=function(text)
{
//截取所需数据
var str = [];
str = text.split(',');
pointx = str[0].slice(1);
pointy = str[1].slice(1);
//根据第一个点确定位置,地图的初始显示
if(isPoint){
isPoint = false;
//初始位置
var pinit = new BMapGL.Point(pointx, pointy);
map.centerAndZoom(pinit, 15);
}else{ }
//gps点集
var data = [];
data[0] = pointx;
data[1] = pointy;
point.push(data); var rPoint = new BMapGL.Point(point[point.length-1][0],point[point.length-1][1]);
bPoints.push(rPoint);
//更新标记点
marker = new BMapGL.Marker(rPoint); // 创建点
map.addOverlay(marker); //更新连线
if(point.length > 1){
var polyline = new BMapGL.Polyline([
new BMapGL.Point(point[point.length-2][0],point[point.length-2][1]),
new BMapGL.Point(point[point.length-1][0],point[point.length-1][1]),
], {strokeColor:"red", strokeWeight:5, strokeOpacity:0.5}); //创建折线
map.addOverlay(polyline);
} setZoom(bPoints); }

(3)为了提升观察体验,添加自动缩放显示的处理。

 // 根据点的数组自动调整缩放级别
function setZoom(bPoints) {
var view = map.getViewport(eval(bPoints));
var mapZoom = view.zoom;
var centerPoint = view.center;
map.centerAndZoom(centerPoint, mapZoom);
}
map.addControl(new BMapGL.MapTypeControl());
map.enableScrollWheelZoom(true);

三、完成以上代码的调试,就可以实际测试了。这里不方便上传视频,搜索微信视频号 懂一点技术的老王 浏览完成视频。

抽空完善下推到Github上,有兴趣的朋友们可以看看。欢迎关注和交流
 

X-MagicBox-820的luatOS之路连载系列6的更多相关文章

  1. X-MagicBox-820的luatOS之路连载系列4

    上次说到定位成功后,显示的数据准确性问题.专门查询了下我所在地区的经纬度信息. MagicBox的显示数据是这样的: 网络上查到的经纬度数据是这样的: 可以看出定位精度还可以,毕竟我这个查询的数据没有 ...

  2. X-MagicBox-820的luatOS之路连载系列2

    这块MagicBox小巧但外设丰富,盖板上的小液晶屏竟有240*240的分辨率.点亮后若是用最小字体,真有看瞎老王的不瞎之眼之势. 这种屏在某宝也是比较多的,大概就是长这样子: 我们这个820的盖板上 ...

  3. [js高手之路] es6系列教程 - 对象功能扩展详解

    第一:字面量对象的方法,支持缩写形式 //es6之前,这么写 var User = { name : 'ghostwu', showName : function(){ return this.nam ...

  4. [js高手之路]设计模式系列课程-发布者,订阅者重构购物车

    发布者订阅者模式,是一种很常见的模式,比如: 一.买卖房子 生活中的买房,卖房,中介就构成了一个发布订阅者模式,买房的人,一般需要的是房源,价格,使用面积等信息,他充当了订阅者的角色 中介拿到卖主的房 ...

  5. [js高手之路] es6系列教程 - 迭代器与生成器详解

    什么是迭代器? 迭代器是一种特殊对象,这种对象具有以下特点: 1,所有对象都有一个next方法 2,每次调用next方法,都会返回一个对象,该对象包含两个属性,一个是value, 表示下一个将要返回的 ...

  6. [js高手之路] 设计模式系列课程 - jQuery的extend插件机制

    这里在之前的文章[js高手之路] 设计模式系列课程 - jQuery的链式调用与灵活的构造函数基础上增加一个extend浅拷贝,可以为对象方便的扩展属性和方法, jquery的插件扩展机制,大致就是这 ...

  7. [js高手之路] es6系列教程 - 迭代器,生成器,for...of,entries,values,keys等详解

    接着上文[js高手之路] es6系列教程 - 迭代器与生成器详解继续. 在es6中引入了一个新的循环结构for ....of, 主要是用来循环可迭代的对象,那么什么是可迭代的对象呢? 可迭代的对象一般 ...

  8. [js高手之路] vue系列教程 - 事件专题(4)

    本文主要讲解事件冒泡,事件绑定的简写,事件默认行为,按键码等一系列与事件相关的知识. 一.事件绑定的简写,@事件类型.  之前我的[js高手之路] vue系列教程 - vue的事件绑定与方法(2) 用 ...

  9. [js高手之路]设计模式系列课程-组合模式+寄生组合继承实战新闻列表

    所谓组合模式,就是把一堆结构分解出来,组成在一起,现实中很多这样的例子,如: 1.肯德基套餐就是一种组合模式, 比如鸡腿堡套餐,一般是是由一个鸡腿堡,一包薯条,一杯可乐等组成的 2.组装的台式机同理, ...

随机推荐

  1. Machine learning (6-Logistic Regression)

    1.Classification However, 2.Hypothesis Representation Python code: import numpy as np def sigmoid(z) ...

  2. Vagrant 搭建开发环境实践

    介绍 Development Environments Made Easy -官网标题 vagrant是一个命令行的虚拟机管理程序.用于简化搭建开发环境. vagrant使用ruby语言基于Chef ...

  3. P2120 [ZJOI2007]仓库建设

    P2120 [ZJOI2007]仓库建设 怎么说呢?算是很水的题了吧... 只要不要一开始就把dp想错就行... #include<bits/stdc++.h> #define ll lo ...

  4. Tarjan算法 求 有向图的强连通分量

    百度百科 https://baike.baidu.com/item/tarjan%E7%AE%97%E6%B3%95/10687825?fr=aladdin 参考博文 http://blog.csdn ...

  5. 开源的分布式事务框架 springcloud Alibaba Seata 的搭建使用 一次把坑踩完。。。

    seata的使用 1. Seata 概述 Seata 是 Simple Extensible Autonomous Transaction Architecture 的简写,由 feascar 改名而 ...

  6. Vue 之 Mixins (混入)的使用

    是什么 混入 (mixins): 是一种分发 Vue 组件中可复用功能的非常灵活的方式.混入对象可以包含任意组件选项.当组件使用混入对象时,所有混入对象的选项将被合并到组件本身,也就是说父组件调用混入 ...

  7. Cannot load module file xxx.iml的两种解决方法

    一. 一种是点击左上角File,然后点击Invalidate Caches / Restart...,弹出对话框再点击Invalidate and Restart等待工程重新加载,问题就解决了. 二. ...

  8. java更开源-安全可靠国产系统背景下的应有.NET Core的一席之地

    "安可"背景下的中国软件开发 在中美当前背景下的安全可靠国产系统(简称安可),安可产业要实现技术自主可控,需要在四个层面逐步实现:基础硬件设施,如芯片.服务器.存储.交换机.路由器 ...

  9. CentOS 8.4安装Docker

    前言: Docker 是一个用于开发.传送和运行应用程序的开放平台.Docker 使您能够将应用程序与基础设施分开,以便您可以快速交付软件.使用 Docker,您可以像管理应用程序一样管理基础设施.通 ...

  10. [loj539]旅游路线

    考虑枚举加油的位置,当确定某次在第$i$个位置加油后,且下一次到$j$加油,那么$i$到$j$必然会选择不超过$c_{i}$条边且最长的路径,记作$d_{i,j}$ 如果能求出$d_{i,j}$,再设 ...