当前位置: 首页 > news >正文

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);}
}

三、相关链接

  1. 体验地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 文件名:bin_map.zip
  2. 国内站点:https://gitee.com/feiyangqingyun
  3. 国际站点:https://github.com/feiyangqingyun

四、效果图

在这里插入图片描述

五、功能特点

5.1 地图功能

  1. 支持多种地图内核,默认采用百度地图,可选高德地图、天地图、腾讯地图、谷歌地图等。
  2. 同时支持在线地图和离线地图两种模式,离线地图方便在不联网的场景中使用。
  3. 支持各种地图控件的启用,比如地图导航、地图类型、缩略图、比例尺、全景导航、实时路况、绘图工具、结果面板等。
  4. 支持多种地图功能的动态启用禁用,比如地图拖曳、键盘操作、滚轮缩放、双击放大、连续缩放、地图测距等。
  5. 提供众多js函数接口用于交互,参数极其丰富,能够想到的应用场景需求都有。
  6. 统一的信号槽机制,地图中的结果统一信号发送出去,收到后根据type类型区分。
  7. 支持地图交互,比如鼠标按下获取对应位置的经纬度。单击标注点弹出对应点的信息。
  8. 支持添加标注、删除标注、移动标注、清空标注。
  9. 标注点可以指定图标图片和尺寸,支持gif动图,支持指定以图片中心对齐还是底部中心对齐。可以设置旋转角度,带富文本提示信息。
  10. 标注点事件支持单击发信号通知和自己弹框显示信息。
  11. 提供地址转坐标和坐标转地址接口。
  12. 支持各种图形绘制,包括折线图、多边形、矩形、圆形、弧线等。
  13. 可显示悬浮的绘图工具栏,直接在地图上划线、标注点、矩形、圆形等。
  14. 支持各种区域搜索,比如矩形区域、圆形区域,可以按照关键字匹配将搜索结果显示在地图中。
  15. 可动态添加离线的行政区边界点数据。可以搜索行政区划并获取该区域的边界点数据。数据可以保存到文件以便离线使用。
  16. 支持点聚合功能,多个小标注点合并到一个大标注点,防止点密集导致交互不友好。
  17. 可以添加海量点,每个点都可以单击获取对应坐标和信息。
  18. 所有的覆盖物信息比如标注点、矩形、多边形、折线图等,都可以主动获取对应的信息比如坐标点和路径等。
  19. 支持路径规划,支持公交路线、自驾路线、步行路线、骑行路线,不同查询支持不同策略,可选最少时间、最少换乘、不走高架等。
  20. 路径规划结果可以显示在地图中,也可以获取到路径点坐标集合。这个数据可以保存到文件,以便发给机器人或者无人机做导航用来轨迹移动。
  21. 可以设置不同的地图视图比如街道图、卫星图、混合图。
  22. 可以设置不同的样式,比如午夜蓝、青草绿等样式风格。
  23. 可以设置地图的旋转角度和倾斜角度。
  24. 提供经纬度坐标纠偏转换功能,比如传入的GPS坐标需要转换到百度地图坐标或者高德地图坐标。各种坐标系转换全部离线函数,支持地球坐标系WGS-84、火星坐标系GCJ-02、百度坐标系BD-09之间的互相转换,涵盖了各种地图的坐标系。
  25. 提供动态轨迹点移动功能,按照给定的经纬度坐标集合平滑移动。
  26. 同时支持qwidget和qml,支持编译到安卓系统运行。

5.2 其他功能

  1. 提供离线地图下载模块,可以选择不同的地图内核比如百度地图或者谷歌地图,不同的地图类型比如下载街道图还是卫星图,不同的地图层级,多线程极速下载。
  2. 表格行实时显示对应的瓦片下载进度,有下载超时时间,重试次数,每个瓦片下载完成都发送信号通知,参数包括下载用时。
  3. 提供省市轮廓图下载模块,自动下载各个地区的轮廓图,保存到脚本文件或者文本文件。
  4. 支持手动调整不同区域的轮廓边界,调整后可以主动获取调整后的边界点集合。
  5. 提供动态点位示例,手动在地图上选点并添加标注,附带自定义的信息比如速度和时间等。
  6. 提供海量点位示例,批量添加标注点、点聚合、海量点。用于测试环境中支持的最大点位性能。
  7. 提供动态轨迹示例,在地图上鼠标按下选择起点和终点后,查询路线,获取路径轨迹点,模拟轨迹平滑移动。可以筛选数据将过多的路径点筛选到设定的点数。
  8. 提供轨迹回放示例,按照指定的轨迹点列表回放,也可以导入轨迹点数据进行回放。同时支持在街道图、卫星图、混合图中回放轨迹。
  9. 提供省市区域地图示例,采用echart组件,同时支持闪烁点图、迁徙图、区域地图、世界地图、仪表盘等。可以设置标题、提示信息、背景颜色、文字颜色、线条颜色、区域颜色等各种颜色。
  10. 省市区域地图示例,内置世界地图、全国地图、省份地图、地区地图,可以精确到县,所有地图全部离线使用。可设置城市的名称、值、经纬度集合。
  11. 内置通用浏览器组件,同时支持webkit/webengine/miniblink等内核。提供网页控件示例,演示打开网页和本地网页文件。
  12. 支持任意Qt版本、任意系统、任意编译器。

相关文章:

Qt/C++离线地图的加载和交互/可以离线使用/百度和天地图离线/支持手机上运行

一、前言说明 在地图应用中&#xff0c;有很多时候是需要断网环境中离线使用的&#xff0c;一般会采用两种做法&#xff0c;一种是只下载好离线瓦片地图&#xff0c;然后根据不同的缩放和经纬度坐标绘制瓦片。这种方式优点是任何地图都支持&#xff0c;只需要拿到瓦片即可&…...

从繁琐到优雅:用 PyTorch Lightning 简化深度学习项目开发

从繁琐到优雅&#xff1a;用 PyTorch Lightning 简化深度学习项目开发 在深度学习开发中&#xff0c;尤其是使用 PyTorch 时&#xff0c;我们常常需要编写大量样板代码来管理训练循环、验证流程和模型保存等任务。PyTorch Lightning 作为 PyTorch 的高级封装库&#xff0c;帮助…...

UE5 第一人称射击项目学习(完结)

这个项目几乎完结了。 也算我上手的第一个纯蓝图小项目。 现在只剩下缝缝补补了。 之前把子弹设计为蓝图&#xff0c;这里要引入C的面向对象思想&#xff0c;建立成员函数。 首先双击打开子弹的蓝图 这边就可以构造成员函数 写一个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 的前沿技术&#xff0c;选择嘉楠科技的 Canmv K230D Zero 开发板。这款创新的开发板是由嘉楠科技与香蕉派开源社区联合设计研发&#xff0c;搭载了先进的勘智 K230D 芯片。 K230…...

【vim】使用 gn 组合命令实现搜索选中功能

gn是Vim 7.4新增的一个操作&#xff08;motion&#xff09;&#xff0c;作用是跳到并选中下一个搜索匹配项。 具体说&#xff0c;Vim里执行搜索后&#xff0c;执行n操作只会跳转到下一个匹配项&#xff0c;而不选中它。但是我们往往需要对匹配项执行一些修改操作&#xff0c;例…...

【Python刷题】广度优先搜索相关问题

题目描述 小A与小B 算法思路 小A一次移动一步&#xff0c;但有八个方向&#xff0c;小B一次移动两步&#xff0c;只有四个方向&#xff0c;要求小A和小B最早的相遇时间。用两个队列分别记录下小A和小B每一步可以走到的位置&#xff0c;通过一个简单的bfs就能找到这些位置并…...

竞赛思享会 | 2024年第十届数维杯国际数学建模挑战赛D题【代码+演示】

Hello&#xff0c;这里是Easy数模&#xff01;以下idea仅供参考&#xff0c;无偿分享&#xff01; 题目背景 本题旨在通过对中国特定城市的房产、人口、经济、服务设施等数据进行分析&#xff0c;评估其在应对人口老龄化、负增长趋势和极端气候事件中的韧性与可持续发展能力。…...

早期超大规模语言模型的尝试——BLOOM模型论文解读,附使用MindSpore和MindNLP的模型和实验复现

背景 预训练语言模型已经成为了现代自然语言处理pipeline中的基石&#xff0c;因为其在少量的标注数据上产生更好的结果。随着ELMo、ULMFiT、GPT和BERT的开发&#xff0c;使用预训练模型在下游任务上微调的范式被广泛使用。随后发现预训练语言模型在没有任何额外训练的情况下任…...

二分查找题目:有序数组中的单一元素

文章目录 题目标题和出处难度题目描述要求示例数据范围 解法一思路和算法代码复杂度分析 解法二思路和算法代码复杂度分析 题目 标题和出处 标题&#xff1a;有序数组中的单一元素 出处&#xff1a;540. 有序数组中的单一元素 难度 4 级 题目描述 要求 给定一个仅由整数…...

springboot基于Android的华蓥山旅游导航系统

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

面向对象编程(OOP)深度解析:思想、原则与应用

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;Java &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 面向对象编程&#xff08;OOP&#xff09;深度解析&#xff1a;思想、原则与应用 一、面向对象编程的基本…...

iPhone 17 Air看点汇总:薄至6mm 刷新苹果轻薄纪录

我们姑且将这款iPhone 17序列的超薄SKU称为“iPhone 17 Air”&#xff0c;Jeff Pu在报告中提到&#xff0c;我同意最近关于 iPhone 17超薄机型采用6 毫米厚度超薄设计的传言。 如果这一测量结果被证明是准确的&#xff0c;那么将有几个值得注意的方面。 首先&#xff0c;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官网下载所需版本&#xff0c;本文的交叉编译器可点击链接跳转下载 Downloads | GNU-A Downloads – Arm Developer L…...

Stable Diffusion的解读(二)

Stable Diffusion的解读&#xff08;二&#xff09; 文章目录 Stable Diffusion的解读&#xff08;二&#xff09;摘要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和英伟达是目前市场上最主要的两大显卡品牌&#xff0c;它们各有自己的特点和优势&#xff0c;也有不同的适用场景和用户群体。那么&#xff0c;AMD显卡和英伟达显卡到底哪个好&#xff1f;它们之间有什么区别&#xff1f;我们又该如何选择呢&#xff1f;本文将从以下几个方…...

软件测试—— Selenium 常用函数(一)

前一篇文章&#xff1a;软件测试 —— 自动化基础-CSDN博客 目录 前言 一、窗口 1.屏幕截图 2.切换窗口 3.窗口设置大小 4.关闭窗口 二、等待 1.等待意义 2.强制等待 3.隐式等待 4.显式等待 总结 前言 在前一篇文章中&#xff0c;我们介绍了自动化的一些基础知识&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)设计模式

文章目录 一.什么是状态模式&#xff1f;二.状态模式的结构三.状态模式的应用场景四.状态模式的优缺点五.状态模式的C实现六.状态模式的JAVA实现七.代码解释八.总结 类图&#xff1a; 状态设计模式类图 一.什么是状态模式&#xff1f; 状态模式&#xff08;State Pattern&…...

EventListener与EventBus

EventListener JDK JDK1.1开始就提供EventListener&#xff0c;一个标记接口&#xff0c;源码如下&#xff1a; /*** A tagging interface that all event listener interfaces must extend.*/ public interface EventListener { }JDK提供的java.util.EventObject&#xff1…...

Facebook为什么注册失败了?该怎么解决?

有时候用户在尝试注册Facebook账号时可能会遇到各种问题&#xff0c;导致注册失败或遇到困难。小编会为大家分析Facebook注册失败的可能原因&#xff0c;并提供解决方法&#xff0c;帮助大家顺利完成注册流程。 一、Facebook注册失败的可能原因 1. 账号信息问题&#xff1a; …...

前端数据可视化思路及实现案例

目录 一、前端数据可视化思路 &#xff08;一&#xff09;明确数据与目标 &#xff08;二&#xff09;选择合适的可视化图表类型 &#xff08;三&#xff09;数据与图表的绑定及交互设计 &#xff08;四&#xff09;页面布局与样式设计 二、具体案例&#xff1a;使用 Ech…...

【DVWA】Brute Force暴力破解实战

问尔辈 何等样人 自摸心头 再来求我&#xff1b;若汝能 克存忠孝 持身正直 不拜何妨 1.Brute Force(Low) 相关的代码分析 if( isset( $_GET[ Login ] ) ) {// Get username$user $_GET[ username ];// Check the database$query "SELECT * FROM users WHERE user $…...

23种设计模式速记法

前言 在软件开发的过程中&#xff0c;设计模式作为解决常见问题的通用模板&#xff0c;一直是开发者的重要工具。尤其是在面临复杂系统架构和需求变化时&#xff0c;设计模式不仅能够提升代码的可复用性和扩展性&#xff0c;还能大大提高团队之间的协作效率。然而&#xff0c;…...

第7章硬件测试-7.3 功能测试

7.3 功能测试 7.3.1 整机规格测试7.3.2 整机试装测试7.3.3 DFX测试 功能测试包括整机规格、整机试装和整机功能测试&#xff0c;是整机结构和业务相关的测试。 7.3.1 整机规格测试 整机规格测试包括尺寸、重量、温度、功耗等数据。这些测试数据与设计规格进行比对和校验&…...

动态规划子数组系列一>等差数列划分

题目&#xff1a; 解析&#xff1a; 代码&#xff1a; public int numberOfArithmeticSlices(int[] nums) {int n nums.length;int[] dp new int[n];int ret 0;for(int i 2; i < n; i){dp[i] nums[i] - nums[i-1] nums[i-1] - nums[i-2] ? dp[i-1]1 : 0;ret dp[i…...

《Python浪漫的烟花表白特效》

一、背景介绍 烟花象征着浪漫与激情&#xff0c;将它与表白结合在一起&#xff0c;会创造出别具一格的惊喜效果。使用Python的turtle模块&#xff0c;我们可以轻松绘制出动态的烟花特效&#xff0c;再配合文字表白&#xff0c;打造一段专属的浪漫体验。 接下来&#xff0c;让…...

什么是RESTful API,有什么特点

RESTful API 概述 什么是 RESTful API&#xff1f; RESTful API 是基于 Representational State Transfer&#xff08;表现层状态转移&#xff09;架构风格的 Web 服务接口。REST 是一种设计风格&#xff0c;而不是具体的协议或标准。它定义了一组约束和最佳实践&#xff0c;…...

友思特新闻 | 友思特荣获广州科技创新创业大赛智能装备行业赛初创组优胜企业!

2024年11月19日&#xff0c;第十三届中国创新创业大赛&#xff08;广东广州赛区&#xff09;暨2024年广州科技创新创业大赛智能装备行业赛颁奖典礼隆重举行。 赛事奖项介绍&#xff1a;广州科技创新创业大赛智能装备行业赛 第十三届“中国创新创业大赛&#xff08;广东广州赛区…...

CSS中calc语法不生效

问题起因 在使用calc时发现无法生效&#xff0c;写法是&#xff1a; height:calc(100vh-100px);页面无效果&#xff0c;加空格后就发现有效果了&#xff1a; height:calc(100vh - 100px);这是为什么&#xff1f; calc是什么&#xff1f; css3 的计算属性&#xff0c;用于动态…...

国标GB28181视频平台EasyCVR视频融合平台H.265/H.264转码业务流程

在当今数字化、网络化的视频监控领域&#xff0c;大中型项目对于视频监控管理平台的需求日益增长&#xff0c;特别是在跨区域、多设备、高并发的复杂环境中。EasyCVR视频监控汇聚管理平台正是为了满足这些需求而设计的&#xff0c;它不仅提供了全面的管理功能&#xff0c;还支持…...

网站怎么做的支付宝/爆款采集推广引流软件

文字语法&#xff08;推荐使用的方式&#xff09;&#xff1a; var obj { key : value }; 构造形式&#xff1a; var obj new Object&#xff08;&#xff09;&#xff1b; obj.key value&#xff1b; 对象的基本类型&#xff1a; string boolean number object …...

vps做网站 推广/如何制作一个网站

离散余弦变换 由于实信号傅立叶变换的共轭对称性&#xff0c;导致DFT后在频域中有一半的数据冗余。离散余弦变换(DCT)在处理实信号时比离散傅立叶(DFT)变换更具优势。在处理声音信号这类实信号时&#xff0c;DFT得到的结果是复功率谱&#xff0c;其结果中的一半数据是没利用价值…...

dw网站建设的心得体会/网络推广优化方案

OAB(offline address book) 历史脱机通讯簿&#xff08;可称为 OAB&#xff09;很长时间以来一直是 Exchange 基础架构中的关键组件。OAB 由 Microsoft Outlook 客户端在脱机时在缓存 Exchange 模式下用于通讯簿查找。OAB 还对减轻 Exchange 服务器上的工作负载起着重要作用&am…...

php做的卖水果网站有哪些/系统优化软件

在我还没有踏入测试领域的时候&#xff0c;就知道了自动化测试与手工测试的争论&#xff0c;现在&#xff0c;我就以我们公司的项目为例&#xff0c;讲述一下我认知的手工测试与自动化测试。 因为保密原则&#xff0c;不方便透漏项目的名字&#xff0c;就以项目表示了。我的工作…...

百度搜索什么关键词能搜到网站/seo高级教程

在使用zend framework的时候&#xff0c;最先引入的一定是AutoLoad的机制&#xff0c;这里就想分析下Zend的AutoLoad是怎么引入的。 代码示例 12345678910111213set_include_path(USVN_LIB_DIR . PATH_SEPARATOR . get_include_path());require_once Zend/Loader/Autoloader.ph…...

京东网页设计实训报告/重庆电子商务seo

原文链接&#xff1a;https://www.shuaihuajun.com/article/arduino-led/我现在手里有一套Ruff开发板套件和一套Arduino开发板套件。把Ruff开发套件中的所有传感器用了一个遍之后没玩够&#xff0c;于是开始把玩Arduino。没有对比就没有伤害真的是&#xff0c;虽然我真正接触Ar…...