热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

QT实现加载百度离线地图

在Qt中加载百度地图需要用到网络浏览器,在此采用webEngine模块,然后用webchannel进行qt与HTMLJavaScript的交互。需求描述

在Qt中加载百度地图需要用到网络浏览器,在此采用webEngine模块,然后用webchannel进行qt与HTML/Javascript的交互。 
需求描述:软件加载百度地图,用鼠标在地图上选点,并进行标号,每次加1,最后连成一条路径,为后期工作做准备。


百度地图API应用


  • 采用百度离线地图API2.1版本,网上均可以下载到,然后放到项目debug文件夹下
  • 瓦片地图下载,可以采用全能地图下载器,下载好后放到指定文件夹
  • 复制其中一个demo文件,根据自己需要的功能进行添加

地图展示

var map = new BMap.Map("map_demo",mapOptions); // 设置街道图为底图
var point = new BMap.Point(120.393751, 36.065743); // 创建点坐标
map.centerAndZoom(point,13); // 初始化地图,设置中心点坐标和地图级别

鼠标点击标记加序号

addEventListener("click",function(e))对点击事件进行监听,参数e会返回当前点的地理位置,然后在此处用Marker添加标记,在实现每次标记加1时,因为标记本身是一个图片,因此可以考虑对标记加标签(定义一个全局的i,每点击一次加1),然后调整下位置(为了美观),背景设置为透明,基本就可以实现所要的效果。标签的颜色和背景可以使用Label类下的setStyle方法设置:

label.setStyle({color:"white",backgroundColor:"0",border:"0";fontsize:"13px"
});

生成轨迹

创建一个全局空数组,在上一步中监听点击事件,参数e返回位置点,将此点push到数组中,在生成轨迹时将数组序列直接传入Polyline ,然后map.addOverlay(polyline)即可加载标签。

具体的类和方法参见百度地图Javascript API 2.0和示例Demo


Qt与html交互

地图全屏显示

用wenEngine全屏显示地图时的代码:

//mainwidow中的函数
view=new QWebEngineView(this);
view->load(url);
view->show();

添加:

void MainWindow::resizeEvent(QResizeEvent *)
{view->resize(this->size());
}

地图在一个 widget中显示

在UI设计界面,我的qt5.9版本是找不到wenEngineView 组件的,解决方法:在ui设计页面,拖入widgets控件,然后提升为QWebengineView,如图所示: 
这里写图片描述 
在mainwindow函数中进行webengine初始化:

QWebEnginePage *page=new QWebEnginePage(this);QWebChannel *channel=new QWebChannel(this);page->load(url);page->setWebChannel(channel);ui->webEngine->setPage(page);

新版的Qt摒弃了webkit,采用webengine,在交互上简单了很多,例如生成路径按钮的槽函数:

void MainWindow::on_generatetrack_clicked()
{QString cmd="generate_track()";ui->webengine->page()->runJavascript(cmd);
}

其中generate_track()为html文件中的函数,只需要一条语句即可实现交互。 
最终效果如图: 
这里写图片描述


后期加的功能1

功能:实现小车沿路径运动 
有两种方案:


  • 采用百度地图开源库LuShu实现
  • 采用定时器,定时将小车作为标注显示在路径点上。

第二种方案适合于路径点很密集,很多的情况,才能看出效果。由于这个项目是采用鼠标选几个位置,因此适合采用第一种方案。

实现部分:


  • 添加lushu的js文件


  • 根据上边保存的路径点数组,实例化一个全局lushu对象,放在generate_track函数里

lushu=new BMapLib.LuShu(map,track_point,{icon:icon1,//图标可以自己添加,也可以默认为百度的红色标注小气球speed:3000,autoView:false,enableRotation:true});

  • 最后在需要开始运动的函数里添加下面函数就可以

lushu.start();

后期加的功能2

功能:对已经选择的路径点通过输入经纬度进行修改(生成路径前后均可修改) 
首先在Qt中添加以下代码(前提是在界面中设置好文本框和修改按钮):

void MainWindow::on_modify_clicked()
{QString number=ui->orderNumber->text();QString lng=ui->lngEdit->text();QString lat=ui->latEdit->text();QString cmd=QString("modifyMarker(\"%1\",\"%2\",\"%3\")").arg(number).arg(lng).arg(lat); //modifyMaker是html文件中的函数ui->webengine->page()->runJavascript(cmd);
}

在html文件中添加:

function modifyMarker(number,lng,lat){allMarker=map.getOverlays(); //保存所有标注var newpoint=new BMap.Point(lng,lat);allMarker[number-1].setPosition(newpoint);track_point[number-1]=newpoint;if(allMarker[allMarker.length-1].toString()!="[object Marker]"){ //看array中最后一个元素是不是polylinemap.removeOverlay(polyline); //来判断生成路径之前generate_track(); //还是生成路径之后修改路径点}
}

由于没有系统学习过Javascript,其中if中的判断语句参考了下面图片中的方法,意思就是判断最后一个覆盖物是不是Marker对象。 
这里写图片描述
getOverlays()后不知道为什么多一个隐藏的标注,所以在选路径点时先清理一次所有的标注,即在选路径点的函数中首先添加:

map.clearOverlays();

推荐阅读
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 本文介绍了在Vue项目中如何结合Element UI解决连续上传多张图片及图片编辑的问题。作者强调了在编码前要明确需求和所需要的结果,并详细描述了自己的代码实现过程。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Perl的测试框架Test::Base,它是一个数据驱动的测试框架,可以自动进行单元测试,省去手工编写测试程序的麻烦。与Test::More完全兼容,使用方法简单。以plural函数为例,展示了Test::Base的使用方法。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 本文详细介绍了git常用命令及其操作方法,包括查看、添加、提交、删除、找回等操作,以及如何重置修改文件、抛弃工作区修改、将工作文件提交到本地暂存区、从版本库中删除文件等。同时还介绍了如何从暂存区恢复到工作文件、恢复最近一次提交过的状态,以及如何合并多个操作等。 ... [详细]
  • WPF开发心率检测大数据曲线图的高性能实现方法
    本文介绍了在WPF开发中实现心率检测大数据曲线图的高性能方法。作者尝试过使用Canvas和第三方开源库,但性能和功能都不理想。最终作者选择使用DrawingVisual对象,并结合局部显示的方式实现了自己想要的效果。文章详细介绍了实现思路和具体代码,对于不熟悉DrawingVisual的读者可以去微软官网了解更多细节。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
author-avatar
Peaches小窝
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有