江苏工信部网站备案,免费制作app的软件下载,山东外贸网站推广,漳浦县建设局网站一、前言说明
在地图应用中#xff0c;有很多时候是需要断网环境中离线使用的#xff0c;一般会采用两种做法#xff0c;一种是只下载好离线瓦片地图#xff0c;然后根据不同的缩放和经纬度坐标绘制瓦片。这种方式优点是任何地图都支持#xff0c;只需要拿到瓦片即可有很多时候是需要断网环境中离线使用的一般会采用两种做法一种是只下载好离线瓦片地图然后根据不同的缩放和经纬度坐标绘制瓦片。这种方式优点是任何地图都支持只需要拿到瓦片即可缺点是其他的接口都需要自己处理比如覆盖物的绘制工作量巨大尽管Qt的qml部分提供了location模块用于这个处理但是功能还不是很完善而且不支持widget对于只会widget的我来说歇菜。现阶段采用方式二也就是浏览器控件加载地图的js交互来实现优点就不说了超过优点缺点就一个必须依赖浏览器控件资源占用大。
百度地图的离线js开发包网上到处都是大部分都是2.0版本这个基本上功能是齐全的直接用就行至于天地图网上几乎没有本人废了九牛二虎之力才搞定一点点从官网趴下来的所有支持的离线功能全部存在非常完美关键是掌握了这个方法思路就很好办无论后期版本升级到多少都可以轻轻松松实现最新版本的离线地图js开发包。离线搞定后手机上运行离线地图就非常容易了使用qml的浏览器控件加载离线网页即可。在手机上只有qml的浏览器组件能使用widget的不支持因为qml的浏览器组件使用本地浏览器内核而不是webkit或者webengine手机端是什么底层浏览器就是用何种浏览器。
二、相关代码
#include frmmapqml.h
#include ui_frmmapqml.h
#include qthelper.h
#include maphelper.h
#include mapwebsocket.h//安卓上如果提示 net::ERR_CLEARTEXT_NOT_PERMITTED 需要在AndroidManifest.xml文件的Application节点添加 android:usesCleartextTraffictrue
frmMapQml::frmMapQml(QWidget *parent) : QWidget(parent), ui(new Ui::frmMapQml)
{ui-setupUi(this);this-initForm();this-initConfig();
}frmMapQml::~frmMapQml()
{delete ui;
}void frmMapQml::showEvent(QShowEvent *)
{//首次显示的时候自动加载/下面这种写法表示异步记载static bool isLoad false;if (!isLoad) {isLoad true;QMetaObject::invokeMethod(this, loadMap, Qt::QueuedConnection);}
}void frmMapQml::initForm()
{mapObj NULL;flag movePerson;//拿到qml对象qmlObj ui-quickWidget-rootObject();//实例化websocket通信用于网页交互connect(MapWebSocket::Instance(), SIGNAL(receiveDataFromJs(QString, QString)), this, SLOT(receiveDataFromJs(QString, QString)));MapWebSocket::Instance()-listen();
}void frmMapQml::initConfig()
{MapHelper::loadMapCore(ui-cboxMapCore, AppConfig::MapCore);connect(ui-cboxMapCore, SIGNAL(currentIndexChanged(int)), this, SLOT(saveConfig()));connect(ui-cboxMapCore, SIGNAL(currentIndexChanged(int)), this, SLOT(loadMap()));ui-cboxMoveSpeed-setCurrentIndex(ui-cboxMoveSpeed-findText(QString::number(AppConfig::MoveSpeed)));connect(ui-cboxMoveSpeed, SIGNAL(currentIndexChanged(int)), this, SLOT(saveConfig()));connect(ui-cboxMoveSpeed, SIGNAL(currentIndexChanged(int)), this, SLOT(loadData()));ui-txtStartAddr-setText(AppConfig::StartAddr);connect(ui-txtStartAddr, SIGNAL(textChanged(QString)), this, SLOT(saveConfig()));ui-txtEndAddr-setText(AppConfig::EndAddr);connect(ui-txtEndAddr, SIGNAL(textChanged(QString)), this, SLOT(saveConfig()));
}void frmMapQml::saveConfig()
{AppConfig::MapCore ui-cboxMapCore-itemData(ui-cboxMapCore-currentIndex()).toInt();AppConfig::MoveSpeed ui-cboxMoveSpeed-currentText().toInt();AppConfig::StartAddr ui-txtStartAddr-text().trimmed();AppConfig::EndAddr ui-txtEndAddr-text().trimmed();AppConfig::writeConfig();
}void frmMapQml::loadMap()
{//根据不同地图内核实例化地图类MapCore mapCore (MapCore)ui-cboxMapCore-itemData(ui-cboxMapCore-currentIndex()).toInt();MapHelper::initMapObj(this, mapObj, mapCore);mapObj-setMapType(0);mapObj-setMapLocal(false);QString html mapObj-load();//将生成的地图网页文件加载到qml中QString file file:/// mapObj-getFileName();//安卓上放在固定的目录
#ifdef Q_OS_ANDROIDfile QString(file:///android_asset/%1/map.html).arg(MapHelper::getMapPath(mapCOre));
#endifQMetaObject::invokeMethod((QObject *)qmlObj, load, Q_ARG(QVariant, file));//QMetaObject::invokeMethod((QObject *)qmlObj, loadHtml, Q_ARG(QVariant, html));ui-txtResult-clear();
}void frmMapQml::loadData()
{if (datas.count() 0) {return;}//生成路径轨迹QString points datas.join(;);this-runJs(QString(clearOverlay()));this-runJs(QString(drawRoute(%1, #01caf4, 8, 1.0, #ffffff)).arg(points));//生成移动对象points datas.join(|);int speed ui-cboxMoveSpeed-currentText().toInt();QString image ../mapimage/move_fly.png;if (mapObj-getMapCore() MapCore_GaoDe mapObj-getVersionKey().startsWith(2.)) {image ../mapimage/move_fly2.png;}this-runJs(QString(addMove(%1, %2, %3, true, false, %4, 48, 48)).arg(flag).arg(points).arg(speed).arg(image));
}void frmMapQml::runJs(const QString js)
{QMetaObject::invokeMethod((QObject *)qmlObj, runJs, Q_ARG(QVariant, js));
}void frmMapQml::receiveDataFromJs(const QString type, const QString result)
{if (type click) {QString info QString(触发鼠标单击\n当前经纬度值: %1).arg(result);QtHelper::showMessageBoxInfo(info);} else if (type rightclick) {QString info QString(触发鼠标右键\n当前经纬度值: %1).arg(result);QtHelper::showMessageBoxInfo(info);} else if (type dblclick) {QString info QString(触发鼠标双击\n当前经纬度值: %1).arg(result);QtHelper::showMessageBoxInfo(info);} else if (type geocoderresult) {QStringList list result.split(|);QString flag list.first();if (flag startAddr) {startPoint list.last();QString endAddr ui-txtEndAddr-text().trimmed();this-runJs(QString(getPointByAddr(endAddr, %1)).arg(endAddr));} else if (flag endAddr) {endPoint list.last();}//两个地址都有了再开启路径规划if (!startPoint.isEmpty() !endPoint.isEmpty()) {this-runJs(QString(searchRoute(2, %1, %2, %3)).arg(0).arg(startPoint).arg(endPoint));}} else if (type routeresult) {QStringList list result.split(|);QString result MapHelper::getRouteResult(list.first().toInt(), list.last().toInt());ui-txtResult-setText(result);} else if (type routepoints) {datas.clear();QStringList list result.split(|);foreach (QString data, list) {datas data.split(;);}//有些地图内核需要延迟一点载入数据MapCore mapCore mapObj-getMapCore();int interval (mapCore MapCore_BaiDuGL ? 500 : 0);QTimer::singleShot(interval, this, SLOT(loadData()));} else if (type movestep) {MapCore mapCore mapObj-getMapCore();if (mapCore ! MapCore_BaiDuGL mapCore ! MapCore_GaoDe) {QString point result.split(|).last();this-runJs(QString(setCenter(%1)).arg(point));}} else if (type moveend) {ui-widgetPara-setEnabled(true);on_btnStart_clicked();//再次执行则表示循环QMetaObject::invokeMethod(this, on_btnStart_clicked, Qt::QueuedConnection);}
}void frmMapQml::on_btnSelect_clicked()
{//执行地址转经纬度操作/路径规划一般只支持经纬度参数startPoint endPoint ;QString startAddr ui-txtStartAddr-text().trimmed();this-runJs(QString(getPointByAddr(startAddr, %1)).arg(startAddr));
}void frmMapQml::on_btnStart_clicked()
{if (datas.count() 0) {QtHelper::showMessageBoxError(请先单击查询路线获取路线的坐标点集合!);return;}if (ui-btnStart-text() 开始导航) {this-runJs(QString(addLine(%1, %2, #ff0000, 6)).arg(flag).arg(datas.first()));//this-runJs(QString(setTilt(%1)).arg(60));this-runJs(QString(moveStart(%1)).arg(flag));ui-btnStart-setText(停止导航);ui-widgetPara-setEnabled(false);} else {this-runJs(QString(moveStop(%1)).arg(flag));ui-btnStart-setText(开始导航);ui-widgetPara-setEnabled(true);}
}三、相关链接
体验地址https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码o05q 文件名bin_map.zip国内站点https://gitee.com/feiyangqingyun国际站点https://github.com/feiyangqingyun
四、效果图 五、功能特点
5.1 地图功能
支持多种地图内核默认采用百度地图可选高德地图、天地图、腾讯地图、谷歌地图等。同时支持在线地图和离线地图两种模式离线地图方便在不联网的场景中使用。支持各种地图控件的启用比如地图导航、地图类型、缩略图、比例尺、全景导航、实时路况、绘图工具、结果面板等。支持多种地图功能的动态启用禁用比如地图拖曳、键盘操作、滚轮缩放、双击放大、连续缩放、地图测距等。提供众多js函数接口用于交互参数极其丰富能够想到的应用场景需求都有。统一的信号槽机制地图中的结果统一信号发送出去收到后根据type类型区分。支持地图交互比如鼠标按下获取对应位置的经纬度。单击标注点弹出对应点的信息。支持添加标注、删除标注、移动标注、清空标注。标注点可以指定图标图片和尺寸支持gif动图支持指定以图片中心对齐还是底部中心对齐。可以设置旋转角度带富文本提示信息。标注点事件支持单击发信号通知和自己弹框显示信息。提供地址转坐标和坐标转地址接口。支持各种图形绘制包括折线图、多边形、矩形、圆形、弧线等。可显示悬浮的绘图工具栏直接在地图上划线、标注点、矩形、圆形等。支持各种区域搜索比如矩形区域、圆形区域可以按照关键字匹配将搜索结果显示在地图中。可动态添加离线的行政区边界点数据。可以搜索行政区划并获取该区域的边界点数据。数据可以保存到文件以便离线使用。支持点聚合功能多个小标注点合并到一个大标注点防止点密集导致交互不友好。可以添加海量点每个点都可以单击获取对应坐标和信息。所有的覆盖物信息比如标注点、矩形、多边形、折线图等都可以主动获取对应的信息比如坐标点和路径等。支持路径规划支持公交路线、自驾路线、步行路线、骑行路线不同查询支持不同策略可选最少时间、最少换乘、不走高架等。路径规划结果可以显示在地图中也可以获取到路径点坐标集合。这个数据可以保存到文件以便发给机器人或者无人机做导航用来轨迹移动。可以设置不同的地图视图比如街道图、卫星图、混合图。可以设置不同的样式比如午夜蓝、青草绿等样式风格。可以设置地图的旋转角度和倾斜角度。提供经纬度坐标纠偏转换功能比如传入的GPS坐标需要转换到百度地图坐标或者高德地图坐标。各种坐标系转换全部离线函数支持地球坐标系WGS-84、火星坐标系GCJ-02、百度坐标系BD-09之间的互相转换涵盖了各种地图的坐标系。提供动态轨迹点移动功能按照给定的经纬度坐标集合平滑移动。同时支持qwidget和qml支持编译到安卓系统运行。
5.2 其他功能
提供离线地图下载模块可以选择不同的地图内核比如百度地图或者谷歌地图不同的地图类型比如下载街道图还是卫星图不同的地图层级多线程极速下载。表格行实时显示对应的瓦片下载进度有下载超时时间重试次数每个瓦片下载完成都发送信号通知参数包括下载用时。提供省市轮廓图下载模块自动下载各个地区的轮廓图保存到脚本文件或者文本文件。支持手动调整不同区域的轮廓边界调整后可以主动获取调整后的边界点集合。提供动态点位示例手动在地图上选点并添加标注附带自定义的信息比如速度和时间等。提供海量点位示例批量添加标注点、点聚合、海量点。用于测试环境中支持的最大点位性能。提供动态轨迹示例在地图上鼠标按下选择起点和终点后查询路线获取路径轨迹点模拟轨迹平滑移动。可以筛选数据将过多的路径点筛选到设定的点数。提供轨迹回放示例按照指定的轨迹点列表回放也可以导入轨迹点数据进行回放。同时支持在街道图、卫星图、混合图中回放轨迹。提供省市区域地图示例采用echart组件同时支持闪烁点图、迁徙图、区域地图、世界地图、仪表盘等。可以设置标题、提示信息、背景颜色、文字颜色、线条颜色、区域颜色等各种颜色。省市区域地图示例内置世界地图、全国地图、省份地图、地区地图可以精确到县所有地图全部离线使用。可设置城市的名称、值、经纬度集合。内置通用浏览器组件同时支持webkit/webengine/miniblink等内核。提供网页控件示例演示打开网页和本地网页文件。支持任意Qt版本、任意系统、任意编译器。 文章转载自: http://www.morning.xdjwh.cn.gov.cn.xdjwh.cn http://www.morning.mfsjn.cn.gov.cn.mfsjn.cn http://www.morning.mdxwz.cn.gov.cn.mdxwz.cn http://www.morning.gjqnn.cn.gov.cn.gjqnn.cn http://www.morning.ypfw.cn.gov.cn.ypfw.cn http://www.morning.krhkn.cn.gov.cn.krhkn.cn http://www.morning.lynmt.cn.gov.cn.lynmt.cn http://www.morning.hlfgm.cn.gov.cn.hlfgm.cn http://www.morning.ggjlm.cn.gov.cn.ggjlm.cn http://www.morning.ctsjq.cn.gov.cn.ctsjq.cn http://www.morning.blqgc.cn.gov.cn.blqgc.cn http://www.morning.ckdgj.cn.gov.cn.ckdgj.cn http://www.morning.dfojgo.cn.gov.cn.dfojgo.cn http://www.morning.vvbsxm.cn.gov.cn.vvbsxm.cn http://www.morning.kycxb.cn.gov.cn.kycxb.cn http://www.morning.rwjtf.cn.gov.cn.rwjtf.cn http://www.morning.nrzbq.cn.gov.cn.nrzbq.cn http://www.morning.sqmlw.cn.gov.cn.sqmlw.cn http://www.morning.stph.cn.gov.cn.stph.cn http://www.morning.hmqjj.cn.gov.cn.hmqjj.cn http://www.morning.fksdd.cn.gov.cn.fksdd.cn http://www.morning.yjprj.cn.gov.cn.yjprj.cn http://www.morning.jtqxs.cn.gov.cn.jtqxs.cn http://www.morning.nxhjg.cn.gov.cn.nxhjg.cn http://www.morning.ltfnl.cn.gov.cn.ltfnl.cn http://www.morning.tdfyj.cn.gov.cn.tdfyj.cn http://www.morning.gbybx.cn.gov.cn.gbybx.cn http://www.morning.pyxtn.cn.gov.cn.pyxtn.cn http://www.morning.llqch.cn.gov.cn.llqch.cn http://www.morning.whothehellami.com.gov.cn.whothehellami.com http://www.morning.pmjw.cn.gov.cn.pmjw.cn http://www.morning.srky.cn.gov.cn.srky.cn http://www.morning.sbdqy.cn.gov.cn.sbdqy.cn http://www.morning.rfrxt.cn.gov.cn.rfrxt.cn http://www.morning.mmclj.cn.gov.cn.mmclj.cn http://www.morning.skrww.cn.gov.cn.skrww.cn http://www.morning.lsnnc.cn.gov.cn.lsnnc.cn http://www.morning.aa1585.com.gov.cn.aa1585.com http://www.morning.qkbwd.cn.gov.cn.qkbwd.cn http://www.morning.fhjnh.cn.gov.cn.fhjnh.cn http://www.morning.qdrrh.cn.gov.cn.qdrrh.cn http://www.morning.kynf.cn.gov.cn.kynf.cn http://www.morning.gqmhq.cn.gov.cn.gqmhq.cn http://www.morning.xysdy.cn.gov.cn.xysdy.cn http://www.morning.sqmbb.cn.gov.cn.sqmbb.cn http://www.morning.ndcjq.cn.gov.cn.ndcjq.cn http://www.morning.qwwcf.cn.gov.cn.qwwcf.cn http://www.morning.nysjb.cn.gov.cn.nysjb.cn http://www.morning.ydhmt.cn.gov.cn.ydhmt.cn http://www.morning.lpmdy.cn.gov.cn.lpmdy.cn http://www.morning.zgpgl.cn.gov.cn.zgpgl.cn http://www.morning.zqnmp.cn.gov.cn.zqnmp.cn http://www.morning.wddmr.cn.gov.cn.wddmr.cn http://www.morning.hjbrd.cn.gov.cn.hjbrd.cn http://www.morning.wdnkp.cn.gov.cn.wdnkp.cn http://www.morning.hybmz.cn.gov.cn.hybmz.cn http://www.morning.prls.cn.gov.cn.prls.cn http://www.morning.qxxj.cn.gov.cn.qxxj.cn http://www.morning.lcwhn.cn.gov.cn.lcwhn.cn http://www.morning.jpjpb.cn.gov.cn.jpjpb.cn http://www.morning.hxfrd.cn.gov.cn.hxfrd.cn http://www.morning.ksggl.cn.gov.cn.ksggl.cn http://www.morning.nyqm.cn.gov.cn.nyqm.cn http://www.morning.qrpx.cn.gov.cn.qrpx.cn http://www.morning.rqkzh.cn.gov.cn.rqkzh.cn http://www.morning.wmmtl.cn.gov.cn.wmmtl.cn http://www.morning.kngx.cn.gov.cn.kngx.cn http://www.morning.ndrzq.cn.gov.cn.ndrzq.cn http://www.morning.zpqlf.cn.gov.cn.zpqlf.cn http://www.morning.nstml.cn.gov.cn.nstml.cn http://www.morning.yjmlg.cn.gov.cn.yjmlg.cn http://www.morning.mqxzh.cn.gov.cn.mqxzh.cn http://www.morning.kgqww.cn.gov.cn.kgqww.cn http://www.morning.ryrgx.cn.gov.cn.ryrgx.cn http://www.morning.pnntx.cn.gov.cn.pnntx.cn http://www.morning.rrhfy.cn.gov.cn.rrhfy.cn http://www.morning.qsy38.cn.gov.cn.qsy38.cn http://www.morning.tqbyw.cn.gov.cn.tqbyw.cn http://www.morning.slnz.cn.gov.cn.slnz.cn http://www.morning.nlwrg.cn.gov.cn.nlwrg.cn