Qt编写地图综合应用55-海量点位标注
一、前言
海量点位标注的出现,是为了解决普通设备点超过几百个性能极速降低的问题,普通的marker标注由于采用的是对象的形式存在于地图中,数量越多,占用内存特别大,超过1000个点性能极其糟糕,哪怕是用点聚合,拖动地图的时候更是一卡卡,简称卡成屎,加载的时候也是慢成一坨屎,所以迫切需要一个其他的形式来支持成千上万的海量点,最好的方式就是绘制图形,精简掉很多属性,比如自定义图标、旋转角度、单击动画跳动等一堆特性,这些其实大部分时候是不需要的,在海量点的场景下,完全可以牺牲这些特性,然后采用最简单的绘制图形的形式来绘制海量点,提供最基础的一个功能就是识别单击了哪个点就行。
海量点位标注核心就是采用地图内置的js对象类PointCollection,传入点位的经纬度坐标集合,同时还可以统一设置点的颜色、点的大小、点的形状,通过addEventListener监听单击事件判断单击了哪个点,最后通过添加覆盖物的形式将一个海量点覆盖物添加到地图中。
尺寸参数:
- 1 = BMAP_POINT_SIZE_TINY 2px*2px
- 2 = BMAP_POINT_SIZE_SMALLER 4px*4px
- 3 = BMAP_POINT_SIZE_SMALL 8px*8px
- 4 = BMAP_POINT_SIZE_NORMAL 10px*10px 默认值
- 5 = BMAP_POINT_SIZE_BIG 16px*16px
- 6 = BMAP_POINT_SIZE_BIGGER 20px*20px
- 7 = BMAP_POINT_SIZE_HUGE 30px*30px
形状参数:
- 1 = BMAP_POINT_SHAPE_CIRCLE 圆形 默认值
- 2 = BMAP_POINT_SHAPE_STAR 星形
- 3 = BMAP_POINT_SHAPE_SQUARE 方形
- 4 = BMAP_POINT_SHAPE_RHOMBUS 菱形
- 5 = BMAP_POINT_SHAPE_WATERDROP水滴
二、功能特点
- 定时器排队下载省市轮廓图点坐标集合存储到JS文件。
- 支持一个行政区域多个不规则区域下载。
- 自动计算行政区域的下载轮廓数量。
- 可精确选择省份、市区、县城,也可直接输入行政区域的名称。
- 可以设置下载间隔、随时开始下载和停止下载。
- 提供编辑边界功能,可以直接在地图上编辑好不规则区域的点集合,然后获取边界点集合数据,这个可以用来自己绘制区域拿到数据,比如某个乡镇甚至某个小区的行政区域数据,很牛逼。
三、体验地址
- 体验地址: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 frmMapMarkers::addMarker()
{
//先清空原有的所有覆盖物包括标注点
runJs("deleteOverlay('')");
//取出定位点经纬度大值
QString point = ui->txtPointLeftBottom->text();
QStringList list = point.split(",");
double lng = list.first().toDouble();
double lat = list.last().toDouble();
//经纬度小数点值最大值
float dotLng = 0.015;
float dotLat = 0.011;
//限定最大数量
int index = ui->cboxType->currentIndex();
int count = ui->cboxCount->currentText().toInt();
int maxCount = 300;
if (index == 1) {
maxCount = 1000;
} else if (index == 2) {
maxCount = 50000;
}
if (count > maxCount) {
QString info = QString("由于官方该方法性能有限, 建议数量不要超过 %1 !").arg(maxCount);
QUIHelper::showMessageBoxError(info);
return;
}
//不同类型不同处理,随机模拟经纬度,可以自行调整范围值
if (index == 0) {
//添加标注点
for (int i = 0; i < count; ++i) {
QStringList points = QUIHelper::getRandPoint(1, lng, lat, dotLng, dotLat);
QString js = QString("addMarker('', '', '', '', 30, '%1')").arg(points.first());
runJs(js);
}
} else if (index == 1) {
//添加点聚合
QStringList points = QUIHelper::getRandPoint(count, lng, lat, dotLng, dotLat);
QString js = QString("addMarkerClusterer('%1')").arg(points.join("|"));
runJs(js);
} else if (index == 2) {
//添加海量点
QStringList points = QUIHelper::getRandPoint(count, lng, lat, dotLng, dotLat);
QString js = QString("addPointCollection('%1', '#A279C5')").arg(points.join("|"));
runJs(js);
}
}
void frmMapMarkers::on_btnDo_clicked()
{
//自动获取当前区域边界
runJs("getBounds()");
}
Qt编写地图综合应用55-海量点位标注的更多相关文章
- Qt编写项目作品大全(自定义控件+输入法+大屏电子看板+视频监控+楼宇对讲+气体安全等)
一.自定义控件大全 (一).控件介绍 超过160个精美控件,涵盖了各种仪表盘.进度条.进度球.指南针.曲线图.标尺.温度计.导航条.导航栏,flatui.高亮按钮.滑动选择器.农历等.远超qwt集成的 ...
- Qt编写安防视频监控系统(界面很漂亮)
一.前言 视频监控系统在整个安防领域,已经做到了烂大街的程序,全国起码几百家公司做过类似的系统,当然这一方面的需求量也是非常旺盛的,各种定制化的需求越来越多,尤其是这几年借着人脸识别的东风,发展更加迅 ...
- Qt编写的开源帖子集合(懒人专用)
回顾自己学习Qt以来九年了,在这九年多时间里面,从本论坛学习不到不少的东西,今天特意整了一下自己开源过的资源的帖子,整理一起方便大家直接跳转下载,不统计不知道,一统计吓一跳,不知不觉开源了这么多代码, ...
- Qt编写安防视频监控系统18-云台控制
一.前言 云台控制是视频监控系统中必备的一个功能,对球机进行上下左右的移动,还有焦距的控制,其实核心就是控制XYZ三个坐标轴,为了开发这个模块,特意研究了各种云台控制的方法和开源库比如soap,有些厂 ...
- Qt编写自定义控件二动画按钮
现在的web发展越来越快,很多流行的布局样式,都是从web开始的,写惯了Qt widgets 项目,很多时候想改进一下现有的人机交互,尤其是在现有的按钮上加一些动画的效果,例如鼠标移上去变大,移开还原 ...
- Qt编写自定义控件11-设备防区按钮控件
前言 在很多项目应用中,需要根据数据动态生成对象显示在地图上,比如地图标注,同时还需要可拖动对象到指定位置显示,能有多种状态指示,安防领域一般用来表示防区或者设备,可以直接显示防区号,有多种状态颜色指 ...
- Qt编写自定义控件10-云台仪表盘
前言 做过安防视频监控的同学都清楚,在视频监控系统软件上都可以看到一个云台控制区域,可以对球机进行下下左右等八个方位的运动控制,还可以进行复位,一般都是美工作图好,然后贴图的形式加入到软件中,好处是程 ...
- Qt编写自定义控件5-柱状温度计
前言 柱状温度计控件,可能是很多人练手控件之一,基本上都是垂直方向展示,底部一个水银柱,中间刻度尺,刻度尺可以在左侧右侧或者两侧都有,自适应分辨率改动,有时候为了美观效果,可能还会整个定时器来实现动画 ...
- Qt编写自定义控件4-旋转仪表盘
前言 旋转仪表盘,一般用在需要触摸调节设置值的场景中,其实Qt本身就提供了QDial控件具有类似的功能,本控件最大的难点不在于绘制刻度和指针等,而在于自动计算当前用户按下处的坐标转换为当前值,这个功能 ...
- Qt编写数据可视化大屏界面电子看板系统
一.前言 目前大屏大数据可视化UI这块非常火,趁热也用Qt来实现一个,Qt这个一站式超大型GUI超市,没有什么他做不了的,大屏电子看板当然也不在话下,有了QSS和QPainter这两个无敌的工具组合, ...
随机推荐
- 03 Transformer 中的多头注意力(Multi-Head Attention)Pytorch代码实现
3:20 来个赞 24:43 弹幕,是否懂了 QKV 相乘(QKV 同源),QK 相乘得到相似度A,AV 相乘得到注意力值 Z 第一步实现一个自注意力机制 自注意力计算 def self_attent ...
- 1.flask 源码解析:简介
目录 一.flask 源码解析:简介 1.1 flask 简介 1.2 两个依赖 1.2.1 werkzeug 1.2.2 Jinja2 1.3 如何读代码 Flask 源码分析完整教程目录:http ...
- k8s的ReplicationController
ReplicationController 存活探针 Kubemetes有以下三种探测容器的机制: HTTPGET探针对容器的IP地址(你指定的端口和路径)执行HTTPGET请求,如果探测器收到响应, ...
- MP4 转 TXT 项目与 M3U8 下载脚本
项目背景 在当今信息社会,视频学习已成为一种重要的知识获取方式.然而,许多用户在观看视频的过程中,效率往往低于预期.为了提升学习效率,我们决定开发一个将 MP4 视频转换为 TXT 文稿的项目.此外, ...
- 在 OpenFunction 中运行 Serverless 应用
除了构建和运行 Serverless 函数之外,OpenFuntion 还支持构建和运行 Serverless 应用.因此,OpenFunction 用户可以不用局限在各语言的 functions-f ...
- centos rar文件解压不出
楼主的项目开发是在centos系统上面的,但是经常小伙伴发的压缩文件都是rar格式的. 在centos系统自带的解压的软件并不能解压rar格式的文件: 双击文件时,能弹出解压窗口,可是发现可以解压的更 ...
- Taylor series Explicit Euler Implicit Euler
1 Taylor series \[\begin{gathered}\sum_{n=0}^{\infty}\frac{f^{(n)}\left(a\right)}{n!}\left(x-a\right ...
- SQL 清除数据库中所有表的数据
进行数据库的操作,有时候我们需要清除数据库中所有的数据,如果你不嫌麻烦,可以一次一次的执行truncate操作,但是如果遇到有无数个表的情况,这种操作无疑是很耗时的 我曾经百度别人的代码,看都没看就直 ...
- vue3 + typescript + element-plus 大文件上传
大文件上传 思路:前端获取 file 文件对象使用 slice 方法截取切片,然后异步上传切片,再合并 技术栈 TypeScript Vue3 Element-plus Nodejs 客户端实现 创建 ...
- 3.15 Linux复制文件和目录(cp命令)
cp 命令,主要用来复制文件和目录,同时借助某些选项,还可以实现复制整个目录,以及比对两文件的新旧而予以升级等功能. cp 命令的基本格式如下: [root@localhost ~]# cp [选项] ...