基于SpringBoot和PostGIS的省域“地理难抵点(最纵深处)”检索及可视化实践
目录
前言
1、研究背景
2、研究意义
一、研究目标
1、“地理难抵点”的概念
二、“难抵点”空间检索实现
1、数据获取与处理
2、计算流程
3、难抵点计算
4、WebGIS可视化
三、成果展示
1、华东地区
2、华南地区
3、华中地区
4、华北地区
5、西北地区
6、西南地区
7、东北地区
8、台港澳地区
四、总结
1、研究创新点
2、未来展望
前言
1、研究背景
最近看到一个有趣的内容,就是求解一个Polygon的地理难抵点以及其空间范围。地理难抵点(Pole of Inaccessibility)是指在一个多边形区域内,距离周边边界的最远点。这一概念在地理学、城市规划、资源勘探等领域具有重要意义。例如,在城市规划中,了解一个区域的难抵点有助于评估该区域的可达性和开发潜力;在资源勘探中,难抵点的确定可以帮助确定资源开发的最佳位置。因此,对省域“地理难抵点”的研究具有重要的理论和实践价值。下图是我国上海市、山东省、河南省等6个省的地理难抵点的空间分析结果拼图。
随着地理信息技术的不断发展,地理数据的获取、处理和分析变得更加便捷和高效。SpringBoot和PostGIS作为当前流行的开源技术框架,为地理信息系统的开发和应用提供了强大的支持。SpringBoot是一个开源的Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序。它简化了基于Spring的应用开发,通过提供一系列的“Starters”和自动配置功能,使开发者能够快速搭建和部署应用程序。PostGIS是一个开源的地理信息系统(GIS)扩展,用于PostgreSQL数据库。它允许用户存储、管理、查询和分析地理空间数据,提供了丰富的空间数据类型和函数,支持复杂的地理空间操作,如距离计算、拓扑分析等。
2、研究意义
-
理论意义:通过对省域“地理难抵点”的研究,可以进一步丰富地理学的理论体系,为地理空间分析提供新的视角和方法。难抵点的确定有助于深入理解区域的地理特征和空间结构,为地理学研究提供新的数据支持。
-
实践意义:在城市规划、资源勘探、环境保护等领域,难抵点的确定具有重要的实践价值。例如,在城市规划中,了解一个区域的难抵点有助于评估该区域的可达性和开发潜力,为城市布局和基础设施建设提供科学依据。在资源勘探中,难抵点的确定可以帮助确定资源开发的最佳位置,提高资源利用效率。
-
技术意义:结合SpringBoot和PostGIS技术,可以实现省域“地理难抵点”的高效检索和可视化展示。SpringBoot提供了强大的后端开发框架,PostGIS提供了丰富的地理空间数据处理功能,两者结合可以大大提高地理信息系统的开发效率和性能。通过本研究,可以为地理信息系统的开发和应用提供一种新的技术方案,推动地理信息技术的发展和应用。
本文为省域“地理难抵点”的检索及可视化提供了一种有效的技术方案,具有较高的理论和实践价值。未来,可以进一步优化算法,提高计算效率和准确性;结合更多的地理数据,为地理研究和应用提供更丰富的支持;探索系统的扩展功能,为地理信息系统的开发和应用提供更全面的支持。同时,可以将本研究的技术方案应用于其他地理空间分析任务,推动地理信息技术的发展和应用。通过本文的讲解,您不仅可以了解什么是难抵点,同时掌握如何在PostGIS数据库中求解该难抵点,最后基于Leaflet组件对结果进行可视化。
一、研究目标
本文的目标是基于SpringBoot和PostGIS技术,实现省域“地理难抵点”的高效检索和可视化展示。在正式介绍之前,首先对“地理难抵点”的概念、理论及实践意义进行简单介绍。
1、“地理难抵点”的概念
难抵点(极)这个词听着比较艰涩,但是其英文名称就容易理解的多,即"pole of inaccessibility",指的是对一个多边形而言(可以是凸多边形也可以是凹多边形),存在某个点,在这个点可以画出位于多边形内的半径最大的圆。
难抵极(Pole of Inaccessibility,缩写为PIA、POI),请注意这里的POI与兴趣点是两个不同的概念。难抵点是地理学上指最难到达的位置,通常是指离海岸线最远的点,代表着最大程度的大陆性或海洋性。难抵极并不意味着在物理上难以抵达,而仅仅是一个地理学上的概念,但由于其定义,大多数探险家对其产生兴趣。难抵极通常指离海岸线最远的点,无论往哪个方向前进,与海岸线的最近距离都比难抵极与海岸线的最近距离要短。因此地理难抵极或者点的空间检索问题就转变成求解该面内的最大内切圆的圆点及其范围的事宜。
二、“难抵点”空间检索实现
本节将重点介绍“地理难抵点”的空间数据库检索以及SpringBoot的后后台实现。主要介绍空间数据的获取与处理,空间难抵点的计算流程,其次介绍难抵点的计算过程,最后详细介绍如何基于Leaflet进行WebGIS可视化的展示实现。
1、数据获取与处理
本文主要研究省域的最大纵深地点,因此进行空间计算的数据是省域,在之前的系列博客中,我们已经实现将Shapefile中的省域数据导入到PostGIS空间数据库中。在省域信息表中,包含了编码、名称、类型、Geometry字段信息等。其物理表结构如下所示:
表中的数据例子如下:
2、计算流程
省域最大内切圆求解流程图
如上流程图所示,首先会从PostGIS空间数据库中查询出一个Polygon面数据,然后调用空间查询函数ST_MaximumInscribedCircle()计算出一个最大内切圆对象,从最大内切圆对象中可以获取中心圆的经纬度坐标以及圆的半径(请注意,在空间数据库中,半径的单位跟参考坐标系息息相关,例如4326的参考系的返回单位是度,而3857的参考系是米)。然后在SpringBoot中返回输出的GeoJSON和圆心位置坐标和半径,最后在Leaflet中绘制返回的圆。查询SQL如下:
SELECT T.NAME,( mic ).radius AS radius,st_x ( ( mic ).center ) lon,st_y ( ( mic ).center ) lat,st_asgeojson ( T.geom ) geomJson
FROMbiz_province T,ST_MaximumInscribedCircle ( geom ) AS mic
WHERET.ID = 1733467199265333250;
在Navicat中执行以上sql后,可以得到以下的结果。以下结果表示圆形的位置坐标是东经119.93563966,北纬29.05648878。半径是1.369497度的一个内切圆。
上述就是基于PostGIS数据库的最大内切圆的求解过程。有了这个基础,下一步来讲解如何在SpringBoot中进行相关的计算。
3、难抵点计算
这里主要说明如何基于SpringBoot来进行后台开发,这里给出涉及的相关实体类和后台数据库操作类。关键代码如下:
package com.yelang.project.extend.earthquake.domain;
import java.io.Serializable;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.yelang.framework.handler.PgGeometryTypeHandler;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
@TableName(value = "biz_province", autoResultMap = true)
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString
public class Province implements Serializable {private static final long serialVersionUID = 7710812916753245132L;@TableIdprivate Long id;private String code;private String name;private String type;@TableField(typeHandler = PgGeometryTypeHandler.class)private String geom;@TableField(exist=false)private String geomJson;
}
上面是省份信息实体类,下面是最大内切圆实体类,
package com.yelang.project.extend.earthquake.domain;
import java.math.BigDecimal;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;
/*** - 最大内切圆视图对象,返回圆心中心点的坐标以及圆的半径* @author 夜郎king */
@NoArgsConstructor
@AllArgsConstructor
@Setter
@Getter
@ToString
public class ProvinceInscribedCircleVO extends Province{private static final long serialVersionUID = 4152326858933523374L;private BigDecimal lon = new BigDecimal("0");//经度private BigDecimal lat = new BigDecimal("0");//纬度private BigDecimal radius = new BigDecimal("0");//半径,单位根据坐标系不同而定
}
基于上一节的空间查询的Mapper操作对象关键代码如下:
static final String INSCRIBED_CIRCLE_BYID = "<script>"+ " SELECT t.name,(mic).radius AS radius,st_x((mic).center) lon,st_y((mic).center) lat,st_asgeojson(t.geom) geomJson " + " FROM biz_province t, ST_MaximumInscribedCircle(geom) AS mic where t.id = #{id} "
+ "</script>";
/*** - 根据省份主键ID查询最大内切圆信息 add by 夜郎king in 2025-02-06* @param id 查询省份ID* @return 该国对应的最大内切圆信息即当前空间对象的矢量范围*/@Select(INSCRIBED_CIRCLE_BYID)ProvinceInscribedCircleVO getInscribedCircleById(@Param("id")Long id);
以上就是关键的难抵点的后台计算代码,其它的业务层和控制层代码都比较简单,这里不进行赘述。
4、WebGIS可视化
这里讲述如何对Polygon的最大内切圆进行展示,同时展示省域的GeoJSON信息,其中有一个地方是需要注意的,就是返回的半径单位的问题。对于返回的半径有多种处理方式,我们可以在后台对数据进行处理,也可以在前端对数据进行处理。相对来说,使用后台的处理方式通用性比较强,前端只需要负责进行空间展示即可。这里给出核心的展示源码:
function previewInscribedCircle(gid,name){$.ajax({ type:"get", url:prefix + "/inscribedcircle/" + gid, data:{}, dataType:"json", cache:false,processData:false,success:function(result){if(result.code == web_status.SUCCESS){showLayerGroup.clearLayers();var legendData = new Array();var areaData = result.data;var color = ccolor = getRandomColor();if(gid == areaData.id){color = "red";}var areaLayer = L.geoJSON(JSON.parse(areaData.geomJson),{style: {color:"red",fillColor:"red",weight:3,"opacity":0.35, fillOpacity: 0.35 }}).addTo(mymap);var myIcon = L.divIcon({iconSize: null,className: '',popupAnchor:[5,5],shadowAnchor:[5,5],html: buildShowInfo("#f4a90e",areaData)});showLayerGroup.addLayer(areaLayer);var radius = areaData.radius * 111320; // 半径,单位为米// 在地图上绘制圆var circle = L.circle([areaData.lat, areaData.lon], {color: '#1ab394', // 边框颜色fillColor: '#1ab394', // 填充颜色dashArray:"10,5",//设置虚线样式:每段实线宽10px,间隔5pxfillOpacity: 0.39, // 填充透明度radius: radius // 半径}).addTo(showLayerGroup);//中心点位L.marker([areaData.lat, areaData.lon], { icon: myIcon}).addTo(showLayerGroup);mymap.fitBounds(showLayerGroup.getBounds());}},error:function(){$.modal.alertWarning("获取空间信息失败");}});
}
请注意,在上述的代码中, var radius = areaData.radius * 111320; // 半径,单位为米,这里的11320代表的是一个常量。后台返回的单位是度的情况下才可以这么计算,请各位在实际实践时注意选择。经过以上的几个环节,我们基本完成了对省域空间面的最大内切圆的求解。
三、成果展示
本节将结对我们的所有省份进行地理区域划分,按照传统的七大区域划分分为东北、华北、华中、华南、华东、西北、西南地区,同时将展示这七大区域的所属省份及其最大内切圆的空间信息展示。下面跟随我们的分析成果来看看每个省的最大纵深点大概在哪个位置吧。
1、华东地区(包括山东、江苏、安徽、浙江、福建、上海);
2、华南地区(包括广东、广西、海南);
3、华中地区(包括湖北、湖南、河南、江西);
4、华北地区(包括北京、天津、河北、山西、内蒙古);
5、西北地区(包括宁夏、新疆、青海、陕西、甘肃);
6、西南地区(包括四川、云南、贵州、西藏、重庆);
7、东北地区(包括辽宁、吉林、黑龙江);
8、台港澳地区(包括台湾、香港、澳门).
1、华东地区
序号 | 省份名称 | 纵深点 |
1 | 山东省 | 莱芜区附近,离济南有一定距离 |
2 | 江苏省 | 靖江市附近,离南京有一定距离 |
3 | 安徽省 | 庐江县附近,离合肥有一定距离 |
4 | 浙江省 | 位于金华市附近,离杭州有一定距离 |
5 | 福建省 | 塔前镇附近,离福州有一定距离 |
6 | 上海市 | 闵行区 |
2、华南地区
序号 | 省份名称 | 纵深点 |
1 | 广东省 | 清远市附近,离广州有一定距离 |
2 | 广西壮族自治区 | 来宾市附近,离南宁有一定距离 |
3 | 海南省 | 红毛镇附近,离海口有一定距离 |
3、华中地区
序号 | 省份名称 | 纵深点 |
1 | 河南省 | 颍阳镇附近,离郑州有一定距离 |
2 | 湖北省 | 柴湖镇附近,离武汉有一定距离 |
3 | 湖南省 | 荣华乡附近,离长沙有一定距离 |
4 | 江西省 | 拖船镇附近,离南昌有一定距离 |
4、华北地区
序号 | 省份名称 | 纵深点 |
1 | 北京市 | 延寿镇附近 |
2 | 河北省 | 安国市附近,离石家庄有一定距离 |
3 | 内蒙古自治区 | 牙克石市附近,离呼和浩特很远 |
4 | 山西省 | 位于清徐县附近,离太原有一定距离 |
5 | 天津市 | 西堤头镇附近 |
5、西北地区
序号 | 省份名称 | 纵深点 |
1 | 甘肃省 | 敦煌市附近,距离兰州很远 |
2 | 宁夏回族自治区 | 同心镇附近,离银川有一定距离 |
3 | 青海省 | 离西宁有距离 |
4 | 陕西省 | 位于新场镇附近,离西安有一定距离 |
5 | 新疆维吾尔自治区 | 尉犁县附近,离乌鲁木齐远 |
6、西南地区
序号 | 省份名称 | 纵深点 |
1 | 重庆市 | 璧山区附近 |
2 | 贵州省 | 瓮安县附近,离贵阳有一定距离 |
3 | 四川省 | 康定市附近,离成都有距离 |
4 | 云南省 | 位于新场镇附近,离西安有一定距离 |
5 | 西藏自治区 | 离拉萨远 |
7、东北地区
序号 | 省份名称 | 纵深点 |
1 | 黑龙江省 | 铁力市附近,离哈尔滨有一定距离 |
2 | 吉林省 | 八道河子镇附近,离长春有一定距离 |
3 | 辽宁省 | 鸡冠山乡附近,离沈阳有一定距离 |
8、台港澳地区
四、总结
以上就是本文的主要内容,本文为省域“地理难抵点”的检索及可视化提供了一种有效的技术方案,具有较高的理论和实践价值。未来,可以进一步优化算法,提高计算效率和准确性;结合更多的地理数据,为地理研究和应用提供更丰富的支持;探索系统的扩展功能,为地理信息系统的开发和应用提供更全面的支持。
1、研究创新点
本研究将SpringBoot和PostGIS技术相结合,实现了省域“地理难抵点”的高效检索和可视化展示。这种技术融合为地理信息系统的开发和应用提供了一种新的技术方案,具有较高的创新性和实用性。
2、未来展望
在难抵点计算过程中,通过优化算法和数据库查询,提高了计算效率和准确性。同时,结合实际应用需求,探索了系统的扩展功能,为地理信息系统的开发和应用提供了更全面的支持。行文仓促,难免有许多不足之处,如有不足,在此恳请各位专家博主在评论区不吝留言指出,不胜感激。
只有站在前人的肩膀上才能看得更高更远,本文在编写过程中参考以下内容:
1、难抵点——海岸线两侧的极点。
2、「地图故事」全国各省的难抵点(最纵深处)分别在什么地方?。
相关文章:

基于SpringBoot和PostGIS的省域“地理难抵点(最纵深处)”检索及可视化实践
目录 前言 1、研究背景 2、研究意义 一、研究目标 1、“地理难抵点”的概念 二、“难抵点”空间检索实现 1、数据获取与处理 2、计算流程 3、难抵点计算 4、WebGIS可视化 三、成果展示 1、华东地区 2、华南地区 3、华中地区 4、华北地区 5、西北地区 6、西南地…...
MySQL InnoDB引擎 MVCC
MVCC(Multi-Version Concurrency Control)即多版本并发控制,是 MySQL 的 InnoDB 存储引擎实现并发控制的一种重要技术。它在很多情况下避免了加锁操作,从而提高了数据库的并发性能。 一、原理 MVCC 的核心思想是通过保存数据在某…...
服务器使用centos7.9操作系统前需要做的准备工作
文章目录 前言1.操作记录 总结 前言 记录一下centos7.9操作系统的服务器在部署业务服务之前需要做的准备工作。 大家可以复制到自己的编辑器里面,有需求的注释一些步骤。 备注:有条件的项目推荐使用有长期支持的操作系统版本。 1.操作记录 # 更换阿里云…...

【Prometheus】prometheus结合cAdvisor监控docker容器运行状态,并且实现实时告警通知
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...

【Stable Diffusion模型测试】测试ControlNet,没有线稿图?
相信很多小伙伴跟我一样,在测试Stable Diffusion的Lora模型时,ControlNet没有可输入的线稿图,大家的第一反应就是百度搜,但是能从互联网上搜到的高质量线稿图,要么收费,要么质量很差。 现在都什么年代了&a…...
算法刷题-数组系列-卡码网.区间和
题目描述 给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。 示例: 输入: 5 1 2 3 4 5 0 1 1 3 输出: 3 9 要点 本题目以ACM的形式输入输出,与力扣的形式不一样,考察头文件的书写、数据结构的书写、…...
Druid GetConnectionTimeoutException解决方案之一
> Druid版本:v1.2.18 最近项目中经常出现:com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 120000, active 0, maxActive 128, creating 0, createErrorCount 2,但是其他平台连接这个数据源正常的 于是做了一个实验复…...

【JavaScript爬虫记录】记录一下使用JavaScript爬取m4s流视频过程(内含ffmpeg合并)
前言 前段时间发现了一个很喜欢的视频,可惜网站不让下载,简单看了一下视频是被切片成m4s格式的流文件,初步想法是将所有的流文件下载下来然后使用ffmpeg合并成一个完整的mp4,于是写了一段脚本来实现一下,电脑没有配python环境,所以使用JavaScript实现,合并功能需要安装ffmpeg,…...

CSDN2024年度总结|乾坤未定你我皆是黑马|2025一起为了梦想奋斗加油少年!!!
CSDN2024年我的创作纪念日1024天|不忘初心|努力上进|积极向前 一、前言:二、2024个人成长经历:HarmonyOS鸿蒙应用生态构建与扩展——杭州站AGI创新工坊&神经网络大模型——杭州站 三、2024年度创作总结:2024创作数据总结:博客…...

【前端】 react项目使用bootstrap、useRef和useState之间的区别和应用
一、场景描述 我想写一个轮播图的程序,只是把bootstrap里面的轮播图拉过来就用上感觉不是很合适,然后我就想自己写自动轮播,因此,这篇文章里面只是自动轮播的部分,没有按键跟自动轮播的衔接部分。 Ps: 本文用的是函数…...

联想电脑如何进入BIOS?
打开设置 下滑找到更新与安全 点击恢复和立即重新启动 选择疑难解答 选择UEFI固件设置 然后如果有重启点击重启 重启开机时一直点击FNF10进入BIOS界面...
蓝桥杯单片机大模板(西风)
#include <REGX52.H> #include "Key.h" #include "Seg.h" //变量声明区 unsigned char Key_Val,Key_Down,Key_Old;//按键扫描专用变量 unsigned char Key_Slow_Down;//按键减速专用变量 10ms unsigned int Seg_Slow_Down;//按键扫描专用变量 500ms …...

20250213刷机飞凌的OK3588-C_Linux5.10.209+Qt5.15.10_用户资料_R1
20250213刷机飞凌的OK3588-C_Linux5.10.209Qt5.15.10_用户资料_R1 2025/2/13 15:10 缘起:OK3588-C_Linux5.10.66Qt5.15.2的R5都出来了。但是公司一直在R4上面开发的,不想动了。 不过我的原则,只要是有新的系统SDK/BSP放出来,都先在…...

2.13学习记录
web ezSSTI 根据题意,这题考察ssti漏洞,查询有关信息得知这是一种模版攻击漏洞。这种题目可以利用工具进行解决,用焚靖,这是一个针对CTF比赛中Jinja SSTI绕过WAF的全自动脚本 根据教程安装工具和对应的依赖就可以了这个脚本会自…...
【DeepSeek】Deepseek辅组编程-通过卫星轨道计算终端距离、相对速度和多普勒频移
引言 笔者在前面的文章中,介绍了基于卫星轨道参数如何计算终端和卫星的距离,相对速度和多普勒频移。 【一文读懂】卫星轨道的轨道参数(六根数)和位置速度矢量转换及其在终端距离、相对速度和多普勒频移计算中的应用 Matlab程序 …...

JavaEE架构
一.架构选型 1.VM架构 VM架构通常指的是虚拟机(Virtual Machine)的架构。虚拟机是一种软件实现的计算机系统,它模拟了物理计算机的功能,允许在单一物理硬件上运行多个操作系统实例。虚拟机架构主要包括以下几个关键组件ÿ…...
Docker 网络的几种常见类型
目录 Docker 网络类型 桥接网络(Bridge) 通俗解释 特点 使用场景 示例 主机网络(Host) 通俗解释 特点 使用场景 示例 None 网络 通俗解释 特点 使用场景 示例 Overlay 网络 通俗解释 特点 使用场景 示例 Ma…...
C++ 常用的设计模式
1:单例模式:首先能想到的,最为重要的一个设计模式。确保一个类仅有一个实例,提供一个 全局访问点,惯用做法是屏蔽构造数访问(设为private),通过static 权限达到间接访问调用的目的…...

【设计模式】01- 一文理解常用设计模式-“创建型模式”篇
一、前言 最近在复习设计模式,撰写、整理了内容和代码片段,和大家一起交流学习。 设计模式是软件设计中常见问题的典型解决方案。 修改记录 更新内容更新时间第一版 250212 更新了对文章中的模式代码示范的解释250214 二、模式分类 模式可以根据其意图…...

在ArcGIS JS API中使用WebGL实现波纹扩散特效
在现代WebGIS开发中,ArcGIS JS API 是一个非常强大的工具,它允许开发者创建丰富的地理信息应用。结合WebGL技术,我们可以实现更加复杂和炫酷的可视化效果。本文将介绍如何使用ArcGIS JS API结合WebGL实现一个波纹扩散特效。 波纹扩散效果 1 概…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...

Vue3 PC端 UI组件库我更推荐Naive UI
一、Vue3生态现状与UI库选择的重要性 随着Vue3的稳定发布和Composition API的广泛采用,前端开发者面临着UI组件库的重新选择。一个好的UI库不仅能提升开发效率,还能确保项目的长期可维护性。本文将对比三大主流Vue3 UI库(Naive UI、Element …...