首页| 论坛| 消息
主题: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()
{
//设置右侧固定宽度
ui->widgetRight->setFixedWidth(AppData::RightWidth - 50);
mapObj = NULL;
//实例化浏览器控件并加入到布局
webView = new WebView(this);
webView->setLayout(ui->gridLayout);
connect(webView, SIGNAL(receiveDataFromJs(QString, QVariant)), this, SLOT(receiveDataFromJs(QString, QVariant)));
}
void frmMapDraw::initConfig()
{
MapHelper::loadMapCore(ui->cboxMapCore, AppConfig::MapDrawCore);
connect(ui->cboxMapCore, SIGNAL(currentIndexChanged(int)), this, SLOT(saveConfig()));
connect(ui->cboxMapCore, SIGNAL(currentIndexChanged(int)), this, SLOT(on_btnLoadMap_clicked()));
ui->cboxMapLocal->setCurrentIndex(AppConfig::MapDrawLocal ? 1 : 0);
connect(ui->cboxMapLocal, SIGNAL(currentIndexChanged(int)), this, SLOT(saveConfig()));
connect(ui->cboxMapLocal, SIGNAL(currentIndexChanged(int)), this, SLOT(on_btnLoadMap_clicked()));
ui->cboxMapType->setCurrentIndex(AppConfig::MapDrawType);
connect(ui->cboxMapType, SIGNAL(currentIndexChanged(int)), this, SLOT(saveConfig()));
ui->cboxOverlay->addItem("标注", "marker");
ui->cboxOverlay->addItem("折线", "polyline");
ui->cboxOverlay->addItem("多边形", "polygon");
ui->cboxOverlay->addItem("矩形", "rectangle");
ui->cboxOverlay->addItem("圆形", "circle");
ui->cboxOverlay->setCurrentIndex(AppConfig::MapDrawOverlay);
connect(ui->cboxOverlay, SIGNAL(currentIndexChanged(int)), this, SLOT(saveConfig()));
}
void frmMapDraw::saveConfig()
{
AppConfig::MapDrawCore = ui->cboxMapCore->itemData(ui->cboxMapCore->currentIndex()).toInt();
AppConfig::MapDrawLocal = (ui->cboxMapLocal->currentIndex() == 1);
AppConfig::MapDrawType = ui->cboxMapType->currentIndex();
AppConfig::MapDrawOverlay = ui->cboxOverlay->currentIndex();
AppConfig::writeConfig();
}
void frmMapDraw::runJs(const QString &js)
{
mapObj->runJs(js);
}
void frmMapDraw::receiveDataFromJs(const QString &type, const QVariant &data)
{
QString result = data.toString();
if (type == "marker" || type == &

浏览大图
下一页 (1/7)
回帖(0):

全部回帖(0)»
最新回帖
收藏本帖
发新帖