Qt/C++离线地图的加载和交互/可以离线使用/百度和天地图离线/支持手机上运行
一、前言说明
在地图应用中,有很多时候是需要断网环境中离线使用的,一般会采用两种做法,一种是只下载好离线瓦片地图,然后根据不同的缩放和经纬度坐标绘制瓦片。这种方式优点是任何地图都支持,只需要拿到瓦片即可,缺点是其他的接口都需要自己处理,比如覆盖物的绘制,工作量巨大,尽管Qt的qml部分提供了location模块用于这个处理,但是功能还不是很完善,而且不支持widget,对于只会widget的我来说,歇菜。现阶段采用方式二,也就是浏览器控件加载地图的js交互来实现,优点就不说了,超过优点,缺点就一个,必须依赖浏览器控件,资源占用大。
百度地图的离线js开发包,网上到处都是,大部分都是2.0版本,这个基本上功能是齐全的,直接用就行,至于天地图,网上几乎没有,本人废了九牛二虎之力才搞定,一点点从官网趴下来的,所有支持的离线功能全部存在,非常完美,关键是掌握了这个方法思路就很好办,无论后期版本升级到多少,都可以轻轻松松实现最新版本的离线地图js开发包。离线搞定后,手机上运行离线地图就非常容易了,使用qml的浏览器控件加载离线网页即可。在手机上只有qml的浏览器组件能使用,widget的不支持,因为qml的浏览器组件使用本地浏览器内核,而不是webkit或者webengine,手机端是什么底层浏览器就是用何种浏览器。
二、相关代码
#include "frmmapqml.h"
#include "ui_frmmapqml.h"
#include "qthelper.h"
#include "maphelper.h"
#include "mapwebsocket.h"//安卓上如果提示 net::ERR_CLEARTEXT_NOT_PERMITTED 需要在AndroidManifest.xml文件的Application节点添加 android:usesCleartextTraffic="true"
frmMapQml::frmMapQml(QWidget *parent) : QWidget(parent), ui(new Ui::frmMapQml)
{ui->setupUi(this);this->initForm();this->initConfig();
}frmMapQml::~frmMapQml()
{delete ui;
}void frmMapQml::showEvent(QShowEvent *)
{//首次显示的时候自动加载/下面这种写法表示异步记载static bool isLoad = false;if (!isLoad) {isLoad = true;QMetaObject::invokeMethod(this, "loadMap", Qt::QueuedConnection);}
}void frmMapQml::initForm()
{mapObj = NULL;flag = "movePerson";//拿到qml对象qmlObj = ui->quickWidget->rootObject();//实例化websocket通信用于网页交互connect(MapWebSocket::Instance(), SIGNAL(receiveDataFromJs(QString, QString)), this, SLOT(receiveDataFromJs(QString, QString)));MapWebSocket::Instance()->listen();
}void frmMapQml::initConfig()
{MapHelper::loadMapCore(ui->cboxMapCore, AppConfig::MapCore);connect(ui->cboxMapCore, SIGNAL(currentIndexChanged(int)), this, SLOT(saveConfig()));connect(ui->cboxMapCore, SIGNAL(currentIndexChanged(int)), this, SLOT(loadMap()));ui->cboxMoveSpeed->setCurrentIndex(ui->cboxMoveSpeed->findText(QString::number(AppConfig::MoveSpeed)));connect(ui->cboxMoveSpeed, SIGNAL(currentIndexChanged(int)), this, SLOT(saveConfig()));connect(ui->cboxMoveSpeed, SIGNAL(currentIndexChanged(int)), this, SLOT(loadData()));ui->txtStartAddr->setText(AppConfig::StartAddr);connect(ui->txtStartAddr, SIGNAL(textChanged(QString)), this, SLOT(saveConfig()));ui->txtEndAddr->setText(AppConfig::EndAddr);connect(ui->txtEndAddr, SIGNAL(textChanged(QString)), this, SLOT(saveConfig()));
}void frmMapQml::saveConfig()
{AppConfig::MapCore = ui->cboxMapCore->itemData(ui->cboxMapCore->currentIndex()).toInt();AppConfig::MoveSpeed = ui->cboxMoveSpeed->currentText().toInt();AppConfig::StartAddr = ui->txtStartAddr->text().trimmed();AppConfig::EndAddr = ui->txtEndAddr->text().trimmed();AppConfig::writeConfig();
}void frmMapQml::loadMap()
{//根据不同地图内核实例化地图类MapCore mapCore = (MapCore)ui->cboxMapCore->itemData(ui->cboxMapCore->currentIndex()).toInt();MapHelper::initMapObj(this, &mapObj, mapCore);mapObj->setMapType(0);mapObj->setMapLocal(false);QString html = mapObj->load();//将生成的地图网页文件加载到qml中QString file = "file:///" + mapObj->getFileName();//安卓上放在固定的目录
#ifdef Q_OS_ANDROIDfile = QString("file:///android_asset/%1/map.html").arg(MapHelper::getMapPath(mapCOre));
#endifQMetaObject::invokeMethod((QObject *)qmlObj, "load", Q_ARG(QVariant, file));//QMetaObject::invokeMethod((QObject *)qmlObj, "loadHtml", Q_ARG(QVariant, html));ui->txtResult->clear();
}void frmMapQml::loadData()
{if (datas.count() <= 0) {return;}//生成路径轨迹QString points = datas.join(";");this->runJs(QString("clearOverlay()"));this->runJs(QString("drawRoute('%1', '#01caf4', 8, 1.0, '#ffffff')").arg(points));//生成移动对象points = datas.join("|");int speed = ui->cboxMoveSpeed->currentText().toInt();QString image = "../mapimage/move_fly.png";if (mapObj->getMapCore() == MapCore_GaoDe && mapObj->getVersionKey().startsWith("2.")) {image = "../mapimage/move_fly2.png";}this->runJs(QString("addMove('%1', '%2', %3, true, false, '%4', 48, 48)").arg(flag).arg(points).arg(speed).arg(image));
}void frmMapQml::runJs(const QString &js)
{QMetaObject::invokeMethod((QObject *)qmlObj, "runJs", Q_ARG(QVariant, js));
}void frmMapQml::receiveDataFromJs(const QString &type, const QString &result)
{if (type == "click") {QString info = QString("触发鼠标单击\n当前经纬度值: %1").arg(result);QtHelper::showMessageBoxInfo(info);} else if (type == "rightclick") {QString info = QString("触发鼠标右键\n当前经纬度值: %1").arg(result);QtHelper::showMessageBoxInfo(info);} else if (type == "dblclick") {QString info = QString("触发鼠标双击\n当前经纬度值: %1").arg(result);QtHelper::showMessageBoxInfo(info);} else if (type == "geocoderresult") {QStringList list = result.split("|");QString flag = list.first();if (flag == "startAddr") {startPoint = list.last();QString endAddr = ui->txtEndAddr->text().trimmed();this->runJs(QString("getPointByAddr('endAddr', '%1')").arg(endAddr));} else if (flag == "endAddr") {endPoint = list.last();}//两个地址都有了再开启路径规划if (!startPoint.isEmpty() && !endPoint.isEmpty()) {this->runJs(QString("searchRoute(2, '%1', '%2', '%3')").arg(0).arg(startPoint).arg(endPoint));}} else if (type == "routeresult") {QStringList list = result.split("|");QString result = MapHelper::getRouteResult(list.first().toInt(), list.last().toInt());ui->txtResult->setText(result);} else if (type == "routepoints") {datas.clear();QStringList list = result.split("|");foreach (QString data, list) {datas << data.split(";");}//有些地图内核需要延迟一点载入数据MapCore mapCore = mapObj->getMapCore();int interval = (mapCore == MapCore_BaiDuGL ? 500 : 0);QTimer::singleShot(interval, this, SLOT(loadData()));} else if (type == "movestep") {MapCore mapCore = mapObj->getMapCore();if (mapCore != MapCore_BaiDuGL && mapCore != MapCore_GaoDe) {QString point = result.split("|").last();this->runJs(QString("setCenter('%1')").arg(point));}} else if (type == "moveend") {ui->widgetPara->setEnabled(true);on_btnStart_clicked();//再次执行则表示循环QMetaObject::invokeMethod(this, "on_btnStart_clicked", Qt::QueuedConnection);}
}void frmMapQml::on_btnSelect_clicked()
{//执行地址转经纬度操作/路径规划一般只支持经纬度参数startPoint = endPoint = "";QString startAddr = ui->txtStartAddr->text().trimmed();this->runJs(QString("getPointByAddr('startAddr', '%1')").arg(startAddr));
}void frmMapQml::on_btnStart_clicked()
{if (datas.count() <= 0) {QtHelper::showMessageBoxError("请先单击查询路线获取路线的坐标点集合!");return;}if (ui->btnStart->text() == "开始导航") {this->runJs(QString("addLine('%1', '%2', '#ff0000', 6)").arg(flag).arg(datas.first()));//this->runJs(QString("setTilt(%1)").arg(60));this->runJs(QString("moveStart('%1')").arg(flag));ui->btnStart->setText("停止导航");ui->widgetPara->setEnabled(false);} else {this->runJs(QString("moveStop('%1')").arg(flag));ui->btnStart->setText("开始导航");ui->widgetPara->setEnabled(true);}
}
三、相关链接
- 体验地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 文件名:bin_map.zip
- 国内站点:https://gitee.com/feiyangqingyun
- 国际站点:https://github.com/feiyangqingyun
四、效果图
五、功能特点
5.1 地图功能
- 支持多种地图内核,默认采用百度地图,可选高德地图、天地图、腾讯地图、谷歌地图等。
- 同时支持在线地图和离线地图两种模式,离线地图方便在不联网的场景中使用。
- 支持各种地图控件的启用,比如地图导航、地图类型、缩略图、比例尺、全景导航、实时路况、绘图工具、结果面板等。
- 支持多种地图功能的动态启用禁用,比如地图拖曳、键盘操作、滚轮缩放、双击放大、连续缩放、地图测距等。
- 提供众多js函数接口用于交互,参数极其丰富,能够想到的应用场景需求都有。
- 统一的信号槽机制,地图中的结果统一信号发送出去,收到后根据type类型区分。
- 支持地图交互,比如鼠标按下获取对应位置的经纬度。单击标注点弹出对应点的信息。
- 支持添加标注、删除标注、移动标注、清空标注。
- 标注点可以指定图标图片和尺寸,支持gif动图,支持指定以图片中心对齐还是底部中心对齐。可以设置旋转角度,带富文本提示信息。
- 标注点事件支持单击发信号通知和自己弹框显示信息。
- 提供地址转坐标和坐标转地址接口。
- 支持各种图形绘制,包括折线图、多边形、矩形、圆形、弧线等。
- 可显示悬浮的绘图工具栏,直接在地图上划线、标注点、矩形、圆形等。
- 支持各种区域搜索,比如矩形区域、圆形区域,可以按照关键字匹配将搜索结果显示在地图中。
- 可动态添加离线的行政区边界点数据。可以搜索行政区划并获取该区域的边界点数据。数据可以保存到文件以便离线使用。
- 支持点聚合功能,多个小标注点合并到一个大标注点,防止点密集导致交互不友好。
- 可以添加海量点,每个点都可以单击获取对应坐标和信息。
- 所有的覆盖物信息比如标注点、矩形、多边形、折线图等,都可以主动获取对应的信息比如坐标点和路径等。
- 支持路径规划,支持公交路线、自驾路线、步行路线、骑行路线,不同查询支持不同策略,可选最少时间、最少换乘、不走高架等。
- 路径规划结果可以显示在地图中,也可以获取到路径点坐标集合。这个数据可以保存到文件,以便发给机器人或者无人机做导航用来轨迹移动。
- 可以设置不同的地图视图比如街道图、卫星图、混合图。
- 可以设置不同的样式,比如午夜蓝、青草绿等样式风格。
- 可以设置地图的旋转角度和倾斜角度。
- 提供经纬度坐标纠偏转换功能,比如传入的GPS坐标需要转换到百度地图坐标或者高德地图坐标。各种坐标系转换全部离线函数,支持地球坐标系WGS-84、火星坐标系GCJ-02、百度坐标系BD-09之间的互相转换,涵盖了各种地图的坐标系。
- 提供动态轨迹点移动功能,按照给定的经纬度坐标集合平滑移动。
- 同时支持qwidget和qml,支持编译到安卓系统运行。
5.2 其他功能
- 提供离线地图下载模块,可以选择不同的地图内核比如百度地图或者谷歌地图,不同的地图类型比如下载街道图还是卫星图,不同的地图层级,多线程极速下载。
- 表格行实时显示对应的瓦片下载进度,有下载超时时间,重试次数,每个瓦片下载完成都发送信号通知,参数包括下载用时。
- 提供省市轮廓图下载模块,自动下载各个地区的轮廓图,保存到脚本文件或者文本文件。
- 支持手动调整不同区域的轮廓边界,调整后可以主动获取调整后的边界点集合。
- 提供动态点位示例,手动在地图上选点并添加标注,附带自定义的信息比如速度和时间等。
- 提供海量点位示例,批量添加标注点、点聚合、海量点。用于测试环境中支持的最大点位性能。
- 提供动态轨迹示例,在地图上鼠标按下选择起点和终点后,查询路线,获取路径轨迹点,模拟轨迹平滑移动。可以筛选数据将过多的路径点筛选到设定的点数。
- 提供轨迹回放示例,按照指定的轨迹点列表回放,也可以导入轨迹点数据进行回放。同时支持在街道图、卫星图、混合图中回放轨迹。
- 提供省市区域地图示例,采用echart组件,同时支持闪烁点图、迁徙图、区域地图、世界地图、仪表盘等。可以设置标题、提示信息、背景颜色、文字颜色、线条颜色、区域颜色等各种颜色。
- 省市区域地图示例,内置世界地图、全国地图、省份地图、地区地图,可以精确到县,所有地图全部离线使用。可设置城市的名称、值、经纬度集合。
- 内置通用浏览器组件,同时支持webkit/webengine/miniblink等内核。提供网页控件示例,演示打开网页和本地网页文件。
- 支持任意Qt版本、任意系统、任意编译器。
相关文章:

Qt/C++离线地图的加载和交互/可以离线使用/百度和天地图离线/支持手机上运行
一、前言说明 在地图应用中,有很多时候是需要断网环境中离线使用的,一般会采用两种做法,一种是只下载好离线瓦片地图,然后根据不同的缩放和经纬度坐标绘制瓦片。这种方式优点是任何地图都支持,只需要拿到瓦片即可&…...
从繁琐到优雅:用 PyTorch Lightning 简化深度学习项目开发
从繁琐到优雅:用 PyTorch Lightning 简化深度学习项目开发 在深度学习开发中,尤其是使用 PyTorch 时,我们常常需要编写大量样板代码来管理训练循环、验证流程和模型保存等任务。PyTorch Lightning 作为 PyTorch 的高级封装库,帮助…...

UE5 第一人称射击项目学习(完结)
这个项目几乎完结了。 也算我上手的第一个纯蓝图小项目。 现在只剩下缝缝补补了。 之前把子弹设计为蓝图,这里要引入C的面向对象思想,建立成员函数。 首先双击打开子弹的蓝图 这边就可以构造成员函数 写一个print your name 在这里生成成员函数后&am…...

Banana Pi BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片设计
概述 Banana Pi BPI-CanMV-K230D-Zero 采用嘉楠科技 K230D RISC-V芯片设计,探索 RISC-V Vector1.0 的前沿技术,选择嘉楠科技的 Canmv K230D Zero 开发板。这款创新的开发板是由嘉楠科技与香蕉派开源社区联合设计研发,搭载了先进的勘智 K230D 芯片。 K230…...

【vim】使用 gn 组合命令实现搜索选中功能
gn是Vim 7.4新增的一个操作(motion),作用是跳到并选中下一个搜索匹配项。 具体说,Vim里执行搜索后,执行n操作只会跳转到下一个匹配项,而不选中它。但是我们往往需要对匹配项执行一些修改操作,例…...

【Python刷题】广度优先搜索相关问题
题目描述 小A与小B 算法思路 小A一次移动一步,但有八个方向,小B一次移动两步,只有四个方向,要求小A和小B最早的相遇时间。用两个队列分别记录下小A和小B每一步可以走到的位置,通过一个简单的bfs就能找到这些位置并…...

竞赛思享会 | 2024年第十届数维杯国际数学建模挑战赛D题【代码+演示】
Hello,这里是Easy数模!以下idea仅供参考,无偿分享! 题目背景 本题旨在通过对中国特定城市的房产、人口、经济、服务设施等数据进行分析,评估其在应对人口老龄化、负增长趋势和极端气候事件中的韧性与可持续发展能力。…...

早期超大规模语言模型的尝试——BLOOM模型论文解读,附使用MindSpore和MindNLP的模型和实验复现
背景 预训练语言模型已经成为了现代自然语言处理pipeline中的基石,因为其在少量的标注数据上产生更好的结果。随着ELMo、ULMFiT、GPT和BERT的开发,使用预训练模型在下游任务上微调的范式被广泛使用。随后发现预训练语言模型在没有任何额外训练的情况下任…...
二分查找题目:有序数组中的单一元素
文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题:有序数组中的单一元素 出处:540. 有序数组中的单一元素 难度 4 级 题目描述 要求 给定一个仅由整数…...

springboot基于Android的华蓥山旅游导航系统
摘 要 华蓥山旅游导航系统是一款专为华蓥山景区设计的智能导览应用,旨在为用户提供便捷的旅游信息服务。该系统通过整合华蓥山的地理信息、景点介绍、交通状况等数据,实现了对景区的全面覆盖。用户可以通过该系统获取实时的旅游资讯、交流论坛、地图等。…...

面向对象编程(OOP)深度解析:思想、原则与应用
🚀 作者 :“码上有前” 🚀 文章简介 :Java 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 面向对象编程(OOP)深度解析:思想、原则与应用 一、面向对象编程的基本…...

iPhone 17 Air看点汇总:薄至6mm 刷新苹果轻薄纪录
我们姑且将这款iPhone 17序列的超薄SKU称为“iPhone 17 Air”,Jeff Pu在报告中提到,我同意最近关于 iPhone 17超薄机型采用6 毫米厚度超薄设计的传言。 如果这一测量结果被证明是准确的,那么将有几个值得注意的方面。 首先,iPhone…...

「OpenCV交叉编译」ubuntu to arm64
Ubuntu x86_64 交叉编译OpenCV 为 arm64OpenCV4.5.5、cmake version 3.16.3交叉编译器 gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu 可在arm或linaro官网下载所需版本,本文的交叉编译器可点击链接跳转下载 Downloads | GNU-A Downloads – Arm Developer L…...

Stable Diffusion的解读(二)
Stable Diffusion的解读(二) 文章目录 Stable Diffusion的解读(二)摘要Abstract一、机器学习部分1. 算法梳理1.1 LDM采样算法1.2 U-Net结构组成 2. Stable Diffusion 官方 GitHub 仓库2.1 安装2.2 主函数2.3 DDIM采样器2.4 Unet 3…...

amd显卡和nVidia显卡哪个好 amd和英伟达的区别介绍
AMD和英伟达是目前市场上最主要的两大显卡品牌,它们各有自己的特点和优势,也有不同的适用场景和用户群体。那么,AMD显卡和英伟达显卡到底哪个好?它们之间有什么区别?我们又该如何选择呢?本文将从以下几个方…...

软件测试—— Selenium 常用函数(一)
前一篇文章:软件测试 —— 自动化基础-CSDN博客 目录 前言 一、窗口 1.屏幕截图 2.切换窗口 3.窗口设置大小 4.关闭窗口 二、等待 1.等待意义 2.强制等待 3.隐式等待 4.显式等待 总结 前言 在前一篇文章中,我们介绍了自动化的一些基础知识&a…...

为什么verilog中递归函数需要定义为automatic?
直接上代码 module automatic_tb;reg [7:0] value;initial begin #0 value < 8d5;#10 $display("result of automatic: %0d", factor_automatic(value));$display("result of static: %0d", factor_static(value));#50 $stop; endfunction reg[7:0] fa…...

23种设计模式-状态(State)设计模式
文章目录 一.什么是状态模式?二.状态模式的结构三.状态模式的应用场景四.状态模式的优缺点五.状态模式的C实现六.状态模式的JAVA实现七.代码解释八.总结 类图: 状态设计模式类图 一.什么是状态模式? 状态模式(State Pattern&…...

EventListener与EventBus
EventListener JDK JDK1.1开始就提供EventListener,一个标记接口,源码如下: /*** A tagging interface that all event listener interfaces must extend.*/ public interface EventListener { }JDK提供的java.util.EventObject࿱…...

Facebook为什么注册失败了?该怎么解决?
有时候用户在尝试注册Facebook账号时可能会遇到各种问题,导致注册失败或遇到困难。小编会为大家分析Facebook注册失败的可能原因,并提供解决方法,帮助大家顺利完成注册流程。 一、Facebook注册失败的可能原因 1. 账号信息问题: …...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...