Qt编写地图综合应用41-在线轮廓图
一、前言
轮廓图也叫行政区划,这里的轮廓图是指百度地图的区域轮廓图,不是之前文章中提到的echart专用的轮廓图,百度地图的轮廓图就是一个不规则的多边形区域,只不过这个区域的坐标点一般是特别多的,比如某个县市的区域轮廓,可以拿到一系列的坐标点,主要是用来突出标注某个区域,比如这个区域可以突出颜色显示,线条的颜色和粗细及透明度都可以设置。
在线的轮廓图可以直接调用地图内置的 Boundary.get 方法获取,只需要指定区域的名称比如上海市,在回调的函数中就可以拿到对应区域的所有坐标点集合,使用非常方便。这个函数是地图内置的,该算法在离线的地图类中没有找到,具体执行规则可能在服务器上存储着,而且也是一直更新的,比如全国的行政区域也不是一成不变的,也是会变化的。
轮廓图要注意的一点就是,未必每个地区的轮廓图就是一个区域,很多地方还有飞地,或者多个比较大的区域,例如上海除了上海大本营之外,还有个崇明岛大部分,所以在绘制的时候,一定要注意是多个坐标点区域集合。
二、功能特点
- 同时支持在线地图和离线地图两种模式。
- 同时支持webkit内核、webengine内核、miniblink内核、IE内核。
- 支持设置多个标注点,信息包括名称、地址、经纬度。
- 可设置地图是否可单击、拖动、鼠标滚轮缩放。
- 可设置协议版本、秘钥、主题样式、中心坐标、中心城市、地理编码位置等。
- 可设置地图缩放比例和级别,缩略图、比例尺、路况信息等控件的可见。
- 支持地图交互,比如鼠标按下获取对应位置的经纬度。
- 支持查询路线,可设置起点位置、终点位置、路线模式、路线方式、路线方案(最少时间、最少换乘、最少步行、不乘地铁、最短距离、避开高速)。
- 可显示点线面工具,可直接在地图上划线、点、矩形、圆形等。
- 可设置行政区划,指定某个城市区域绘制图层,在线地图自动输出行政区划边界点集合到js文件给离线地图使用。
- 可静态或者动态添加多个覆盖物。支持点、折线、多边形、矩形、圆形、弧线、点聚合等。
- 提供函数接口处理经纬度解析成地址和地址解析成经纬度坐标。
- 提供的demo直接可以单独选点执行对应的处理比如路线查询。
- 可以拿到路线查询到的点坐标信息集合,比如用于机器人坐标导航等。
- 封装了丰富的函数比如删除指定点和所有点,删除指定覆盖物和所有覆盖物等。
- 标注点弹框信息可以自定义内容,标准html格式。
- 标注点单击事件可选 0-不处理 1-自己弹框 2-发送信号。
- 标注点可设置动画效果 0-不处理 1-跳动 2-坠落
- 标注点可设置本地图片文件等。
- 函数接口友好和统一,使用简单方便,就一个类。
- 支持js动态交互添加点、删除点、清空点、重置点,不需要刷新页面。
- 支持任意Qt版本、任意系统、任意编译器。
三、体验地址
- 体验地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 文件名:bin_map.zip
- 国内站点:https://gitee.com/feiyangqingyun
- 国际站点:https://github.com/feiyangqingyun
- 个人主页:https://blog.csdn.net/feiyangqingyun
- 知乎主页:https://www.zhihu.com/people/feiyangqingyun/
四、效果图

五、相关代码
void MapBaiDu::addBoundary(QStringList &list)
{
//定义数组存储可拖动的边界点
//在这里定义,在getBoundary函数调用的
list << QString(" var polygons = [];");
//动态添加行政区划
list << QString(" function addBoundary(cityname, callfun, edit, color, weight, opacity) {");
//清除地图覆盖物
list << QString(" map.clearOverlays();");
//离线地图通过文件直接加载,上面已经引入了对应 cityname 的js文件
//通过读取js数组数据直接绘制不规则形状
if (mapLocal) {
QString property = getOverlayProperty();
list << QString(" var pointArray = [];");
list << QString(" var count = boundarys.length;");
list << QString(" for (var i = 0; i < count; ++i) {");
list << QString(" var ply = new %1.Polygon(boundarys[i].points, %2);").arg(mapFlag).arg(property);
list << QString(" map.addOverlay(ply);");
list << QString(" pointArray = pointArray.concat(ply.getPath());");
list << QString(" }");
//调整视野自适应行政区划区域
list << QString(" map.setViewport(pointArray);");
list << QString(" }");
return;
}
//清除之前存储的边界点数组数据
list << QString(" polygons = [];");
//实例化行政区划对象
list << QString(" var bdary = new %1.Boundary();").arg(mapFlag);
//调用内置的方法获取城市的点集合
list << QString(" bdary.get(cityname, function(rs) {");
//行政区域的点有多少个
list << QString(" var datas = rs.boundaries;");
list << QString(" var count = datas.length;");
list << QString(" if (count <= 0) {");
list << QString(" return;");
list << QString(" }");
list << QString(" var pointsAll = [];");
list << QString(" var pointArray = [];");
list << QString(" for (var i = 0; i < count; ++i) {");
//建立多边形覆盖物
list << QString(" var property = getProperty(color, weight, opacity);");
//建立多边形覆盖物
list << QString(" var ply = new %1.Polygon(datas[i], property);").arg(mapFlag);
//取出点集合
list << QString(" var pts = ply.getPath();");
list << QString(" var points = [];");
list << QString(" for (var j = 0; j < pts.length; ++j) {");
list << QString(" var point = pts[j].lng + ',' + pts[j].lat;");
list << QString(" points.push(point);");
list << QString(" }");
list << QString(" pointsAll.push(points.join(';'));");
//范围可编辑,开启以后可以拖动边界然后可以重新输出边界点集合
list << QString(" if (edit) {");
list << QString(" ply.enableEditing();");
list << QString(" }");
//添加到多边形数组,用来后边获取调整后的边界数组
list << QString(" polygons.push(ply);");
//添加覆盖物
list << QString(" map.addOverlay(ply);");
list << QString(" pointArray = pointArray.concat(pts);");
list << QString(" }");
//调整视野自适应行政区划区域
list << QString(" map.setViewport(pointArray);");
//弹出+调试输出+回调输出 行政区划的边界坐标点集合
//list << QString(" alert(count);");
//list << QString(" alert(datas);");
//list << QString(" console.log(datas);");
list << QString(" if (callfun) {");
list << QString(" receiveData('boundary', pointsAll.join('|'));");
list << QString(" }");
list << QString(" });");
list << QString(" }");
}
Qt编写地图综合应用41-在线轮廓图的更多相关文章
- Qt编写自定义控件11-设备防区按钮控件
前言 在很多项目应用中,需要根据数据动态生成对象显示在地图上,比如地图标注,同时还需要可拖动对象到指定位置显示,能有多种状态指示,安防领域一般用来表示防区或者设备,可以直接显示防区号,有多种状态颜色指 ...
- Qt编写的开源帖子集合(懒人专用)
回顾自己学习Qt以来九年了,在这九年多时间里面,从本论坛学习不到不少的东西,今天特意整了一下自己开源过的资源的帖子,整理一起方便大家直接跳转下载,不统计不知道,一统计吓一跳,不知不觉开源了这么多代码, ...
- Qt编写项目作品大全(自定义控件+输入法+大屏电子看板+视频监控+楼宇对讲+气体安全等)
一.自定义控件大全 (一).控件介绍 超过160个精美控件,涵盖了各种仪表盘.进度条.进度球.指南针.曲线图.标尺.温度计.导航条.导航栏,flatui.高亮按钮.滑动选择器.农历等.远超qwt集成的 ...
- Qt编写安防视频监控系统(界面很漂亮)
一.前言 视频监控系统在整个安防领域,已经做到了烂大街的程序,全国起码几百家公司做过类似的系统,当然这一方面的需求量也是非常旺盛的,各种定制化的需求越来越多,尤其是这几年借着人脸识别的东风,发展更加迅 ...
- Qt编写数据可视化大屏界面电子看板系统
一.前言 目前大屏大数据可视化UI这块非常火,趁热也用Qt来实现一个,Qt这个一站式超大型GUI超市,没有什么他做不了的,大屏电子看板当然也不在话下,有了QSS和QPainter这两个无敌的工具组合, ...
- Qt编写自定义控件二动画按钮
现在的web发展越来越快,很多流行的布局样式,都是从web开始的,写惯了Qt widgets 项目,很多时候想改进一下现有的人机交互,尤其是在现有的按钮上加一些动画的效果,例如鼠标移上去变大,移开还原 ...
- Qt编写安防视频监控系统18-云台控制
一.前言 云台控制是视频监控系统中必备的一个功能,对球机进行上下左右的移动,还有焦距的控制,其实核心就是控制XYZ三个坐标轴,为了开发这个模块,特意研究了各种云台控制的方法和开源库比如soap,有些厂 ...
- Qt编写数据可视化大屏界面电子看板13-基础版
一.前言 之前发布的Qt编写的可视化大屏电子看板系统,很多开发者比较感兴趣,也收到了很多反馈意见,纵观市面上的大屏系统,基本上都是B/S结构的web版本,需要在后台进行自定义配置模块,绑定数据源等,其 ...
- Qt编写气体安全管理系统10-数据导出
一.前言 数据导出一般指导出到excel表格,可能有部分用户还需要导出到pdf,因为pdf基本上不可编辑,防止用户重新编辑导出的数据,excel可能绝大部分用过电脑的人都知道,广为流行,主要就是微软的 ...
- Qt编写自定义控件61-通用移动
一.前言 通用移动类,目标就是为了实现放入任意的控件以后,支持鼠标拖动,在容器中或者父类中拖动,这个应用场景非常多,比如在地图上放置的设备,需要用户自行按下拖动到指定的合适的位置,然后保存设备的位置坐 ...
随机推荐
- MidJourney新手攻略
目录 MidJourney简介 MidJourney的使用 1. 加入Discord 2. 选择一个频道 3. 使用/imagine来输入提示 4. 等待一分钟左右,会输出四张图 5. 查看结果 Re ...
- KubeSphere 宣布开源 Thanos 的企业级发行版 Whizard
日前,青云科技宣布开源 Thanos 的企业级发行版 Whizard,为企业带来真正高可用.可扩展.可存储与查询海量监控数据.易运维.安全的 Prometheus 长期存储方案. Prometheus ...
- KubeSphere v4 安装指南
日前,KubeSphere v4 发布,相较于之前的版本,新版本在架构上有了颠覆性的变化.为了让社区的各位小伙伴能够丝滑的从旧版本过渡到新版本,我们特别推出本篇安装指南文章,以供参考. 关于 Kube ...
- LeetCode题目练习记录 _数组和链表03 _20211011
LeetCode题目练习记录 _数组和链表03 _20211011 206. 反转链表 难度简单2015收藏分享切换为英文接收动态反馈 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表 ...
- 使用switch语句的注意事项
目录 case后需要手动break switch内的变量定义 变量没有定义在语句块内 变量定义在语句块内 表述多情况时不能用逗号 case后需要手动break switch(i){ case 1: 语 ...
- 移动端元素定位辅助神器-WEditor
WEditor可以做什么? 编辑器能够提供辅助编写脚本,查看组件信息,调试代码等功能. 移动端除了用 Appium 来 做元素定位外,还可以通过 WEditor 来完成. 前置环境依赖按照 以 win ...
- Android WebView 加载 html页面 实现 不同分辨率 不同 dpi 缩放自适应处理 解决方案
两种情况一起使用 实现 不同分辨率 不同 dpi 缩放自适应处理 //webview 需要配置 mWebView.getWebSetting().setUseWideViewPort(true);// ...
- JAXP(Java API for XML Parsing)
JAXP(Java API for XML Parsing) 过去几年中,XML分折已经被标准为两个不同的处理模型:SAX(Simple API for XML)以及DOM(Document O ...
- python常用模块汇总
os模块 os.remove() 删除文件 os.unlink() 删除文件 os.rename() 重命名文件 os.listdir() 列出指定目录下所有文件 os.chdir() 改变当前工作目 ...
- nginx之日志处理
日常对于NGINX日志文件的处理 1.将访问日志中爬虫相关请求导出 cat access.log | grep Baiduspider > spider.log