一、前言说明

在展示地图的时候,有些常规的操作,比如调整地图的缩放级别,切换到卫星图等,希望能够在地图上直接操作实现,于是就有了一堆地图控件,可以根据自己的需求动态的添加和删除,这样就更直接更快捷,而不是通过函数去设置。几乎每个地图厂家都提供了类似的控件,尽管命名可能有些差别,常见的地图控件有地图类型、缩放标尺、缩略图(也叫鹰眼视图)、比例尺、实时路况等。

记得当初第一版的地图组件设计的时候,每个地图控件对应一个enable变量,在生成地图网页代码之前,设置好enable的值,然后根据这个值去决定要不要加入控件到地图中。现在的版本是定义一堆枚举值,每一种控件对应一个枚举值,地图基类中定一个变量mapControl用来控制需要哪些地图控件,枚举值的值依次是1/2/4/8这种,方便于判断进行设置。纵观各种第三方轮子,好多都是这种方式。

二、功能特点

2.1 地图功能

  1. 支持多种地图内核,默认采用百度地图,可选高德地图、天地图、腾讯地图、谷歌地图等。
  2. 同时支持在线地图和离线地图两种模式,离线地图方便在不联网的场景中使用。
  3. 支持各种地图控件的启用,比如地图导航、地图类型、缩略图、比例尺、全景导航、实时路况、绘图工具、结果面板等。
  4. 支持多种地图功能的动态启用禁用,比如地图拖曳、键盘操作、滚轮缩放、双击放大、连续缩放、地图测距等。
  5. 提供众多js函数接口用于交互,参数极其丰富,能够想到的应用场景需求都有。
  6. 统一的信号槽机制,地图中的结果统一信号发送出去,收到后根据type类型区分。
  7. 支持地图交互,比如鼠标按下获取对应位置的经纬度。单击标注点弹出对应点的信息。
  8. 支持添加标注、删除标注、移动标注、清空标注。
  9. 标注点可以指定图标图片和尺寸,支持gif动图,支持指定以图片中心对齐还是底部中心对齐。可以设置旋转角度,带富文本提示信息。
  10. 标注点事件支持单击发信号通知和自己弹框显示信息。
  11. 提供地址转坐标和坐标转地址接口。
  12. 支持各种图形绘制,包括折线图、多边形、矩形、圆形、弧线等。
  13. 可显示悬浮的绘图工具栏,直接在地图上划线、标注点、矩形、圆形等。
  14. 支持各种区域搜索,比如矩形区域、圆形区域,可以按照关键字匹配将搜索结果显示在地图中。
  15. 可动态添加离线的行政区边界点数据。可以搜索行政区划并获取该区域的边界点数据。数据可以保存到文件以便离线使用。
  16. 支持点聚合功能,多个小标注点合并到一个大标注点,防止点密集导致交互不友好。
  17. 可以添加海量点,每个点都可以单击获取对应坐标和信息。
  18. 所有的覆盖物信息比如标注点、矩形、多边形、折线图等,都可以主动获取对应的信息比如坐标点和路径等。
  19. 支持路径规划,支持公交路线、自驾路线、步行路线、骑行路线,不同查询支持不同策略,可选最少时间、最少换乘、不走高架等。
  20. 路径规划结果可以显示在地图中,也可以获取到路径点坐标集合。这个数据可以保存到文件,以便发给机器人或者无人机做导航用来轨迹移动。
  21. 可以设置不同的地图视图比如街道图、卫星图、混合图。
  22. 可以设置不同的样式,比如午夜蓝、青草绿等样式风格。
  23. 可以设置地图的旋转角度和倾斜角度。
  24. 提供经纬度坐标纠偏转换功能,比如传入的GPS坐标需要转换到百度地图坐标或者高德地图坐标。各种坐标系转换全部离线函数,支持地球坐标系WGS-84、火星坐标系GCJ-02、百度坐标系BD-09之间的互相转换,涵盖了各种地图的坐标系。
  25. 提供动态轨迹点移动功能,按照给定的经纬度坐标集合平滑移动。
  26. 同时支持qwidget和qml,支持编译到安卓系统运行。

2.2 其他功能

  1. 提供离线地图下载模块,可以选择不同的地图内核比如百度地图或者谷歌地图,不同的地图类型比如下载街道图还是卫星图,不同的地图层级,多线程极速下载。
  2. 表格行实时显示对应的瓦片下载进度,有下载超时时间,重试次数,每个瓦片下载完成都发送信号通知,参数包括下载用时。
  3. 提供省市轮廓图下载模块,自动下载各个地区的轮廓图,保存到脚本文件或者文本文件。
  4. 支持手动调整不同区域的轮廓边界,调整后可以主动获取调整后的边界点集合。
  5. 提供动态点位示例,手动在地图上选点并添加标注,附带自定义的信息比如速度和时间等。
  6. 提供海量点位示例,批量添加标注点、点聚合、海量点。用于测试环境中支持的最大点位性能。
  7. 提供动态轨迹示例,在地图上鼠标按下选择起点和终点后,查询路线,获取路径轨迹点,模拟轨迹平滑移动。可以筛选数据将过多的路径点筛选到设定的点数。
  8. 提供轨迹回放示例,按照指定的轨迹点列表回放,也可以导入轨迹点数据进行回放。同时支持在街道图、卫星图、混合图中回放轨迹。
  9. 提供省市区域地图示例,采用echart组件,同时支持闪烁点图、迁徙图、区域地图、世界地图、仪表盘等。可以设置标题、提示信息、背景颜色、文字颜色、线条颜色、区域颜色等各种颜色。
  10. 省市区域地图示例,内置世界地图、全国地图、省份地图、地区地图,可以精确到县,所有地图全部离线使用。可设置城市的名称、值、经纬度集合。
  11. 内置通用浏览器组件,同时支持webkit/webengine/miniblink等内核。提供网页控件示例,演示打开网页和本地网页文件。
  12. 支持任意Qt版本、任意系统、任意编译器。

三、相关链接

  1. 体验地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 文件名:bin_map.zip
  2. 国内站点:https://gitee.com/feiyangqingyun
  3. 国际站点:https://github.com/feiyangqingyun

四、效果图

五、相关代码

void MapObjBase::addHead(const QStringList &scripts)
{
//构建网页头部
html << QString("<html>");
html << QString("<head>");
html << QString("<title>%1</title>").arg(title);
html << QString("<meta charset=\"utf-8\">");
html << QString("<meta name=\"viewport\" content=\"initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width\">"); //添加网页样式
this->addCss(); //添加不同地图不同的脚本文件
foreach (QString script, scripts) {
html << script;
} //引入Qt中网页交互用的js文件
#ifdef webengine
html << QString("<script type=\"text/javascript\" src=\"qrc:/qwebchannel.js\"></script>");
#endif
html << QString("</head>");
} void MapObjBase::addCss()
{
//构建页面样式
html << QString("<style type=\"text/css\">");
//地图尺寸
html << QString(" #map{height:%1;width:100%;}").arg((mapControl & MapControl_Panel) ? QString("%1px").arg(mapHeight) : "100%");
//结果面板样式
html << QString(" #panel,#panel table{width:100%;font-size:12px;}");
//隐藏左下角的logo
html << QString(" .anchorBL,.amap-logo,.amap-copyright,.tdt-control-copyright{opacity:0;}");
//全局字体样式
html << QString(" html,body{font-family:微软雅黑;height:100%;width:100%;margin:0px;padding:0px;}"); //webkit浏览器滚动条样式
html << QString(" ::-webkit-scrollbar{width:0.8em;}");
html << QString(" ::-webkit-scrollbar-track{background:rgb(241,241,241);}");
html << QString(" ::-webkit-scrollbar-thumb{background:rgb(188,188,188);}"); html << QString("</style>");
} void MapObjBase::addBody()
{
//构建网页主体部分内容
html << QString("<body>");
html << QString(" <div id='map'></div>"); //添加结果面板/比如路径查询和周边搜索等结果可以有个面板直接展示
panelName = "";
if (mapControl & MapControl_Panel) {
panelName = "panel";
html << QString(" <div id='%1'></div>").arg(panelName);
} html << QString("</body>"); //引入js文件
html << QString("<script type=\"text/javascript\">");
#ifdef mapweb
html << QString(" var socket = new WebSocket('ws://127.0.0.1:6001');");
#endif //通用返回数据函数
html << QString(" function receiveData(type, data) {");
#ifdef mapweb
html << QString(" if (socket) {");
html << QString(" socket.send(type + '_' + data);");
html << QString(" }");
#else
#ifdef webminiblink
html << QString(" objName_receiveData(type, data);");
#else
html << QString(" objName.receiveData(type, data);");
#endif
#endif
html << QString(" }"); //生成QWebChannel通信对象用于js交互
#ifndef webkit
#ifdef webengine
html << QString(" new QWebChannel(qt.webChannelTransport, function(channel){window.objName = channel.objects.objName;})");
#endif
#endif
} void MapObjBase::addFun()
{
//没有启用添加交互函数则不用继续/方便测试简单的网页内容
MapObjFun::mapCore = mapCore;
if (!mapFun) {
return;
} this->addLayer();
this->addEvent();
this->addOther(); this->getPoint();
this->getPoints(); this->getMarkers();
this->getPathPoints();
this->getBounds(); this->getCenterAndZoom();
this->setCenterAndZoom();
this->getRotateAndTilt();
this->setRotateAndTilt(); this->setEnable();
this->setMapStyle();
this->setMapType();
this->setAutoView(); //在线地图才有地址转换等功能
if (!mapLocal) {
this->addConvertor();
this->addGeocoder();
this->addSearch();
this->addRoute();
this->searchRoute();
} this->drawRoute();
this->addDrawingTool();
this->addDistanceTool(); this->clearData();
this->clearOverlay();
this->deleteOverlay();
this->editOverlay();
this->getOverlayInfo();
this->getOverlayProperty(); this->setClick();
this->addMarker();
this->setMarker();
this->deleteMarker(); this->initPolyline();
this->setPolyline();
this->deletePolyline(); this->addMove();
this->addLine();
this->moveEvent();
this->findMove();
this->doMove(); this->addPolyline();
this->addPolygon();
this->addRectangle();
this->addCircle();
this->addCurveLine(); this->searchBoundary();
this->getBoundary();
this->addBoundary(); this->addMarkerCluster();
this->addPointCollection();
} void MapObjBase::addEnd()
{
html << QString("</script>");
html << QString("</html>");
}

Qt/C++加载不同的地图控件/地图类型/缩放标尺/缩略图/比例尺/实时路况/全景视图等的更多相关文章

  1. 实现虚拟模式的动态数据加载Windows窗体DataGridView控件 .net 4.5 (一)

    实现虚拟模式的即时数据加载Windows窗体DataGridView控件 .net 4.5 原文地址 :http://msdn.microsoft.com/en-us/library/ms171624 ...

  2. 在ASP.NET中动态加载内容(用户控件和模板)

    在ASP.NET中动态加载内容(用户控件和模板) 要点: 1. 使用Page.ParseControl 2. 使用base.LoadControl 第一部分:加载模板 下 面是一个模板“<tab ...

  3. MVC4加载zTree树小控件

    前言: 第一次学习使用MVC框架,找了个练手项目,加载zTree树小控件.下面我就一步步说明我这次练手的经历以记录.如果有什么错误,希望各位大神帮忙指正,谢谢. 第一步: 利用VS2010新建一个MV ...

  4. 上拉加载下拉刷新控件WaterRefreshLoadMoreView

    上拉加载下拉刷新控件WaterRefreshLoadMoreView 效果: 源码: // // SRSlimeView // @author SR // Modified by JunHan on ...

  5. WPF中动态加载XAML中的控件

    原文:WPF中动态加载XAML中的控件 using System; using System.Collections.Generic; using System.Linq; using System. ...

  6. C#窗体加载和控件加载不同步导致控件闪烁

    窗体加载和控件加载不同步导致的控件闪烁现象:// 代码块加在父窗体中的任意位置,解决窗体加载和控件加载不同步导致的控件闪烁问题        protected override CreatePara ...

  7. 使用XAML在WPF项目中承载ArcGIS Engine地图控件开发

    原文 http://blog.csdn.net/flexmapserver/article/details/5868882 用Windows Form进行ArcGIS Engine二次开发时常见的形式 ...

  8. 使用openlayers 3 在线加载天地图及GeoServer发布的地图

    使用openlayers3来加载天地图卫星图和标注图层,GeoServer发布地图,一并用openlayers测试加载出来,顺便实现了7种地图控件.下面直接贴代码: <!DOCTYPE html ...

  9. Qt tableview加载数据

    Qt tableview加载数据 //把数据加载到tableView void ImportData::loadDataInTableView() { ) { if (pageNum>stude ...

  10. Corelocation及地图控件学习笔记

    Corelocation基本使用 在地图章节的学习中,首先要学的便是用户位置定位,因此我们首先要掌握Corelocation的使用.(在IOS8以前可以系统会直接请求授权,现在需要我们自己调用方式通知 ...

随机推荐

  1. C#查漏补缺----对象内存结构与布局

    环境变量 .Net Core 8.0 Windows 11 64位 内存布局 引用类型 在.NET中,数据会按照类型分为不同的对象,对于引用类型的实例,由一个对象标头(Object Header)和方 ...

  2. Java开发23种设计模式(转)

    [转载]https://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html 设计模式(Design Patterns) --可复用面 ...

  3. linux下时间时区详解

    首先我们要明白,"时间"和"时区"是两个东西. 时间是指从某个时间点开始到另一个时间点经过的"长度",是"纵向"距离,一 ...

  4. 4.6 Linux解压.gz格式的文件(gunzip命令)

    gunzip 是一个使用广泛的解压缩命令,它用于解压被 gzip 压缩过的文件(扩展名为 .gz). 对于解压被 gzip 压缩过的文件,还可以使用 gzip 自己,即 gzip -d 压缩包. gu ...

  5. 本地代理web端口

    先配置 使用ssh 通过ProxyCommand:利用跳板机让不在同一局域网的机器ssh直连 代理访问 ssh -qTfnND 127.0.0.1:$代理端口 代理机器主机名

  6. PHP数据库连接教程 - QSZ

    1准备工作 首先,确保你的环境中已安装: PHP 7.0+ MySQL/MariaDB Web服务器(Apache/Nginx) 2数据库连接代码 // config.php setAttribute ...

  7. 从零开始的Python世界生活——内置模块(Math)

    从零开始的Python世界生活--内置模块(Math) Python的math模块提供了丰富的数学函数和常数,支持基本的数学运算.三角函数.对数.指数等,适用于科学计算和工程应用. 数学常量: 注意m ...

  8. swoole的安装

    因为换了一台工作电脑 需要重新安装各种环境,这里简单记录一下swoole的安装步骤. 首先去下载它的git仓库: $ git clone https://gitee.com/swoole/swoole ...

  9. (Python基础教程之四)Python中的变量的使用

    Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...

  10. An Entry Example of Log4j

    The log4j can be configured both programmatically and externally using special configuration files. ...