基本思路
- 百度官方提供了完整的第三方开发方案
- 基于html和JavaScript实现
- 可通过查看提供的API手册和开发指南实现地图功能模块的调用进而二次开发
- 与Qt结合的思路是
- 利用Qt内的QWebEngineView在控件上执行html,实现在线/离线调用百度地图
- 利用Qt的QWebChannel实现Qt与JavaScript的交互
准备工作
在线地图实现
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<style type="text/css">
body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";}
</style>
<script type="text/javascript" src="http://api.map.baidu.com/getscript?v=2.0&ak=你的密钥"></script>
<title>地图展示</title>
</head>
<body>
<div id="allmap"></div>
</body>
</html>
<script src="qwebchannel.js"></script>
<script type="text/javascript">
var map = new BMap.Map("allmap", {enableMapClick:false});
map.centerAndZoom(new BMap.Point(126.639, 45.7527), 19);
var top_left_control = new BMap.ScaleControl({anchor: BMAP_ANCHOR_TOP_LEFT});
var top_left_navigation = new BMap.NavigationControl();
map.addControl(top_left_control);
map.addControl(top_left_navigation);
map.addControl(new BMap.MapTypeControl({
mapTypes:[
BMAP_NORMAL_MAP,
BMAP_HYBRID_MAP
]}));
map.setCurrentCity("哈尔滨");
map.enableScrollWheelZoom(true);
</script>
- 关于密钥:根据指南自行申请百度开发者帐号和密钥(限制调用的计算资源)
- 关于控件:地图上的小工具和功能均有对应API调用实现
- 关于交互:Line17 的
qwebchannel.js 文件可在Qt的安装目录下找到,拷贝到与该html同一级目录下 - 按需添加include,基本上根据类名会自动补全
程序细节
QT += core gui webchannel webengine webenginewidgets network
- ui设计添加QGraphicsView控件(此处命名graphicsView_map),并提升为QWebEngineView
QDir temDir("../baidumap.html");
QString absDir = temDir.absolutePath();
QString filePath = "file:///" + absDir;
ui->graphicsView_map->page()->load(QUrl(filePath));
交互功能
JavaScript -> Qt
- Qt添加WebChannel
- 这里新建了一个类bridge承接Qt中的方法与JavaScript中的方法的映射函数
- bridge.h
#ifndef BRIDGE_H
#define BRIDGE_H
#include <QObject>
class bridge : public QObject
{
Q_OBJECT
public:
bridge(QObject *parent = nullptr);
public slots:
void getCoordinate(QString lon,QString lat);
};
#endif
#include <QDebug>
#include "bridge.h"
#include "mainwindow.h"
bridge::bridge(QObject *parent) : QObject(parent)
{
}
void bridge::getCoordinate(QString lon, QString lat)
{
qDebug()<<lon<<lat;
}
channel = new QWebChannel(this);
qtJsBridge = new bridge();
channel->registerObject("bridge_name",(QObject*)qtJsBridge);
ui->graphicsView_map->page()->setWebChannel(channel);
new QWebChannel(
qt.webChannelTransport,
function (channel)
{
window.bridge_js = channel.objects.bridge_name;
});
- 可以这样理解:通过
window.bridge_js = channel.objects.bridge_name ,使得在JavaScript中bridge_js 这个对象与标签bridge_name 所指向的Qt中的对象qtJsBridge实现对应 - 此时,即可通过
bridge_js 调用qtJsBridge下的方法,注意该方法必须被声明在public slots: 下,猜测这里的交互实现本质上也是利用了Qt的信号槽函数机制
Qt -> JavaScript
- html文件以及其中的Javascript部分本质上属于Javascript脚本
- 因此从Qt调用Javascript的方法其实就是向脚本传递指令
QString jsCmd = QString( "add_point(\"%1\",\"%2.png\",%3,%4)" )
.arg(tempPoint->id)
.arg(tempPoint->planeSet)
.arg(tempPoint->longtitude)
.arg(tempPoint->latitude);
ui->graphicsView_map->page()->runJavaScript(jsCmd);
- 编辑字符串对应JavaScript中的函数,以及传入参数
- 需要注意如果传入参数中有字符串,需要在格式控制中添加转义引号
JavaScript补充
百度地图API
开发指南 https://lbsyun.baidu.com/index.php?title=jspopular3.0
参考案例
QT实现加载百度离线地图 https://blog.csdn.net/John_kai/article/details/80290072 Qt开发北斗定位系统融合百度地图API及Qt程序打包发布 https://www.cnblogs.com/sigma0/p/7220334.html Qt编写地图综合应用7-百度离线地图 https://cloud.tencent.com/developer/article/1612315 QWebEngineView与javaScript交互调用百度离线地图 https://blog.csdn.net/xx970829/article/details/119302379 Qt加载百度离线地图 https://blog.csdn.net/caoshangpa/article/details/51015483 使用百度地图JavaScript API构建离线地图应用(完整教程) https://blog.csdn.net/geekxm/article/details/14227139 QT之调用百度地图离线API https://blog.csdn.net/aitaoge/article/details/82425188 Qt开发北斗定位系统融合百度地图API及Qt程序打包发布 https://www.cnblogs.com/sigma0/p/7220334.html
瓦片下载
百度离线地图瓦片图下载器(谷歌\腾讯\高德) http://www.xiaoguo123.com/p/mapdownload/ 百度离线地图使用 https://www.cnblogs.com/wjw1014/p/11345350.html ?
?
更多内容
|