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

基于SpringBoot和PostGIS的世界各国邻国可视化实践

目录

前言

一、空间数据查询基础

1、空间数据库基础

2、空间相邻查询

二、SpringBoot后台功能设计

1、后台查询接口的实现

2、业务接口设计

三、Leaflet进行WebGIS开发

1、整体结构介绍

2、相邻国家展示可视化

四、成果展示

1、印度及其邻国

2、乌克兰及其邻国

3、中东小霸王及其邻国

五、总结


前言

        胸怀祖国,放眼世界。在全球的世界当中,许多国家是陆地相连的,而邻国因为领土争议,是很多国家长期面临的斗争问题,比如朝鲜和韩国的问题,还有印度和巴基斯坦的领土争端问题。通过地理来探索世界,我们来看一下,如何使用WebGIS来对全球的国家基础信息进行查询,快速的通过空间分析来构建一个国家邻国查询的应用,通过空间的角度来看一下不同的国家,它的陆地领土相邻关系。如下图所示:

         本文以SpringBoot框架和PostGIS空间数据库为例,重点讲解如何实现一个国家的邻国查询以及WebGIS可视化应用的实现。文章首先讲解如何在PostGIS数据中进行空间相邻的求解,然后讲解使用Java来开发相应的查询接口,接着介绍在Leaflet当中进行数据的WebGIS展示,最后围绕一些国家及其邻国空间展示为大家做重点的介绍。地图会将故事,通过本文,不仅可以学习如何在SpringBoot中进行GIS的应用开发,而且通过WebGIS来展示我们的地球。如果您对这方面也感兴趣,不妨来看看呢。

一、空间数据查询基础

        在进行相关应用的开发之前,我们首先要对涉及的空间表以及空间查询函数进行介绍。让大家对相关的空间物理结构和空间检索函数有一个充分的认识。因此首先我们先来介绍一下在国家邻国查询的应用中需要使用的数据基础知识。

1、空间数据库基础

        虽然在前面的博文中,这里不再做过多的介绍,将空间表的物理结构给大家进行展示。

CREATE TABLE "public"."biz_world_country" ("pk_id" int8 NOT NULL,"full_english_name" varchar(255) COLLATE "pg_catalog"."default","short_english_name" varchar(255) COLLATE "pg_catalog"."default","min_english_name" varchar(50) COLLATE "pg_catalog"."default","full_chinese_name" varchar(255) COLLATE "pg_catalog"."default","short_chinese_name" varchar(255) COLLATE "pg_catalog"."default","continent" varchar(50) COLLATE "pg_catalog"."default","unreg" varchar(50) COLLATE "pg_catalog"."default","geom" "public"."geometry",CONSTRAINT "pk_biz_world_contry" PRIMARY KEY ("pk_id")
);
CREATE INDEX "idx_biz_world_country_continent" ON "public"."biz_world_country" USING btree ("continent" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
CREATE INDEX "idx_biz_world_country_geom" ON "public"."biz_world_country" USING gist ("geom" "public"."gist_geometry_ops_2d"
);
CREATE INDEX "idx_biz_world_country_min_englis" ON "public"."biz_world_country" USING btree ("min_english_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
COMMENT ON COLUMN "public"."biz_world_country"."pk_id" IS 'pk_id';
COMMENT ON COLUMN "public"."biz_world_country"."full_english_name" IS '英文全称';
COMMENT ON COLUMN "public"."biz_world_country"."short_english_name" IS '英文简称';
COMMENT ON COLUMN "public"."biz_world_country"."min_english_name" IS '最简名称';
COMMENT ON COLUMN "public"."biz_world_country"."full_chinese_name" IS '中文全称';
COMMENT ON COLUMN "public"."biz_world_country"."short_chinese_name" IS '中文简称';
COMMENT ON COLUMN "public"."biz_world_country"."continent" IS '所属大洲,如Asia';
COMMENT ON COLUMN "public"."biz_world_country"."unreg" IS '大洲详情';
COMMENT ON COLUMN "public"."biz_world_country"."geom" IS 'geom';
COMMENT ON TABLE "public"."biz_world_country" IS '世界国家信息表';

        以上就是全球国家信息表的主表物理结构和SQL管理语句。下面来看一下数据库中的数据,如下图所示:

select * from biz_world_country t;

2、空间相邻查询

        介绍完空间表结构和相应的表结构之后,我们再来介绍一下如何实现上述的需求,如何利用空间函数来进行国家以及其邻国的求解运算。这里我们使用PostGIS空间数据库为例,基于PostGIS来介绍如何进行相邻求解。要想实现求解这个需求,其实方法较多,最简单的方法就是直接利用相邻函数,在数据库中可以使用ST_Touches(Geometry geom1,Geometry geom2)。这里我们对这个ST_Touches函数来进行简单的介绍。掌握这个函数是求解空间相邻的关键。                        boolean ST_Touches( raster rastA , raster rastB );来看一下这个函数的介绍。如果raster RastA在空间上接触raster rastB,则返回TRUE。这意味着Rasta和rastB至少有一个共同点,但它们的内部并不相交。如果未提供波段编号(或设置为空),则在测试中仅考虑栅格的凸包。如果提供了波段编号,则在测试中只考虑那些有值的像素(不考虑NODATA)。

         国家相邻的概念与上述的需求一致,即两个面至少有一个共同点,即认为国家相邻。因此我们就使用这个函数来进行相邻国家的求解。首先基于PgAdmin来进行空间查询的结果展示。查询语句如下所示,这里以欧洲国家德国为例:

SELECTpk_id,short_english_name,min_english_name,full_chinese_name,continent,geom,st_asgeojson ( geom ) geomJson 
FROMbiz_world_country 
WHEREpk_id = 1843094270664282114 
UNION
SELECTother_c.pk_id,other_c.short_english_name,other_c.min_english_name,other_c.full_chinese_name,other_c.continent,other_c.geom,st_asgeojson ( other_c.geom ) geomJson 
FROMbiz_world_country AS target_cJOIN biz_world_country AS other_c ON ST_Touches ( target_c.geom, other_c.geom ) 
WHEREtarget_c.pk_id = 1843094270664282114

        前面的数据是查询当前国家,后面是查询跟所属国家相邻的国家的信息,包括空间坐标信息。在数据库中运行以上的sql后可以在下面看到执行的数据。

        可以点击空间结果字段可以在PgAdmin中进行空间数据的查看,如下所示:

        当然,您也可以直接在查询客户端中进行数据的查询,但是明显是不够方便的。而且,我们的终端用户更加不方便,需要使用Web的界面来进行操作和查询。因为需要我们基于PostGIS空间数据库来进行相关功能的开发。

二、SpringBoot后台功能设计

        在进行空间业务数据库表的介绍之后,下面来具体介绍如何使用SpringBoot来进行相关的业务实现。这一块其实比较简单,主要是提供后台的检索接口,为前台提供根据国家来查询所有相邻国家的功能。

1、后台查询接口的实现

        为了便于对空间数据库的操作,这里以Mybatis-Plus进行介绍。由于需要使用自定义的SQL查询来实现,因此这里我们需要自定义查询脚本。可以在Mapper接口中进行相关的查询定义。关键代码如下所示:

static final String NEIGHBOR_COUNTRY_BYID = "<script>"+ " SELECT pk_id,short_english_name,min_english_name,full_chinese_name,continent," + " st_asgeojson(geom) geomJson FROM biz_world_country where pk_id = #{id} union "+ " SELECT other_c.pk_id,other_c.short_english_name,other_c.min_english_name, "+ " other_c.full_chinese_name,other_c.continent,st_asgeojson(other_c.geom) geomJson "+ " FROM biz_world_country AS target_c JOIN biz_world_country AS other_c "+ " ON ST_Touches(target_c.geom, other_c.geom) "+ " where target_c.pk_id = #{id} "+ "</script>";
/**
* - 根据国家主键ID查询邻国列表 add by 夜郎ling in 2024-10-31
* @param id 查询国家ID
* @return 该国对应的邻国列表
*/
@Select(NEIGHBOR_COUNTRY_BYID)
List<WorldCountries> findNeighborCountryById(@Param("id")Long id);

2、业务接口设计

        业务层其实非常简单,就是在service中调用mapper层中的方法,即上一节中分享的方法,获取指定国家的邻国信息。这里分享业务接口的实现,业务接口包含两个方法,第一个是跳转到相应的地图界面,另外一个是查询接口。下面给出相应的实现代码:

@RequiresPermissions("eq:nearcountry:map")
@GetMapping("/nearcountry")
public String nearCountry(){return prefix + "/nearcountry";
}@RequiresPermissions("eq:nearcountry:list")
@GetMapping("/nearcountry/list/{id}")
@ResponseBody
public AjaxResult nearCountryList(@PathVariable("id") Long id){List<WorldCountries> countries = wCountryService.findNeighborCountryById(id);return AjaxResult.success().put("data", countries);
}

        以上就是java后台接口的相关实现。在介绍完后台的实现后,接下来看一下如何进行WebGIS界面开发。

三、Leaflet进行WebGIS开发

        本节将重点介绍如何在Leaflet当中如何进行WebGIS开发,根据一个国家查询该国对应的所有邻国,并且将所有国家信息在页面上进行相应的标注。通过这最后一节,将让大家对邻国查询有一个直观的掌握。

1、整体结构介绍

        为了很好的进行国家和邻国展示,需要对国家列表进行展示。这里我们采用sidebar来进行表格展示,同时在列表中支持国家的定位查询,通过点击国家来查找对应国家的所有邻国。整体来说,分为左右结构。表格的初始化代码如下:

function initSidebar(){//初始化sidebar页面var sidebar = L.control.sidebar('sidebar', {position: 'right'}).addTo(mymap);//默认sidebar打开,并展示一个tab页sidebar.open();$("#xz_info").addClass("active");$("#home").addClass("active");//初始化行政区划表格initWorldCountryTable();
}function initWorldCountryTable(){var options = {url: prefix + "/list",createUrl: prefix + "/add",updateUrl: prefix + "/edit/{id}",modalName: "全球国家列表",columns: [{checkbox: true},{field: 'pkId',title: '',visible: false},{field: 'shortChineseName',title: '名称',formatter: function(value, row, index) {return row.shortChineseName + "(" + row.minEnglishName + ")";}},{title: '操作',align: 'center',formatter: function(value, row, index) {var actions = [];actions.push('<a class="btn btn-success btn-xs ' + editFlag + '" href="javascript:void(0)" onclick="previewTown(\'' + row.pkId + '\',\''+row.fullChineseName+'\',\''+row.shortEnglishName+'\')"><i class="fa fa-paper-plane"></i>邻国</a>');return actions.join('');}}]};$.table.init(options);
}

2、相邻国家展示可视化

        当选择一个国家之后,会将国家的数据库编号进行空间查询,调用空间函数来进行查询。将相邻的国家查询出来,查询的结果是一个列表,因此我们需要使用list来进行循环获取。

function previewTown(gid,cnName,enName){$.ajax({  type:"get",  url:prefix + "/nearcountry/list/" + gid,  data:{},  dataType:"json",  cache:false,processData:false,success:function(result){if(result.code == web_status.SUCCESS){showLayerGroup.clearLayers();for(var i = 0;i< result.data.length;i++){var countryData = result.data[i];var color = gid == countryData.pkId ? "" : getRandomColor();var ccolor = gid == countryData.pkId ? "red" : color;var areaLayer = L.geoJSON(JSON.parse(countryData.geomJson),{style: {color:ccolor,weight:6,"opacity":0.85}}).addTo(mymap);var myIcon = L.divIcon({iconSize: null,className: '',popupAnchor:[5,5],shadowAnchor:[5,5],html: "<div class='marsBlackPanel' style='background:" + color + ";' animation-spaceInDown><div class='marsBlackPanel-text'>" + countryData.fullChineseName+"<span class='temperature'></span></div><div class='marsBlackPanel-text'>"+countryData.shortEnglishName+"<span class='temperature'></span></div></div>"});showLayerGroup.addLayer(areaLayer);//中心点位L.marker(areaLayer.getBounds().getCenter(), { icon: myIcon}).addTo(showLayerGroup);}mymap.fitBounds(showLayerGroup.getBounds());}},error:function(){$.modal.alertWarning("获取空间信息失败");}});
}

        从以上代码中可以看到,我们使用for循环来进行国家和空间信息的展示。请注意在上述的代码中,有一个生成随机颜色的方法,代码如下:

function getRandomColor() {var letters = '0123456789ABCDEF';var color = '#';for (var i = 0; i < 6; i++) {color += letters[Math.floor(Math.random() * 16)];}return color;
}

        到这里,基本我们就完成了所有的如何进行邻国和邻国空间查询求解的过程。从最开始的空间数据库的基础查询、到springboot后台计算、到leaflet的前端生成。下面我们来看一下实际的效果。

四、成果展示

        经过了前面的编码环节,我们基本掌握了如何进行国家的展示以及如何进行空间相邻的求解。最后我们来看一下实际的效果,结合一些实际的国家信息和邻国信息来进行深入介绍。

1、印度及其邻国

        首先来看看我们的邻居,印度。印度位于印度洋,是亚洲一个国家。看看它有哪些邻国呢?首先来看一下其自身空间位置及邻国信息,如下图所示:

        通过上图可知,与印度相邻的国家有缅甸、中国、孟加拉国、不丹、尼泊尔、巴基斯坦。印度不仅与我国有边界争端,与巴基斯坦同样有争端问题。克什米尔一直是两国一道难以逾越的坎。我国与印度的领土争端也有,最近双方后撤,希望是好消息。

2、乌克兰及其邻国

        俄乌战争一直在持续,当然这里无异于对战争进行评论,这里仅对乌克兰及其邻国进行相关的介绍。也让大家对使用gis的视角来对空间冲突有所了解。乌克兰是欧洲国家,是这两年的战争焦点。下面随着WebGIS来看一下乌克兰的位置和其邻国信息吧。

        可以看到,与乌克兰相邻的国家有俄罗斯、白俄罗斯 、摩尔多瓦、匈牙利、波兰、斯洛伐克。

3、中东小霸王及其邻国

        再来看一个最近经常上榜而且很热闹的地区和国家。这个国家就是我们熟悉的中东小霸王,以色列。那是一言不合就开干,最近经常上新闻榜。这里来看一些它的区位和邻国信息。

        可以看到,以色列周边都是阿拉伯国家,比如埃及、约旦、黎巴嫩、叙利亚。最近、黎巴嫩和以色列的冲突一直持续。

五、总结

        以上就是本文的主要内容,本文以SpringBoot框架和PostGIS空间数据库为例,重点讲解如何实现一个国家的邻国查询以及WebGIS可视化应用的实现。文章首先讲解如何在PostGIS数据中进行空间相邻的求解,然后讲解使用Java来开发相应的查询接口,接着介绍在Leaflet当中进行数据的WebGIS展示,最后围绕一些国家及其邻国空间展示为大家做重点的介绍。地图会将故事,通过本文,不仅可以学习如何在SpringBoot中进行GIS的应用开发,而且通过WebGIS来展示我们的地球。行文仓促,定有许多不足支持,如有不足,还恳请各位专家朋友在评论区留下真知灼见,不胜感激。

        站在巨人的肩膀上,更能看得高,看得远。博文编写过程中参考以下文献,在此表示感谢:

1、RT_ST_Touches介绍。

2、【PostGIS入门】三、空间关系与空间连接。

相关文章:

基于SpringBoot和PostGIS的世界各国邻国可视化实践

目录 前言 一、空间数据查询基础 1、空间数据库基础 2、空间相邻查询 二、SpringBoot后台功能设计 1、后台查询接口的实现 2、业务接口设计 三、Leaflet进行WebGIS开发 1、整体结构介绍 2、相邻国家展示可视化 四、成果展示 1、印度及其邻国 2、乌克兰及其邻国 3、…...

Halcon相机外参自理解

外参描述了相机在世界坐标系中的位置和朝向&#xff0c;即它将世界坐标转换为相机坐标的几何变换。具体来说&#xff0c;外参包括一个 旋转矩阵 R R R 和一个 平移向量 t t t&#xff0c;它们共同构成了将世界坐标变换到相机坐标系的刚体变换 相机标定的Pose0代表了相机在外界…...

C#语言入门:从基础到进阶

C#&#xff08;发音为"C sharp"&#xff09;是微软公司推出的一种面向对象的编程语言&#xff0c;它由Anders Hejlsberg和他的团队在.NET框架下开发。C#语言结合了C和Java的特性&#xff0c;并添加了新的功能&#xff0c;使其成为当今最流行的编程语言之一。 C#的特…...

网络爬虫的定义

网络爬虫&#xff0c;即Web Spider&#xff0c;是一个很形象的名字。 把互联网比喻成一个蜘蛛网&#xff0c;那么Spider就是在网上爬来爬去的蜘蛛。 网络蜘蛛是通过网页的链接地址来寻找网页的。 从网站某一个页面&#xff08;通常是首页&#xff09;开始&#xff0c;读取网页…...

一个月调研分析标的“英伟达”

放在现在依然成立 一、移动网兴起至今的最佳股票与人工智能时代的目标 9 年移动网兴起至今&#xff0c;若选一只股票长期持有&#xff0c;最佳解是 ARM&#xff08;涨了 20 倍&#xff09;&#xff0c;因为无论系统层和应用层谁胜出&#xff0c;底层一定是芯片&#xff0c;而…...

Spring Boot 与 EasyExcel 携手:复杂 Excel 表格高效导入导出实战

数据的并行导出与压缩下载&#xff1a;EasyExcel&#xff1a;实现大规模数据的并行导出与压缩下载 构建高效排队导出&#xff1a;解决多人同时导出Excel导致的服务器崩溃 SpringBoot集成EasyExcel 3.x&#xff1a; 前言 在企业级应用开发中&#xff0c;常常需要处理复杂的 …...

什么是严肃游戏,严肃游戏本地化的特点是什么?

“严肃游戏”是一种交互式数字体验&#xff0c;不仅用于娱乐&#xff0c;还用于教育、培训或解决问题。与主要关注乐趣和参与度的传统游戏不同&#xff0c;严肃游戏的目标不仅仅是娱乐&#xff0c;比如教授特定技能、模拟现实生活场景或提高对重要问题的认识。它们用于医疗保健…...

ceph补充介绍

SDS-ceph ceph介绍 crushmap 1、crush算法通过计算数据存储位置来确定如何存储和检索&#xff0c;授权客户端直接连接osd 2、对象通过算法被切分成数据片&#xff0c;分布在不同的osd上 3、提供很多种的bucket&#xff0c;最小的节点是osd # 结构 osd (or device) host #主…...

2024/11/1 408 20题

b d c c a b d c c...

Python相关类库使用问题

文章目录 前言 一、pandas是什么&#xff1f; 二、使用步骤 1.引入库 2.读入数据 总结 前言 在工作中不时遇到新的需求&#xff0c;需要用到新的类库&#xff0c;以此篇专门记录Python类库使用过程中遇到的问题与解决 一、Python是什么&#xff1f; Python是一种高级编…...

ESP32/ESP8266开发板单向一对多ESP-NOW无线通信

ESP32/ESP8266开发板单向一对多ESP-NOW无线通信 简介读取ESP32/ESP8266接收方Receiver的MAC地址ESP32/ESP8266发送方Sender程序ESP32/ESP8266接收方Receiver程序ESP-NOW通信验证总结 简介 本实验通过ESP-NOW无线通信协议实现多个ESP32/ESP 8266开发板向ESP32开发板发送数据。例…...

动态规划-回文串问题——5.最长回文子串

1.题目解析 题目来源&#xff1a;5.最长回文子串——力扣 测试用例 2.算法原理 1.状态表示 判断回文子串需要知道该回文子串的首尾下标&#xff0c;所以需要一个二维数组且数据类型为bool类型来存储每个子字符串是否为回文子串&#xff0c; 即dp[i][j]:以第i个位置为起始&a…...

rtp协议:rtcp包发送和接收规则和报告!

RTCP Packet Send and Receive Rules&#xff1a; 发送和接收 RTCP 包的规则在此列出。允许在多播环境或多点单播环境中运行的实现必须满足第 6.2 节中的要求。这样的实现可以使用本节定义的算法来满足这些要求&#xff0c;或者可以使用其他算法&#xff0c;只要其性能等同或更…...

label数据(或自定义数据集)转imagenet(用于mmclassification)

理论上用于分类的图像一般都不需要用labelme来标注的&#xff0c;笔者是因为刚好手上有这么一组数据&#xff0c;所以就顺带处理了。labelme标注完的数据每张还包含了一个json文件&#xff0c;这个在分类任务中用不上。具体的mmclassification使用方法在我的另一篇文章里有&…...

WebMvcConfigurer

WebMvcConfigurer是Spring MVC框架中的一个核心接口&#xff0c;它允许开发者自定义Spring MVC的配置&#xff0c;以满足应用程序的特定需求。通过实现这个接口&#xff0c;开发者可以注册拦截器、添加视图控制器、配置视图解析器等&#xff0c;而无需使用XML配置。以下是对Web…...

Sigrity Power SI VR noise Metrics check模式如何进行电源噪声耦合分析操作指导

SSigrity Power SI VR noise Metrics check模式如何进行电源噪声耦合分析操作指导 Sigrity Power SI的VR noise Metrics check模式本质上是用来评估和观测器件的电源网络的耦合对于信号的影响,输出S参数以及列出具体的贡献值。 以下图为例...

Python+Appium+Pytest+Allure自动化测试框架-安装篇

文章目录 安装安装ADT安装NodeJs安装python安装appium安装Appium Server&#xff08;可选&#xff09;安装Appium-Inspector&#xff08;可选&#xff09;安装allure安装pytest PythonAppiumPytestAllure框架的安装 Appium是一个开源工具&#xff0c;是跨平台的&#xff0c;用于…...

Python的socket使用

在 Python 中&#xff0c;可以使用 socket 模块编写一个支持多个客户端连接的服务端。常见的实现方式包括使用多线程、多进程或异步 I/O。下面以多线程为例展示如何编写一个服务端&#xff0c;来同时接收和处理多个客户端的连接。 多线程服务端代码示例 这个示例服务端代码中…...

如何快速搭建一个3D虚拟展厅?

随着元宇宙概念的兴起&#xff0c;一个全新的虚拟、立体数字空间正逐步成为我们生活的一部分。在这个空间里&#xff0c;用户可以沉浸其中&#xff0c;进行丰富的交互操作&#xff0c;体验前所未有的无限可能。而如何快速搭建一个属于自己的元宇宙3D虚拟展厅&#xff0c;正成为…...

Android webview 打开本地H5项目(Cocos游戏以及Unity游戏)

webview打开本地Html文件 1.在路径前面加上file:// String filePath"file://"path;webView.loadUrl( filePath);2.打开权限 <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE" />3.启用JavaScript 设置本地访问权限 webVi…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

HTML 列表、表格、表单

1 列表标签 作用&#xff1a;布局内容排列整齐的区域 列表分类&#xff1a;无序列表、有序列表、定义列表。 例如&#xff1a; 1.1 无序列表 标签&#xff1a;ul 嵌套 li&#xff0c;ul是无序列表&#xff0c;li是列表条目。 注意事项&#xff1a; ul 标签里面只能包裹 li…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

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…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...