基于Java和GeoTools的根据矢量BBOx自动生成格网文件实践
目录
前言
一、基础数据介绍及生成方法简介
1、矢量数据处理
2、格网生成算法
二、代码实现
1、根据Shp计算Bounds
2、生成经纬网要素集合
3、写入 Shapefile
三、结果输出与验证
1、格网文件输出格式
2、GIS工具验证
四、总结
前言
在当今数字化与信息化高速发展的时代,地理空间数据在众多领域发挥着至关重要的作用,如城市规划、资源管理、环境监测、灾害预警等。矢量文件作为地理空间数据的重要存储形式之一,以其精确表达地理实体的形状、位置和属性等特点,被广泛应用于各种地理信息系统(GIS)项目中。然而,在一些特定的应用场景下,我们需要将矢量数据转换为格网文件格式,以便于进行更高效的计算、分析和可视化处理。格网数据在空间分析中具有独特的优势,例如在进行空间插值、地形分析、空间建模等方面,格网数据能够提供更直观、更易于处理的数据结构。然而,手动进行矢量文件到格网文件的转换往往耗费大量时间和精力,且容易出现人为错误,难以满足大规模、高效处理地理空间数据的需求。因此,开发一种基于 Java 和 GeoTools 的自动生成格网文件的方法具有重要的现实意义。
Java 作为一种广泛使用的编程语言,以其跨平台性、稳定性和丰富的类库支持,为地理空间数据处理提供了强大的编程基础。GeoTools 作为开源的 Java GIS 工具库,为地理空间数据的读取、处理、分析和转换提供了丰富的功能和便捷的 API。通过结合 Java 和 GeoTools,我们可以充分利用它们的优势,实现矢量文件到格网文件的自动化转换。
本实践旨在探索利用 Java 和 GeoTools 的强大功能,构建一个高效、准确的矢量文件转格网文件的系统。从矢量文件的读取与解析开始,深入研究如何根据矢量数据的空间分布和属性特征,自动划分格网并生成相应的格网文件。在实践过程中,我们将面临诸多挑战,如矢量数据的复杂性、格网划分的精度控制、数据转换的效率提升等,需要通过不断尝试和优化算法来解决。本文将详细阐述基于 Java 和 GeoTools 进行矢量文件转格网文件实践的过程、方法和技术细节,包括环境搭建、矢量数据处理、格网生成算法设计以及结果验证等方面。希望本实践研究能够为地理空间数据处理领域提供一种新的方法和思路,提高矢量文件转格网文件的效率和质量,为相关领域的研究和应用提供有力的支持和参考。
一、基础数据介绍及生成方法简介
本节将对设计的基础数据和格网生成算法进行简单介绍,让大家在最开始的时候对实现过程有一个基本的思路。
1、矢量数据处理
这里我们需要对湖南省及其相邻地市的范围数据进行后端的格网生成。首先需要准备的是一份面状的基础数据。大家可以在Qgis中打开这份数据,如下图所示:
为了能更清晰的展示各地市的基本信息,我们使用分类样式对当前的矢量数据进行分类标绘,这是可以清晰的看到各地市的空间分布情况。
2、格网生成算法
本文中说明的根据矢量文件自动生成格网的算法流程表示如下:
流程步骤说明如下:
1、使用GeoTools读取矢量数据 。
2、提取矢量数据的边界框(BBOX)。
3、创建要素集合
4、生成经纬线格网(根据BBOX计算格网大小与分辨率)
5、写入到Shp矢量文件中
6、文件写入
以上就是格网生成的具体实现步骤。熟悉了生成的算法步骤之后,下面就一起来一步一步的进行实现上面的经纬网生成实现。
二、代码实现
本节将按照前面的流程步骤说明,进一步的完成经纬格网的数据自动生成。本段的内容包含具体的实例代码,可以作为重点参考部分。
1、根据Shp计算Bounds
读取矢量数据并提取BBOX的关键代码如下:
// 1. 读取源SHP文件
File sourceFile = new File("F:/vector_data/2021年7月中国乡镇行政区划shp-(乡镇信息有点旧)/2021湖南省乡镇行政区划/湖南省/湖南省/湖南省_市界.shp");
ShapefileDataStore dataStore = new ShapefileDataStore(sourceFile.toURI().toURL());
ReferencedEnvelope bounds = dataStore.getFeatureSource().getBounds();
double minLon = bounds.getMinX();
double maxLon = bounds.getMaxX();
double minLat = bounds.getMinY();
double maxLat = bounds.getMaxY();
System.out.println(minLon);
System.out.println(maxLon);
System.out.println(minLat);
System.out.println(maxLat);
2、生成经纬网要素集合
在获取了矢量数据的BBOX后,我们就可以根据BBOX的最大最小值来生成对应的经纬线。因此这里就成了文章的核心,如何根据bbox来生成经纬线数据。由于最后我们需要生成一个完整标准的shp文件,因此我们首先就需要创建一个要素信息,创建要素类型的代码如下:
/** 创建要素类型 */
private static SimpleFeatureType createFeatureType() throws SchemaException {SimpleFeatureTypeBuilder builder = new SimpleFeatureTypeBuilder();builder.setName("Graticule");builder.setCRS(WGS84);builder.add("geometry", LineString.class); // 几何字段builder.add("type", String.class); // 类型(经线/纬线)builder.add("degree", Double.class); // 度数return builder.buildFeatureType();
}
上面的代码就好像是在关系型数据库中,我们已经创建了一个表结构。里面包含了三个字段,第一个字段是空间属性数据,使用geometry来进行存储,除此之外还有两个属性字段,即类型(纬线还是经线),最后是一个标准的度数数据,这里采用的是默认的WGS84的地理坐标。有了表结构之后,接下来就是往表中写入数据。根据bbox来自动生成格网的关键代码如下:
/** 创建线要素 */
private static SimpleFeature createFeature(SimpleFeatureType type, LineString line, String typeStr, double degree) {SimpleFeatureBuilder featureBuilder = new SimpleFeatureBuilder(type);featureBuilder.set("geometry", line);featureBuilder.set("type", typeStr);featureBuilder.set("degree", degree);return featureBuilder.buildFeature(null);
}
/** 创建线段 */
private static LineString createLine(double x1, double y1, double x2, double y2) {org.locationtech.jts.geom.Coordinate[] coordinates = {new org.locationtech.jts.geom.Coordinate(x1, y1),new org.locationtech.jts.geom.Coordinate(x2, y2)};return JTSFactoryFinder.getGeometryFactory().createLineString(coordinates);
}
接下来是生成格网的核心算法,这里采用循环的方式,自动按照矢量的边界范围进行生成。示例代码如下:
/**
* 生成经纬网要素集合
* @param minLon 最小经度
* @param maxLon 最大经度
* @param minLat 最小纬度
* @param maxLat 最大纬度
* @param interval 间隔(度)
*/
private static SimpleFeatureCollection generateGraticule(double minLon, double maxLon, double minLat, double maxLat, double interval) throws SchemaException {// 创建要素类型SimpleFeatureType TYPE = createFeatureType();// 存储所有要素的集合List<SimpleFeature> features = new ArrayList<>();// 生成经线(固定经度,纬度从 minLat 到 maxLat)for (double lon = minLon; lon <= maxLon; lon += interval) {LineString line = createLine(lon, minLat, lon, maxLat);features.add(createFeature(TYPE, line, "LON", lon));}// 生成纬线(固定纬度,经度从 minLon 到 maxLon)for (double lat = minLat; lat <= maxLat; lat += interval) {LineString line = createLine(minLon, lat, maxLon, lat);features.add(createFeature(TYPE, line, "LAT", lat));}return new ListFeatureCollection(TYPE, features);
}
3、写入 Shapefile
这里我们将shp文件准备完成之后,接下来就是最重要的一步,即往shp文件中写入要素信息,这样就实现了生成的格网shapefile的落盘处理。写出shapefile的实现比较简单,示例代码如下:
private static void writeToShapefile(SimpleFeatureCollection features, File file) throws IOException {// 方法 1:直接使用 ShapefileDataStoreFactoryShapefileDataStore dataStore = new ShapefileDataStore(file.toURI().toURL());dataStore.createSchema(features.getSchema());// 写入数据try (FeatureWriter<SimpleFeatureType, SimpleFeature> writer = dataStore.getFeatureWriterAppend(null)) {SimpleFeatureIterator iterator = features.features();while (iterator.hasNext()) {SimpleFeature feature = iterator.next();SimpleFeature newFeature = writer.next();newFeature.setAttributes(feature.getAttributes());writer.write();}iterator.close();}dataStore.dispose();
}
在需要调用的逻辑如下,需要定义一个本地保存的矢量文件。
// 3、写入 Shapefile
// 定义输出路径
File shapefile = new File("D:/shp_test/graticule250508.shp");
writeToShapefile(features, shapefile);
System.out.println("完成!!!");
三、结果输出与验证
本节将对经过前面的步骤生成的格网成果进行输出和验证。
1、格网文件输出格式
经过前面的步骤在目标磁盘可以看到已经成功的生成我们需要的shp文件,打开磁盘目录如下图所示:
表名需要的文件已经成功的生成到我们的目标磁盘中。
2、GIS工具验证
将生成shp文件使用QGIS这样的GIS软件中进行查看,可以看到以下的效果:
为了验证当前生成的经纬网线数据是否是符合目标的文件bbox范围的,我们再叠加原始的数据图层来校验一下。
可以看到生成的格网数据是完全按照我们的预期来生成,需求得到了满足。
四、总结
以上就是本文的主要内容,本实践旨在探索利用 Java 和 GeoTools 的强大功能,构建一个高效、准确的矢量文件转格网文件的系统。从矢量文件的读取与解析开始,深入研究如何根据矢量数据的空间分布和属性特征,自动划分格网并生成相应的格网文件。在实践过程中,我们将面临诸多挑战,如矢量数据的复杂性、格网划分的精度控制、数据转换的效率提升等,需要通过不断尝试和优化算法来解决。本文将详细阐述基于 Java 和 GeoTools 进行矢量文件转格网文件实践的过程、方法和技术细节,包括环境搭建、矢量数据处理、格网生成算法设计以及结果验证等方面。希望本实践研究能够为地理空间数据处理领域提供一种新的方法和思路,提高矢量文件转格网文件的效率和质量,为相关领域的研究和应用提供有力的支持和参考。当然在生成的结果中可以看到,还是存在一些不足,即我们生成的格网的末端不是很平滑,因此在未来我们可以优化以下末端的处理。同时对于经纬线的标注可以将值进行格式化一下,这样看起来会更加符合人类的习惯。行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激。
实例代码已上传到资源库下载点击:使用Geotools自动提取Shp文件bbox生成格网示例。
相关文章:
基于Java和GeoTools的根据矢量BBOx自动生成格网文件实践
目录 前言 一、基础数据介绍及生成方法简介 1、矢量数据处理 2、格网生成算法 二、代码实现 1、根据Shp计算Bounds 2、生成经纬网要素集合 3、写入 Shapefile 三、结果输出与验证 1、格网文件输出格式 2、GIS工具验证 四、总结 前言 在当今数字化与信息化高速发展的…...
[docker基础二]NameSpace隔离实战
目录 一 实战目的 二 基础知识 1)dd 命令详解 2)mkfs命令详解 3)df命令详解 4)mount 命令详解 5)unshare命令详解 三 实战操作一(PID隔离) 四 实战操作二(MOunt隔离) 1)创建 Mount 隔离进程 2)在新进程里边,创建空白文件&#…...
PIC18F45K80 ECAN模块使用
PIC18F45K80的CAN使用过程遇到一些问题,记录一下,主要是代码的理解。 在MPLAB X中配置工程: 1,在MCC中添加ECAN外设 2,CAN通讯有波特率的概念,整一个CAN网络需要运行在同一个速率。这里我们把他配置到12…...
RuntimeError: expected scalar type ComplexDouble but found Float
要解决 RuntimeError: expected scalar type ComplexDouble but found Float 错误,请按照以下步骤操作: 步骤 1:定位错误发生的位置 查看完整的错误堆栈跟踪,确定具体是哪一行代码引发了错误。例如:RuntimeError: exp…...
基于DeepSeek的韦恩图绘制:方法、优化与应用
一、研究背景与冲突 在生物信息学、医学研究、数据科学等众多领域,清晰展示数据集之间的交集关系至关重要。韦恩图(Venn diagram)作为一种有效的可视化工具,能以直观的图形呈现多个数据集之间的重叠情况,帮助研究者快…...
自动驾驶的“眼睛”:用Python构建智能障碍物检测系统
自动驾驶的“眼睛”:用Python构建智能障碍物检测系统 在自动驾驶技术日益成熟的今天,障碍物检测系统成了汽车智能化不可或缺的部分。无论是高速公路上的突发状况,还是城市街道中的行人与车辆,准确识别障碍物并及时反应,是保证行车安全的关键。 那么,我们如何用Python构…...
基于HTML+JavaScript+CSS实现教学网站
摘要 21世纪是信息化的时代,信息化物品不断地涌入我们的生活。同时,教育行业也产生了重大变革。传统的身心教授的模式,正在被替代。互联网模式的教育开辟了一片新的热土。 这算是对教育行业的一次重大挑战。截至目前,众多教育行…...
【Pandas】pandas DataFrame all
Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 True pandas.DataFrame.all() pandas.DataFrame.all() 方…...
何时需要import css文件?怎么知道需要导入哪些css文件?为什么webpack不提示CSS导入?(导入css导入规则、css导入规范)
文章目录 何时需要import css文件?**1. 使用模块化工具(如 Webpack、Vite、Rollup 等)****适用场景:****示例:****优点:** **2. 动态加载 CSS(按需加载)****适用场景:***…...
智汇云舟亮相第二十七届北京科博会
5月8日,备受瞩目的第二十七届中国北京国际科技产业博览会(以下简称:北京科博会)在国家会议中心盛大开幕。作为我国科技领域的重要盛会,北京科博会汇聚了众多前沿科技成果与创新力量,为全球科技产业交流搭建…...
ThreadLocal
9.1.1 面试题 ThreadLocal中ThreadLocalMap的数据结构和关系ThreadLocal的key是弱引用,这是为什么?ThreadLocal内存泄漏问题你知道吗?ThreadLocal中最后为什么要加remove方法?...
【高并发内存池】从零到一的项目之centralcache整体结构设计及核心实现
个人主页 : zxctscl 专栏 【C】、 【C语言】、 【Linux】、 【数据结构】、 【算法】 如有转载请先通知 文章目录 前言1. central cache整体结构2. central cache基础结构2.1 span类设计2.2 SpanList带头双向循环链表设计2.3 central cache类设计 3. central cache核…...
(pnpm)引入 其他依赖失败,例如‘@element-plus/icons-vue‘失败
当我们在开发项目的时候,利用了 pnpm 来进行管理,可能有些依赖就无法引入,这是因为 pnpm 和 npm 管理包的方式不一样, 举个例子,假如我们现在需要安装一个 A 包,A 包依赖 B 包, 此时我们通过 …...
面试题:请解释Java中的线程池(ThreadPoolExecutor)的工作原理,并说明如何自定义线程池
线程池(ThreadPoolExecutor)的工作原理 线程池是一种用于管理和复用线程的机制,它可以减少线程创建和销毁的开销,提高程序的执行效率。ThreadPoolExecutor是Java中实现线程池的一个类,它位于java.util.concurrent 包中…...
Windows Server 2025开启GPU分区(GPU-P)部署DoraCloud云桌面
本文描述在ShareStation工作站虚拟化方案的部署过程。 将服务器上部署 Windows Server、DoraCloud,并创建带有vGPU的虚拟桌面。 GPU分区技术介绍 GPU-P(GPU Partitioning) 是微软在 Windows 虚拟化平台(如 Hyper-V)中…...
WEB前端表单及表格标签综合案例
表单标签综合案例: 源代码: <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…...
HTML应用指南:利用POST请求获取全国德邦快递服务网点位置信息
德邦快递作为中国领先的综合性物流服务提供商,自1996年成立以来,始终致力于为客户提供高效、安全的大件快递及其他物流解决方案。德邦快递凭借其强大的直营模式、“最后一公里”的优质服务以及对科技的持续投入,在竞争激烈的物流市场中占据了重要位置。特别是在大件快递领域…...
【Linux网络】应用层自定义协议与序列化
应用层自定义协议与序列化 应用层 我们程序员写的一个个解决我们实际问题,满足我们日常需求的网络程序,都是在应用层. 协议是一种"约定".Socket的接口,在读写数据时,都是按"字符串"的方式来发送接收的.如果我们要传输一些"结构化的数据"怎么办…...
Excel提取单元格特定符号左右两边内容
公式: RIGHT(字符串, 字符个数) :从字符串右边开始,提取指定字数内容 公式应用: RIGHT(A1, LEN(A1) - SEARCH(“-”, A1))—提取单元格A1中符号“-”右边的字符串 LEN(A1) - SEARCH(“-”, A1) 即是返回符号“-”右边的字符串长…...
集群/微服务/分布式
目录 介绍 集群 微服务 优点 缺点 如何管理和监控微服务架构中的多个微服务? 服务治理 配置管理 监控与告警 容器化与编排 安全管理 分布式 三者关系 分布式和集群的区别是什么? 概念 工作方式 节点角色 应用场景 故障处理 微服务 微…...
安装docker
安装docker 一、关闭防火墙和SELinux 1.1systemctl stop firewalld 1.2setenfoce 0 二、配置内核转发以及网桥过滤 2.1vi /etc/sysctl.d/k8s.conf 2.2sysctl -p /etc/sysctl.d/k8s.conf :让文件生效 2.3modprobe br_netfilter:加载模块 若未生效成功…...
热力图是什么?三分钟学会热力图数据分析怎么做!
目录 一、热力图是什么? (一)基本概念 (二)常见类型 (三)优点 二、热力图分析工具 (一)FineBI (二)Tableau (三)P…...
Spring、SpringMVC、SpringBoot、SpringCloud 联系与区别
Spring、SpringMVC、SpringBoot、SpringCloud 联系与区别 一、引言 在 Java 企业级开发中,Spring 家族框架是绕不开的核心技术栈。从基础架构到 Web 开发,再到微服务架构,Spring 系列框架通过层层抽象,逐步简化开发复杂度。本文…...
操作系统导论——第26章 并发:介绍
本章介绍为单个运行进程提供的新抽象:线程(thread)。经典观点是一个程序只有一个执行点(一个程序计数器,用来存放要执行的指令),但多线程(multi-threaded)程序会有多个执…...
如何使用测试软件 Jmeter
第一步,点击 编辑 添加线程组 第二步,右键单击线程组,添加取样器 HTTP 请求 第三步,设置请求路径 第四步,添加 查看结果树 用于查看请求响应 最后点击绿色小三角启动即可...
HarmonyOS NEXT 免费无广告看电影app:从想法到实现的经验总结
学习一项新技能,最好也是最快的方法就是动手实战。学习鸿蒙也一样,给自己定一个小目标,直接找项目练,这样进步是最快的。最近,我在网上看到360周董的一句话:“想干什么就去干,干得烂总比不干强!…...
《算法导论(第4版)》阅读笔记:p14-p16
《算法导论(第4版)》学习第 9 天,p14-p16 总结,总计 3 页。 一、技术总结 无。 二、英语总结(生词:2) 1. in light of (1)释义 idiom. in light of 是美式用法,英式用法是 in the light of。take sth into consideration(鉴…...
kuka, fanuc, abb机器人和移动相机的标定
基础知识 : 一, 9点标定之固定相机标定: 图1: 固定位置相机拍照 因为相机和机器人的基坐标系是固定的, 所以在海康威视相机的9点标定功能栏中, 填上海康使用“圆查找”捕捉到的坐标值, 再将机器人显示的工具坐标系在基坐标系的实时位置pos_act值填入物理坐标X, Y中即可 图2:…...
【MyBatis-6】MyBatis动态SQL:灵活构建高效数据库查询的艺术
在现代企业级应用开发中,与数据库的交互是不可或缺的核心部分。MyBatis作为一款优秀的持久层框架,因其简洁、灵活和高效而广受开发者喜爱。其中,动态SQL功能更是MyBatis的一大亮点,它允许开发者根据不同条件灵活构建SQL语句&#…...
从零开始理解FlashAttention:算法细节图解
🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…...
js原型污染 + xss劫持base -- no-code b01lersctf 2025
题目信息:Found this new web framework the other day—you don’t need to write any code, just JSON. 我们先来搞清楚究竟发生了什么 当我们访问 /index /*** 处理 /:page 路径的 GET 请求* param {Object} req - 请求对象* param {Object} reply - 响应对象* returns {Pro…...
面试题:Java集合框架高频面试题总结
# Java集合框架高频面试题总结 ## 集合框架概述 1. **Java集合框架的主要组成部分** - Collection接口 - List: 有序可重复 - Set: 无序不可重复 - Queue: 队列 - Map接口: 键值对存储 2. **集合框架的继承体系** - Collection - List → Arra…...
【大模型ChatGPT+ArcGIS】数据处理、空间分析、可视化及多案例综合应用
在数字化和智能化的浪潮中,GIS(地理信息系统)和GPT(生成式预训练模型)的结合正日益成为推动科研、城市规划、环境监测等领域发展的关键技术。GIS以其强大的空间数据处理、先进的空间分析工具、灵活的地图制作与可视化能…...
使用JMETER中的JSON提取器实现接口关联
一、JSON提取器介绍 JSON提取器是JMETER工具中用于从JSON响应中提取数据的重要组件,常常用于接口关联场景中(参数传递)。 二、添加JSON提取器 举例(积分支付接口请求数据依赖于创建订单接口响应的payOrderId) 1.在…...
Filecoin存储管理:如何停止Lotus向特定存储路径写入新扇区数据
Filecoin存储管理:如何停止Lotus向特定存储路径写入新扇区数据 引言背景问题场景解决方案步骤1:修改sectorstore.json文件步骤2:重新加载存储配置步骤3:验证更改 技术原理替代方案最佳实践结论 引言 在Filecoin挖矿过程中&#x…...
Elasticsearch太重?它的超轻量的替代品找到了!
简要介绍 在海量数据时代,快速而精准地找到所需信息至关重要。如果您正为此苦恼,或者您是 Elasticsearch 的用户,并对其资源消耗或性能有所关注,那么今天我要向您介绍一款名为 Manticore Search 的开源搜索数据库,它或…...
【计算机视觉】OpenCV实战项目: Fire-Smoke-Dataset:基于OpenCV的早期火灾检测项目深度解析
Fire-Smoke-Dataset:基于OpenCV的早期火灾检测项目深度解析 在当今数字化时代,火灾检测技术的智能化发展至关重要。传统的火灾检测方法依赖于烟雾传感器或人工监控,往往存在响应延迟或误报的问题。而随着计算机视觉技术的飞速发展࿰…...
STM32--PWM--函数
TIM_OCInitTypeDef TIM_OCInitTypeDef 是 STM32 标准外设库中用于配置定时器输出比较(Output Compare, OC)功能的结构体,主要用于 PWM 生成、单脉冲输出等场景。 typedef struct {uint16_t TIM_OCMode; // 输出比较模式uint16_t TIM_…...
软件测试应用技术(3) -- 软件评测师(十六)
5 事件驱动架构软件测试 5.1 事件驱动架构软件测试概述 事件驱动架构,简称EDA,是常用的架构范式中的一种,其关注事件的产生、识别、处理、响应。对于事件驱动架构系统的测试应特别注意其业务逻辑处理上的异步特性导致的缺陷和事件队列处理中…...
人工智能之数学基础:二次型
本文重点 二次型作为线性代数领域的重要概念,架起了代数方程与几何分析之间的桥梁。从古典解析几何中的圆锥曲线方程到现代优化理论中的目标函数,二次型以其简洁的数学表达和丰富的结构特性,在数学物理、工程技术和经济金融等领域发挥着不可替代的作用。 二次型的基本概念…...
MongoDB 创建索引原则
MongoDB索引创建原则 MongoDB索引是提高查询性能的关键工具,以下是创建索引的核心原则和最佳实践: 一、索引基础原则 1. 索引本质:索引类似书籍目录,通过B-Tree数据结构对字段值排序存储,使查询复杂度从O(n)降为…...
空间复杂度** 与 **所需辅助空间**
当我们说一个算法的 空间复杂度是 O(1),通常特指“辅助空间”是 O(1),即:除了输入数据本身之外,算法只使用常数级别的额外空间。 ✅ 正确认解: O(1) 空间复杂度 ≈ O(1) 辅助空间 这表示: 不随输入规模增长…...
Spring Web MVC快速入门
什么是Spring Web MVC Spring Web MVC 是基于 Servlet API 构建的原始 Web 框架,从⼀开始就包含在 Spring 框架中。它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为"Spring MVC". View(视图) 指在应⽤程序…...
RT-Thread 深入系列 Part 1:RT-Thread 全景总览
摘要: 本文将从 RTOS 演进、RT-Thread 的版本分支、内核架构、核心特性、社区与生态、以及典型产品应用等多维度,全面呈现 RT-Thread 的全景图。 关键词:RT-Thread、RTOS、微内核、组件化、软件包管理、SMP 1. RTOS 演进与 RT-Thread 定位 2…...
黄金、碳排放期货市场API接口文档
StockTV 提供了多种期货市场的数据接口,包括获取K线图表数据、查询特定期货的实时行情等。以下为对接期货市场的详细接口说明。 一、获取K线图表数据 通过调用/futures/kline接口,您可以获取指定期货合约的历史K线数据(例如开盘价、最高价、…...
SpringAI框架中的RAG知识库检索与增强生成模型详解
SpringAI框架中的RAG知识库检索与增强生成模型详解 一、RAG简介 RAG(Retrieval-Augmented Generation)可以通过检索知识库,克服大模型训练完成后参数冻结的局限性,携带知识让大模型根据知识进行回答。 二、SpringAI框架支持的R…...
LVGL- 按钮矩阵控件
1 按钮矩阵控件 lv_btnmatrix 是 LVGL(Light and Versatile Graphics Library) v8 中提供的一个非常实用的控件,用于创建带有多个按钮的矩阵布局。它常用于实现虚拟键盘、数字键盘、操作面板、选择菜单等场景,特别适用于嵌入式设…...
C++学习-入门到精通-【5】类模板array和vector、异常捕获
C学习-入门到精通-【5】类模板array和vector、异常捕获 类模板array和vector、异常捕获 C学习-入门到精通-【5】类模板array和vector、异常捕获一、array对象array对象的声明使用array对象的例子使用常量变量指定array对象的大小 二、基于范围的for语句三、利用array对象存放成…...
`待办事项css样式
vue <template> <div class"box"> <div class"head"> <h2>待办事项</h2> <input type"text" placeholder"请输入您的待办事项,按回车添加"> </div> <div class"main&q…...
spring ai alibaba 使用 SystemPromptTemplate 很方便的集成 系统提示词
系统提示词可以是.st 文件了,便于修改和维护 1提示词内容: 你是一个有用的AI助手。 你是一个帮助人们查找信息的人工智能助手。 您的名字是{name} 你应该用你的名字和{voice}的风格回复用户的请求。 每一次回答的时候都要增加一个65字以内的标题形如:【…...