基于 Vue3 + ECharts + GeoJson 实现区域地图钻取功能详解
文章目录
- 前言
- 一、实现步骤
- 1. 项目初始化
- 2. 准备GeoJson数据
- 3. 创建地图组件
- 4. 创建主页面组件
- 5. 使用组件
- 二、功能亮点
- 三、性能优化建议
- 四、常见问题解决
- 五、结语
- 六、实战demo
- 七、资源下载
前言
在数据可视化领域,地图展示是一种非常直观的表现形式。而地图钻取(Drill-down)功能可以让用户从宏观到微观逐级查看数据,提供更好的交互体验。本文将详细介绍如何使用 Vue3
、ECharts
和 GeoJson
实现一个完整的区域地图钻取功能。
技术栈介绍
Vue3
:当前最流行的前端框架之一,提供响应式数据和组件化开发体验ECharts
:百度开源的数据可视化库,功能强大,支持多种图表类型GeoJson
:一种用于表示地理空间数据的JSON
格式标准
一、实现步骤
1. 项目初始化
首先创建一个Vue3项目:
npm init vue@latest vue3-echarts-map
cd vue3-echarts-map
npm install
安装必要的依赖:
npm install echarts axios
2. 准备GeoJson数据
地图钻取需要各级行政区划的 GeoJson
数据,可以从以下途径获取:
- 阿里云DataV:https://datav.aliyun.com/portal/school/atlas/area_selector
- GeoJSON:https://geojson.cn/editor?url=https://geojson.cn/api/china/330000.topo.json
- 高德地图API
- 自己制作或从公开数据源获取
在本例中,我们准备了中国地图、省级地图和市级地图三个级别的GeoJson数据。
3. 创建地图组件
创建 MapChart.vue
组件:
<template><div ref="chartRef" style="width: 100%; height: 600px;"></div>
</template><script setup>
import { ref, onMounted, onBeforeUnmount, watch } from 'vue';
import * as echarts from 'echarts';
import axios from 'axios';const props = defineProps({mapData: Object,chartData: Array,mapName: String,drillLevel: Number
});const emit = defineEmits(['drillDown']);const chartRef = ref(null);
let chartInstance = null;// 初始化图表
const initChart = () => {if (!chartRef.value) return;chartInstance = echarts.init(chartRef.value);// 注册地图数据echarts.registerMap(props.mapName, props.mapData);const option = {title: {text: `${props.mapName}地图`,left: 'center'},tooltip: {trigger: 'item',formatter: params => {const data = params.data;return `${params.name}<br/>${data ? `数值: ${data.value}` : ''}`;}},visualMap: {min: 0,max: 100,text: ['高', '低'],realtime: false,calculable: true,inRange: {color: ['#50a3ba', '#eac736', '#d94e5d']}},series: [{name: props.mapName,type: 'map',map: props.mapName,roam: true,emphasis: {label: {show: true}},data: props.chartData,selectedMode: 'single'}]};chartInstance.setOption(option);// 绑定点击事件实现钻取chartInstance.on('click', params => {if (props.drillLevel < 2) { // 限制钻取层级emit('drillDown', params.name);}});
};// 响应数据变化
watch(() => [props.mapData, props.chartData], () => {if (chartInstance) {initChart();}
});onMounted(() => {initChart();window.addEventListener('resize', resizeChart);
});onBeforeUnmount(() => {if (chartInstance) {chartInstance.dispose();chartInstance = null;}window.removeEventListener('resize', resizeChart);
});const resizeChart = () => {if (chartInstance) {chartInstance.resize();}
};
</script>
4. 创建主页面组件
创建 MapDrillDown.vue
作为主页面:
<template><div class="map-container"><div class="breadcrumb"><span v-for="(item, index) in breadcrumb" :key="index"@click="handleBreadcrumbClick(index)":class="{ 'active': index === breadcrumb.length - 1 }">{{ item }} {{ index < breadcrumb.length - 1 ? '>' : '' }}</span></div><button v-if="currentLevel > 0" @click="drillUp" class="drill-btn">返回上级</button><MapChart:mapData="currentMapData":chartData="currentChartData":mapName="currentMapName":drillLevel="currentLevel"@drillDown="handleDrillDown"/></div>
</template><script setup>
import { ref, onMounted } from 'vue';
import axios from 'axios';
import MapChart from './MapChart.vue';// 当前级别:0-全国,1-省级,2-市级
const currentLevel = ref(0);
const currentMapData = ref(null);
const currentChartData = ref([]);
const currentMapName = ref('中国');
const breadcrumb = ref(['中国']);// 模拟数据 - 实际项目中可以从API获取
const mockData = {china: [{ name: '广东省', value: 83 },{ name: '浙江省', value: 67 },{ name: '江苏省', value: 72 },// 其他省份数据...],guangdong: [{ name: '广州市', value: 95 },{ name: '深圳市', value: 89 },{ name: '珠海市', value: 78 },// 其他城市数据...],zhejiang: [{ name: '杭州市', value: 88 },{ name: '宁波市', value: 76 },{ name: '温州市', value: 65 },// 其他城市数据...]
};// 加载GeoJson数据
const loadGeoJson = async (name) => {try {// 实际项目中这里应该是从服务器获取GeoJson// const res = await axios.get(`/geojson/${name}.json`);// return res.data;// 这里使用模拟的GeoJson路径let geoJsonPath = '';if (name === '中国') {geoJsonPath = '/geojson/china.json';} else if (['广东省', '浙江省'].includes(name)) {geoJsonPath = `/geojson/${name}.json`;}if (geoJsonPath) {const res = await axios.get(geoJsonPath);return res.data;}return null;} catch (error) {console.error('加载GeoJson失败:', error);return null;}
};// 初始化全国地图
const initChinaMap = async () => {currentLevel.value = 0;currentMapName.value = '中国';breadcrumb.value = ['中国'];const geoJson = await loadGeoJson('中国');if (geoJson) {currentMapData.value = geoJson;currentChartData.value = mockData.china;}
};// 向下钻取
const handleDrillDown = async (name) => {if (currentLevel.value === 0) {// 从全国钻取到省份const geoJson = await loadGeoJson(name);if (geoJson) {currentLevel.value = 1;currentMapName.value = name;breadcrumb.value = ['中国', name];currentMapData.value = geoJson;currentChartData.value = mockData[name.toLowerCase()] || [];}} else if (currentLevel.value === 1) {// 从省份钻取到城市const cityData = mockData[currentMapName.value.toLowerCase()];const city = cityData.find(item => item.name === name);if (city) {currentLevel.value = 2;breadcrumb.value = ['中国', currentMapName.value, name];// 这里可以继续加载更详细的GeoJson数据}}
};// 向上钻取
const drillUp = () => {if (currentLevel.value === 1) {initChinaMap();} else if (currentLevel.value === 2) {const provinceName = breadcrumb.value[1];handleDrillDown(provinceName);}
};// 面包屑导航点击
const handleBreadcrumbClick = (index) => {if (index === 0 && currentLevel.value !== 0) {initChinaMap();} else if (index === 1 && currentLevel.value === 2) {const provinceName = breadcrumb.value[1];handleDrillDown(provinceName);}
};onMounted(() => {initChinaMap();
});
</script><style scoped>
.map-container {position: relative;width: 100%;height: 100%;
}.breadcrumb {margin-bottom: 15px;font-size: 16px;
}.breadcrumb span {cursor: pointer;margin: 0 5px;color: #666;
}.breadcrumb span.active {color: #333;font-weight: bold;
}.breadcrumb span:hover {text-decoration: underline;
}.drill-btn {position: absolute;top: 10px;right: 10px;z-index: 100;padding: 5px 10px;background-color: #409eff;color: white;border: none;border-radius: 4px;cursor: pointer;
}.drill-btn:hover {background-color: #66b1ff;
}
</style>
5. 使用组件
在App.vue中使用我们的地图组件:
<template><div id="app"><h1>区域地图钻取示例</h1><MapDrillDown /></div>
</template><script setup>
import MapDrillDown from './components/MapDrillDown.vue';
</script><style>
#app {font-family: Avenir, Helvetica, Arial, sans-serif;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;text-align: center;color: #2c3e50;margin-top: 20px;padding: 20px;
}
</style>
二、功能亮点
- 多级钻取:支持从全国地图钻取到省级,再钻取到市级
- 面包屑导航:清晰的层级导航,可以快速返回上级
- 响应式设计:图表随窗口大小自动调整
- 视觉效果:使用渐变色表示数据强度
- 交互体验:鼠标悬停显示详细信息,点击实现钻取
三、性能优化建议
- GeoJson数据精简:使用简化后的
GeoJson
数据减少体积 - 数据缓存:对已加载的
GeoJson
数据进行缓存 - 按需加载:只在需要时加载下一级地图数据
- 防抖处理:对窗口
resize
事件添加防抖 - Web Worker:大数据量处理可以使用
Web Worker
四、常见问题解决
-
地图显示不完整:
- 检查
GeoJson
数据是否完整 - 确保
ECharts
正确注册了地图数据 - 确认地图名称与注册名称一致
- 检查
-
钻取后数据不显示:
- 检查
mock
数据中是否有对应区域的数据 - 确认数据格式是否符合
ECharts
要求 - 查看控制台是否有错误信息
- 检查
-
地图渲染性能问题:
- 简化
GeoJson
数据 - 使用
ECharts
的large
模式 - 考虑使用
Canvas
渲染代替SVG
- 简化
五、结语
通过本文的介绍,我们实现了一个基于 Vue3
、ECharts
和 GeoJson
的区域地图钻取功能。这种技术可以广泛应用于各种需要地理数据展示的场景,如商业分析、疫情监控、物流管理等。希望本文能对你的项目开发有所帮助。
六、实战demo
集成到界面设计引擎,体验地址:https://www.nbweixin.cn/autopage/
从左边拖动一个区域地图组件即可查看效果。
七、资源下载
🔗全国地图geojson包 :https://download.csdn.net/download/mss359681091/90657356?spm=1001.2014.3001.5501
🔗完整demo:https://download.csdn.net/download/mss359681091/90657456?spm=1001.2014.3001.5501
相关文章:
基于 Vue3 + ECharts + GeoJson 实现区域地图钻取功能详解
文章目录 前言一、实现步骤1. 项目初始化2. 准备GeoJson数据3. 创建地图组件4. 创建主页面组件5. 使用组件 二、功能亮点三、性能优化建议四、常见问题解决五、结语六、实战demo七、资源下载 前言 在数据可视化领域,地图展示是一种非常直观的表现形式。而地图钻取&…...
算法题(129):二维前缀和
审题: 本题需要我们将q组矩阵的和打印出来 思路: 方法一:二维前缀和 由于本题使用暴力的模拟方法运行次数高达1e11,会超时,所以我们采用运行次数在1e6的二维前缀和来解题 第一步:前缀和的求法 x i…...
NEAT 算法解决 Lunar Lander 问题:从理论到实践
NEAT 算法解决 Lunar Lander 问题:从理论到实践 0. 前言1. 定义环境2. 配置 NEAT3. 解决 Lunar lander 问题小结系列链接0. 前言 在使用 NEAT 解决强化学习问题一节所用的方法只适用于较简单的强化学习 (reinforcement learning, RL) 环境。在更复杂的环境中使用同样的进化解…...
Arduino示例代码讲解:Project 07 - Keyboard 键盘
Arduino示例代码讲解:Project 07 - Keyboard 键盘 Project 07 - Keyboard 键盘程序功能概述功能:硬件要求:输出:代码结构全局变量`setup()` 函数`loop()` 函数读取电位器值:打印电位器值:播放音调:运行过程注意事项Project 07 - Keyboard 键盘 /*Arduino Starter Kit e…...
4.凸包-Graham Scan
Graham Scan:Algorithm Preprocessing 根据角度进行排序 Graham Scan 例子 例2 Graham Scan:Correctness Left Turn/right Trun 下一个点出现的两种情况:非蓝即绿 Presorting 预排序很重要:否则所有的点都会满足 to-left-test BackTracks算法复杂度 …...
系统架构师2025年论文《论SOA技术的应用》
摘要: 本人于XXXX年XX月参加某市医院《预约挂号系统》的开发工作,在该项目中主要担任系统架构师,主要负责该系统架构和网络安全体系架构设计。经过多年的医院信息化建设,某市医院已经建立了一些应用系统,但是…...
React+TS编写轮播图
当前轮播图存在部分问题,一次循环结束,进入下一次需要点击两次(所以动画效果上点击第二次才出现) 轮播图:实现无限循环轮播图的关键在于"视觉欺骗"——我们在实际数据的前后各添加部分数据副本,当…...
山东大学创新项目实训开发日志(19)之前端知识深度学习
今天晚上在队长的带领下学习了一下前端vue的基础知识 reactive和ref函数 refreactive数据类型原始数据、对象对象操作js中需要添加.value,tamplate中则不用都不用添加.value computed和watch computed 写法 <script setup>const Factorial computed(() &g…...
【C++详解】C++入门(一)
文章目录 一、命名空间命名空间的基本特性命名空间的使用 二、C输入输出用法三、缺省参数(默认参数)定义用法 四、函数重载 一、命名空间 命名空间的基本特性 #include <stdio.h> #include <stdlib.h>int rand 10;int main() {// 编译报错:error C23…...
MAC-从es中抽取数据存入表中怎么实现
使用 Java 从 Elasticsearch 抽取数据并存入数据库表的完整实现方案: 1. Maven 依赖配置 <dependencies><!-- Elasticsearch --><dependency><groupId>org.elasticsearch.client</groupId><artifactId>elasticsearch-rest-high-level-c…...
Android串口通信
最近因为需要在Android平台进行电子秤的开发,首先第一步就是需要解决Android串口通信获取电子秤的称重信息。 google官方给我们提供了现成的解决方案,里面有编译好的apk文件还有源代码可以直接参考使用。地址:http://code.google.com/p/andr…...
QT常见输入类控件及其属性
Line Edit QLineEdit用来表示单行输入框,可以输入一段文本,但是不能换行 核心属性: 核心信号 信号 说明 void cursorPositionChanged(int old,int new) 当鼠标移动时发出此型号,old为先前位置,new为新位置 void …...
RAG 与 MCP 如何以不同方式解决大模型的局限性
Claude 和 GPT-4o 等大型语言模型 (LLM) 功能强大,但也面临两个主要限制:它们包含的知识是时效性的(更具体地说,是在训练时点固定的),并且决定它们一次可以处理多少信息的上下文窗口是有限的。 检索增强生…...
[Windows]_[VS2017]_[如何进行远程调试程序]
场景 在开发Windows程序时,有时候在测试机上测试出异常操作的情况,在开发机上就是出现不了。还比如在测试机上能测试到崩溃的情况,在开发机上也是重现不了,怎么办? 说明 这种情况可能是测试机上的系统版本࿰…...
Retinex系列图像/视频增强算法介绍
Retinex 系列原理基础 一、核心原理与理论 Retinex算法基于人类视觉系统特性,认为观测到的图像由光照分量(L)与反射分量( R )乘积构成,即: S ( x , y ) = L ( x , y...
游戏引擎学习第237天:使用 OpenGL 显示图像
win32_game.cpp: 禁用 PFD_DOUBLEBUFFER 我们正在处理一个新的开发阶段,目标是在使用 OpenGL 渲染的同时能正常通过 OBS 进行直播。昨天我们已经尝试了一整天来解决这个问题,希望能找到一种方式让 OBS 能正确地捕捉到 OpenGL 的窗口画面。虽然我们不确定…...
【C++基本算法】背包问题——完全背包
7. 背包问题——完全背包 文章目录 7. 背包问题——完全背包【模板】完全背包零钱兑换零钱兑换∥完全平方数问题解决注意事项 【模板】完全背包 题目链接: 【模板】完全背包 要点: 完全背包核心逻辑:物品无限次选择,状态转移方…...
Spring 01
今天是2025/0420 19:44 day 21 总路线请移步主页Java大纲相关文章 今天进行Spring 1,2,3 个模块的归纳 最近在忙毕设,更新有点慢,见谅 首先是Spring 的相关内容概括的思维导图 一、核心概念详解 1. IoC容器 1.1 工作原理 // 典型使用示例 Applica…...
小迪第10天http/s数据包
HTTP数据包 浏览器请求&请求头&响应头 浏览器访问流程 请求:用户–>web服务器 (Request) 响应:web服务器–> 用户(Response) 加代理后 请求:用户–>代理–>web服务器 (Request) 响应:web服务器–>代理–> 用户(Response) http GET请求头 http post…...
网络设备基础运维全攻略:华为/思科核心操作与巡检指南
一、设备登录与基础操作体系 1. 安全登录策略与环境准备 (1)登录方式深度解析 协议华为/H3C命令思科命令安全性应用场景Telnettelnet 192.168.1.1telnet 192.168.1.1明文传输本地测试(禁止公网使用)SSHssh -l admin 192.168.1.…...
Jsp技术入门指南【八】利用EL表达式开发无脚本的JSP页面
Jsp技术入门指南【八】利用EL表达式开发无脚本的JSP页面 前言一、什么是EL?二、EL如何访问作用域?2.1 对比传统脚本 vs EL2.2 EL的“自动搜索机制” 三、EL运算规则:什么能相加?什么不能?四、EL如何访问集合和数组&…...
MySQL数据库(基础篇)
一:MySQL的概述 1:MySQL数据库的下载地址 MySQL :: 下载 MySQL 安装程序 2:MySQL的客户端连接方式 1:使用Mysql自带的来连接 2:使用windows自带的命令行来来连接(需要配置path环…...
OpenCV 图像调整指南
OpenCV 提供了多种图像调整功能,以下是常见的视觉图片调整方法: 一、基本调整 1. 调整亮度和对比度 import cv2 import numpy as npdef adjust_brightness_contrast(img, brightness0, contrast0):# 亮度和对比度调整# brightness: -100 到 100 (0 表示…...
云效部署实现Java项目自动化部署图解
前言 记录下使用云效部署Java项目,实现java项目一键化自动化部署。 云效流程说明: 1.云效拉取最新git代码后 2.进行maven编译打包后,上传到指定服务器目录 3.通过shell脚本,先kill java项目后,通过java -jar 启动项…...
17.Chromium指纹浏览器开发教程之设备内存和处理器指纹定制
设备内存指纹定制 在 JavaScript 中,可以使用 navigator.deviceMemory 来获取设备的内存信息。它返回一个表示设备的内存大小(以 GB 为单位)的浮点数。具体代码如下: if (navigator.deviceMemory) {// 获取设备内存信息const de…...
遇到QT进程启动失败。被调用的程序丢失,或者您可能没有足够的权限来调用该程序。
【完整错误】16:43:40: The process failed to start. Either the invoked program "/home/xiaojin/QT_code/QT_TCP_CLIENT/build/Desktop_Qt_5_15_0_GCC_64bit-Debug/QT_TCP_CLIENT" is missing, or you may have insufficient permissions to invoke the program. …...
大数据可能出现的bug之flume
一、vi /software/flume/conf/dir_to_logger.conf配置文件 问题的关键: Dir的D写成了小写 另一个终端里面的东西一直在监听状态下无法显示 原来是vi /software/flume/conf/dir_to_logger.conf里面的配置文件写错了 所以说不是没有source参数的第三行的原因 跟这个没关系 …...
32-工艺品商城小程序
技术: 基于 B/S 架构 SpringBootMySQLvueelementuiuniapp 环境: Idea mysql maven jdk1.8 node 可修改为其他类型商城 用户端功能 1.系统首页展示轮播图及工艺品列表 2.分类模块:展示产品的分类类型 3.购物车:进行商品多选结算 或者批量管理操作 4.…...
Kubernetes控制平面组件:调度器Scheduler(一)
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
HTTP:十.cookie机制
Cookie概念及类型 HTTP cookie,简称cookie,又称数码存根、“网站/浏览+魔饼/魔片”等,是浏览网站时由网络服务器创建并由网页浏览器存放在用户计算机或其他设备的小文本文件。Cookie使Web服务器能在用户的设备存储状态信息(如添加到在线商店购物车中的商品)或跟踪用户…...
go语言对http协议的支持
http:无状态协议,是互联网中使用http使用http实现计算机和计算机之间的请求和响应 使用纯文本方式发送和接受协议数据,不需要借助专门工具进行分析就知道协议中的数据 服务器端的几个概念 Request:用户请求的信息,用…...
Origin将双Y轴柱状图升级为双向分组柱状图
当变量同时存在两个数值时的可视化时,往往会想到用双Y轴柱状图来表达我们的数据。 双Y轴柱状图是一种在同一图表中使用左右两个Y轴的可视化形式,常用于展示两组量纲不同或数值范围差异较大的数据。 双向分组柱状图是一种结合了双向柱状图和分组柱状图的…...
FileZilla“服务器发回了不可路由的地址,使用服务器地址代替
问题:在宝塔创建的FTP无法使用,提示“服务器回应不可路由的地址。使用服务器地址代替 第一种解决办法:由于宝塔把FTP被动模式端口范围设置成了39000-40000,所以只需要把阿里云服务器上相应的端口范围开放即可。 第二种解决办法&am…...
Linux中服务器时间同步
简单介绍 在 redhat 8 之前,时间同步服务是使用 NTP(网络时间协议)来实现的,在 redhat 8 及之 后使用是 NTP 的实现工具 chrony 来实现时间同步。 在 redhat 8 及之后,默认情况下已经安装好 chrony 软件并已经开机启…...
gbase8s之线程状态详解(超值)
--mutex wait nsf.0lock 意味着数据库服务器中的一个线程当前正在等待获取名为 nsf.0lock 的互斥锁 可能的原因和影响: 锁争用 (Lock Contention): 这是最常见的原因。多个线程可能需要频繁访问由 nsf.0lock 保护的共享资源。如果持有锁的线程执行时间过长,或者有太多线…...
Linux学习——Linux进程间通信(IPC)聊天程序实践
Linux学习——Linux进程间通信(IPC)聊天程序实践 一、在阿里云服务器上使用talk程序 Linux系统自带的talk命令可以让两个登录用户进行实时文字聊天: 用户A执行:talk usernameB用户B会收到通知,并需要执行࿱…...
PCA 降维实战:从原理到电信客户流失数据应用
一、简介 在机器学习领域,数据的特征维度往往较高,这不仅会增加计算的复杂度,还可能导致过拟合等问题。主成分分析(Principal Component Analysis,简称 PCA)作为一种经典的降维技术,能够在保留数…...
即插即用模块(1) -MAFM特征融合
(即插即用模块-特征处理部分) 一、(2024) MAFM&MCM 特征融合特征解码 paper:MAGNet: Multi-scale Awareness and Global fusion Network for RGB-D salient object detection 1. 多尺度感知融合模块 (MAFM) 多尺度感知融合模块 (MAFM) 旨在高效融合 RGB 和深度…...
Linux学习——TCP
一.TCP编程API 1.socket函数 1.socket函数 include include int socket(int domain,int type,int protocol); 参数 domain AF_INET AF_INET6 AF_UNIX,AF_LOCAL AF_NETLINK AF_PACKET type SOCK_STREAM: 流式…...
Kubernetes控制平面组件:调度器Scheduler(二)
云原生学习路线导航页(持续更新中) kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计(一)Kubernetes架构原则和对象设计(二)Kubernetes架构原则和对象设计(三)Kubernetes控…...
数据通信学习笔记之OSPF其他内容2
OSPF 与 BFD 联动 网络上的链路故障或拓扑变化都会导致设备重新进行路由计算,所以缩短路由协议的收敛时间对于提高网络的性能是非常重要的。 OSPF 与 BFD 联动就是将 BFD 和 OSPF 关联起来,一旦与邻居之间的链路出现故障,BFD 对完品以&…...
数据通信学习笔记之OSPF的区域
OSPFArea 用于标识一个 OSPF 的区域 区域是从逻辑上将设备划分为不同的组,每个组用区域号 (Area ID)来标识 OSPF 的区域 ID 是一个 32bit 的非负整数,按点分十进制的形式(与 IPV4 地址的格式一样)呈现,例如 Area0.0.0.1。 为了简便起见&#…...
css3新特性第四章(渐变)
渐变 线性渐变 径向渐变 重复渐变 使用: background-image: xx 渐变 background-image: linear-gradient(red,yellow,green); 公共代码 .box {width: 300px;height: 200px;border: 1px solid black;float: left;margin-left: 30px;margin-top: 30px;text-align:…...
玩机搞机基本常识-------小米OLED屏幕机型怎么设置为永不休眠_手机不息屏_保持亮屏功能 拒绝“烧屏” ?
前面在帮一位粉丝解决小米OLED机型在设置----锁屏下没有永不休眠的问题。在这里,大家要明白为什么有些小米机型有这个设置有的没有的原因。区分OLED 屏幕和 LCD屏幕的不同。从根本上拒绝烧屏问题。 OLED 屏幕的一些优缺点💝💝💝 …...
深拷贝和浅拷贝的区别
浅拷贝: 只复制原对象的基本数据类型字段,拥有相对独立的副本数据,修改时不会影响到原对象的字段值。对于原对象的引用数据类型字段,直接共享原对象字段的引用,修改自己的字段时会同时影响原对象。 深拷贝:…...
RabbitMQ和Seata冲突吗?Seata与Spring中的事务管理冲突吗
1. GlobalTransactional 和 Transactional 是否冲突? 答:不冲突,它们可以协同工作,但作用域不同。 Transactional: 这是 Spring 提供的注解,用于管理单个数据源内的本地事务。在你当前的 register 方法中,…...
[安全实战]逆向工程核心名词详解
逆向工程核心名词详解 一、调试与执行类 1. 断点(Breakpoint) 定义:在代码中设置标记,使程序执行到此处时暂停类型: 普通断点:通过INT3指令实现条件断点:满足特定条件时触发内存断点…...
用键盘实现控制小球上下移动——java的事件控制
本文分享Java的一个有趣小项目,实现用键盘控制小球的移动 涉及java知识点:Swing GUI框架,绘图机制,事件处理,焦点控制 1.编写窗口和面板 (1.)定义面板类 Panel 继承自Java 自带类JPanel (2.)定义窗口类 window 继承…...
AutoSAR从概念到实践系列之MCAL篇(二)——Mcu模块配置及代码详解(上)
欢迎大家学习我的《AutoSAR从概念到实践系列之MCAL篇》系列课程,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦点赞收藏评论+关注走一波!感谢各位的支持! 根据上一篇内容中…...
BEVDet: High-Performance Multi-Camera 3D Object Detection in Bird-Eye-View
背景 在自动驾驶场景下,以往工作是目标检测任务用图像视角做,语义分割用BEV视角做。本文提出了BEVDet,实现了一个统一的框架,它模块化设计分为图像编码器,视角转换器,BEV编码器以及BEV空间的3D检测头。然而…...