首页| 论坛| 消息

标题:Qt/C++地图高级绘图/指定唯一标识添加删除修改/动态显示和隐藏/支持天地图高德地图百度地图
作者:liudianwu
日期:2024-11-15 08:55
内容:

## 一、前言说明
已经有了最基础的接口用来添加覆盖物,而且还有通过进入覆盖物模式动态添加覆盖物的功能,为什么还要来个高级绘图?因为又有新的需求,给钱就搞,一点底线都没有。无论哪个地图厂家,提供的接口都是没有唯一标识参数的,也就类似于学号,这就是需要自己主动定一个属性用来存储唯一标识,这样方便后面删除和修改。比如之前的删除覆盖物,只能指定一种类型的覆盖物,指定圆形则删除所有圆形覆盖物,这样还是完全不够的,很多时候需要指定唯一标识来删除和修改。
经过大量的模拟测试发现,对覆盖物的删除和清空clearoverlay等,高德地图和谷歌地图会在合适的时机释放内存,而其他地图几乎不会去主动释放,所以如果遇到需要很多覆盖物的场景,建议生成一次后,后面只是去改变该覆盖物的属性比如坐标位置和路径,而不是清空后再次去生成。这样就可以极力避免内存泄漏,这可能也是web的缺陷,没有手动释放机制,说是内部有垃圾自动回收,但是内部很可能判断失败,导致一直无法释放。所以需要重新调整添加和删除修改覆盖物的函数接口,增加唯一标识参数,需要搞个动态的雷达扫描,只需要不断更新覆盖物经纬度坐标即可。

## 二、相关代码
```cpp
#include "frmmapdraw.h"
#include "ui_frmmapdraw.h"
#include "qthelper.h"
#include "maphelper.h"
#include "webview.h"
#include "frmmapdrawradar.h"
#include "frmmapdrawairline.h"
frmMapDraw::frmMapDraw(QWidget *parent) : QWidget(parent), ui(new Ui::frmMapDraw)
{
ui->setupUi(this);
this->initForm();
this->initConfig();
}
frmMapDraw::~frmMapDraw()
{
delete ui;
}
void frmMapDraw::showEvent(QShowEvent *)
{
//只需要加载一次/避免重复初始化
static bool isLoad = false;
if (!isLoad) {
isLoad = true;
QMetaObject::invokeMethod(this, "on_btnLoadMap_clicked", Qt::QueuedConnection);
}
}
void frmMapDraw::initForm()
{
/ ..

回复 发表
主题 版块