尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
高德地图绘制实战:覆盖物、坐标体系与轨迹回放全解析
简介高德地图绘制是一份面向GIS开发、前端工程师及移动应用开发初学者的实例资源围绕高德地图JavaScript API讲解驾车与步行线路的绘制流程涵盖密钥申请、地图初始化、路线规划、Polyline绘制以及Marker标注等核心环节。压缩包共0个文件压缩包大小约12.01MB以代码示例与说明文档为主要内容便于按步骤对照实现基础地图应用也可在此基础上扩展途经点、动态更新与实时路况等高级功能。该资源已有866人浏览学习内容强调从零到一的完整实现思路适合希望快速掌握高德地图路线绘制并理解API调用过程的开发者。1. 高德地图绘制从一张底图到可交互的绘制能力很多人以为“高德地图绘制”就是把地图铺到页面上再往上丢几个点。真正做起来才发现画一条轨迹、圈一块区域、让标记物跟着数据动起来背后牵扯坐标体系、覆盖物生命周期、渲染性能和一整套交互设计。我见过不少团队在地图选型时拍板“就高德了”结果开发到一半卡在绘制层不是线画不出来就是多边形编辑后数据不对最后只能返工。这篇文章想讲的不是高德地图怎么“看”而是怎么“画”——把点、线、面、轨迹、边界这些高频绘制需求拆开讲清楚原理、参数和坑让新手照着能落地让熟手能避开我踩过的雷。这套能力适合谁前端工程师要在地图上做业务标注、轨迹回放、区域选择数据可视化同学要叠加自定义图层后端同学要理解前端提交的坐标数据为什么和自己存的不一样。核心就一句话高德地图绘制不是调一个方法就完事而是从坐标系到覆盖物再到事件交互的一整条链路。2. 高德地图绘制的基础选型JS API 2.0 与覆盖物体系2.1 为什么要用 JS API 2.0而不是继续用 1.4高德地图 Web 端能力目前常见的是 JS API 1.4 和 2.0 两个版本。虽然 1.4 稳定且资料多但新项目我一般建议直接上 2.0。原因有三条。第一是渲染引擎差异。2.0 默认走 WebGL 渲染对 Canvas 的利用更彻底绘制大量 Marker 和 Polygon 时性能明显好于 1.4 的 DOM 拼接方案。某开发者在做一个模拟项目X时用 1.4 绘制 2000 个点拖动地图明显掉帧切到 2.0 后流畅度提升了一个档次。第二是加载方式更现代。1.4 只能通过 script 标签全局引入2.0 支持 npm 包amap/amap-jsapi-loader可以在 Vue 或 React 项目里按需加载避免全局变量污染也方便构建工具统一管理。依赖管理更干净。第三是覆盖物 API 更规范。2.0 对 Marker、Polyline、Polygon 的属性和事件做了收敛方法的命名更一致比如setPath、getPath在 1.4 里行为有差异2.0 里统一了。踩过 1.4 坑的人应该懂同一个方法在不同子版本里参数格式不一致有多头疼。当然 1.4 不是不能用。如果项目维护的是老系统地图能力只是展示几个固定点升级成本大于收益那就继续用。但如果是从零开始直接选 2.0别给自己埋技术债。2.2 覆盖物体系Marker、Polyline、Polygon 的适用边界高德地图绘制核心是覆盖物Overlay它指所有叠加在地图上的可绘制对象。常用的有四类Marker、Polyline、Polygon 和 Circle。Marker 是点标记适合表达“某个位置有什么”。它承载的信息最丰富可以自定义图标、文本、气泡内容还能绑定点击事件。业务里的门店标注、设备定位、车辆当前位置都用 Marker。Polyline 是折线表达“走过的路”或“路径规划”。它适合画轨迹、管线、道路连线。注意 Polyline 也可以设置线型和颜色但没有填充面积的概念。如果你用 Polyline 画了一个闭合形状它不会形成区域。Polygon 是多边形表达“一块区域”。它既可以画规则矩形也能画任意行政边界支持填充色和边框还能绑定鼠标事件。常见的电子围栏、区域热力范围、地块划分用 Polygon。Circle 是圆本质上是 Polygon 的简化版只需要圆心和半径。如果业务里就是“五公里范围内的店”用 Circle 比 Polygon 更高效不需要自己算坐标。选型上的经验是点用 Marker路径用 Polyline区域用 Polygon规则半径用 Circle。不要试图用 Polyline 模拟区域也不要用 Polygon 去画一条不闭合的路径语义错了后面做数据处理会非常别扭。2.3 初始化地图的最小代码与安全密钥配置画任何东西之前得先有一张能加载出来的底图。高德 JS API 2.0 的初始化并不复杂配置正确后十几行代码就能跑通。下面是一个最小可用的初始化写法。// 使用官方提供的 JSAPI Loader 按需加载 import AMapLoader from amap/amap-jsapi-loader; window._AMapSecurityConfig { // 安全密钥由后端代理接口动态获取前端不要硬编码 securityJsCode: your_security_code, }; async function initMap() { const AMap await AMapLoader.load({ key: your_amap_key, // 在高德开放平台申请的 Web 端 key version: 2.0, // 指定版本 plugins: [AMap.MouseTool], // 按需加载绘制插件 }); const map new AMap.Map(mapContainer, { zoom: 12, // 初始缩放级别 center: [116.397428, 39.90923], // 初始中心点注意是经纬度数组 viewMode: 2D, // 2D 或 3D }); return map; }这段代码有三个关键点。key是在高德开放平台申请的属于公共标识但securityJsCode必须由你自己的后端接口下发不能在代码里写死否则容易被盗用。plugins数组按需加载插件这里把AMap.MouseTool显式加载了后面绘制要用。center的坐标格式是[经度, 纬度]这是高德整个 API 的统一约定后面所有路径数据都遵循这个顺序。初始化完成后可以先用一个空的 Marker 验证地图是否真的加载成功。如果地图容器白屏优先检查 key 是否有效、安全密钥是否正确、容器是否有高度这三个问题是地图初始化阶段出现频率最高的具体排查思路在第五章展开。3. 高德地图绘制核心操作点、线、面的绘制与编辑3.1 绘制 Marker 并绑定交互事件Marker 是最简单的覆盖物但业务对它的需求往往不只是“显示”这么简单。实际场景里Marker 要能自定义图标、要能响应点击、要能在数据变化时更新位置。下面是一个带事件的 Marker 创建示例。function addMarker(map, position, info) { const marker new AMap.Marker({ position: position, // 必传经纬度数组 [lng, lat] anchor: bottom-center, // 图标锚点控制图标哪个位置对准坐标 icon: new AMap.Icon({ size: new AMap.Size(30, 30), image: https://example.com/pin.png, imageSize: new AMap.Size(30, 30), }), title: info.name, // 鼠标悬停时的提示 }); marker.on(click, () { // 点击后打开信息窗体 const infoWindow new AMap.InfoWindow({ content: div${info.name}/divdiv${info.address}/div, offset: new AMap.Pixel(0, -30), }); infoWindow.open(map, marker.getPosition()); }); map.add(marker); return marker; }这里容易被忽略的是anchor。Marker 默认锚点在图标中心但很多设计稿里的图标是尖头朝下的比如地图定位针这时锚点应该设成bottom-center否则图标底部和坐标位置永远对不齐缩放到大级别时偏差明显。icon里的size和imageSize如果不一致图标会被拉伸变形这是一个非常隐蔽的显示问题。Marker 的位置更新也是一个高频需求比如车辆移动。不要每次创建新 Marker而是先创建一次之后调用marker.setPosition(newPos)更新位置能显著减少 DOM 操作带来的性能损耗。3.2 用 Polyline 绘制轨迹并设置样式画轨迹是物流、出行、巡检类项目的基本功。Polyline 的核心是path属性它是一个经纬度数组的数组。下面实现一段带箭头的轨迹绘制。// 模拟一段轨迹坐标 const trackPath [ [116.397428, 39.90923], [116.398512, 39.90976], [116.400102, 39.91005], [116.402331, 39.90984], [116.404482, 39.90912], ]; const polyline new AMap.Polyline({ path: trackPath, strokeColor: #3366FF, strokeWeight: 6, strokeOpacity: 0.8, strokeStyle: solid, lineJoin: round, // 拐角样式round 让折线转折处更平滑 lineCap: round, // 端点样式避免端点出现难看的直角 showDir: true, // 显示方向箭头 zIndex: 50, // 控制覆盖物层级防止被其他图形盖住 }); map.add(polyline);轨迹绘制里最容易翻车的是路径点过于密集或过于稀疏。点太密折线会出现锯齿感渲染压力也大点太疏轨迹会切掉弯道看着不像真实路线。常见做法是先对原始 GPS 轨迹做抽稀比如保留间隔 5 米以上的点再交给 Polyline。高德本身也提供了AMap.GeometryUtil.isClockwise这类工具但抽稀要自己处理。另一个细节是zIndex。如果页面同时画了轨迹和区域框不设zIndex时后添加的覆盖物会盖在先添加的上方但某些浏览器下渲染顺序并不稳定。显式设置zIndex是最可靠的方式。3.3 用 Polygon 绘制区域并实现面积计算Polygon 是绘制电子围栏、地块选择的常用覆盖物。它和 Polyline 的语法很像但多了一个“面”的概念。下面是一个带面积计算的多边形示例。const polygon new AMap.Polygon({ path: [ [116.401102, 39.90784], [116.405482, 39.90712], [116.408331, 39.90984], [116.404482, 39.91112], ], fillColor: #ff8800, fillOpacity: 0.35, strokeColor: #bb4400, strokeWeight: 2, }); map.add(polygon); // 在鼠标绘制完成后计算面积 polygon.on(mouseover, () { const area AMap.GeometryUtil.ringArea( polygon.getPath() ); console.log(多边形面积平方米:, area); });AMap.GeometryUtil.ringArea返回的是平方米如果要展示“亩”或“公顷”需要自己换算。注意这个方法要求传入的路径是闭合的而polygon.getPath()返回的路径首尾坐标可能并不完全相等但高德内部会按闭合形状处理直接传入即可。如果业务里需要让用户手动画区域可以结合AMap.MouseTool的polygon模式。用户画完后通过监听draw事件拿到完整的路径数据再存入后端。const mouseTool new AMap.MouseTool(map); mouseTool.polygon({ fillColor: #00baff, strokeColor: #0086d1, }); mouseTool.on(draw, (event) { const drawnPath event.obj.getPath(); map.remove(event.obj); // 画完先移除临时图形 // 将 drawnPath 转成 JSON 存储或做后续编辑 console.log(JSON.stringify(drawnPath)); });这里要注意一个常见误用mouseTool.on(draw)拿到的event.obj是绘制完成的覆盖物对象如果你直接把它留在画面上后面用户再画新的会叠加。我一般会在拿到路径数据后立刻把临时绘制的 Polygon 移出地图再由业务层决定是否重新添加一个带正式样式的覆盖物。这样能避免“画一次叠一层”的翻车现场。3.4 开启鼠标绘制工具 mouseTool 的几种姿势AMap.MouseTool是绘制交互的核心插件支持画点、画线、画多边形、画圆、画矩形。它在 2.0 里需要显式在plugins中声明否则new AMap.MouseTool会直接报错。实际项目中用户绘制需求往往需要做模式切换。我维护的某跨平台系统里左侧工具栏有三个按钮画区域、画线、清除。对应的切换逻辑很简单但有一个坑就是MouseTool一旦开启绘制模式地图的拖拽和缩放会被屏蔽。如果用户中途想移动地图必须手动关闭绘制模式。// 关闭当前绘制模式 mouseTool.close(true); // 参数 true 表示关闭后移除绘制中的临时图形 // 切换到画多边形 mouseTool.polygon(); // 切换到画折线 mouseTool.polyline({ strokeColor: #3366FF, strokeWeight: 4, });close(true)这个参数很容易被忽略。默认关闭时正在画一半的图形会残留在地图上用户再次开启绘制时会被这些半成品干扰。传true后未完成的临时图形会被清理掉。这个小细节能省掉很多交互上的返工。4. 高德地图绘制的进阶场景轨迹回放与行政区域边界4.1 轨迹回放从坐标数组到动画的实现思路轨迹回放是物流运单、外勤打卡、体育轨迹场景的高频需求。核心思路不是让 Polyline 播放而是用一个 Marker 沿着 Polyline 的路径移动同时让视野跟随。高德提供了AMap.Marker的moveAlong方法这比自己用定时器循环设置位置靠谱得多因为动画帧率由地图引擎控制不会因为页面卡顿而跳点。function playTrack(map, trackPath) { const startPoint trackPath[0]; const marker new AMap.Marker({ position: startPoint, icon: new AMap.Icon({ size: new AMap.Size(24, 24), image: https://example.com/car.png, }), }); map.add(marker); map.setFitView([marker]); // 沿轨迹移动速度为 300 公里/小时示意参数按业务调整 marker.moveAlong(trackPath, { duration: 5000, // 毫秒整个轨迹播放时长 autoRotation: true, // 根据路径方向自动旋转图标 }); // 轨迹播放完成事件 marker.on(movealong, () { console.log(轨迹播放完成); }); }duration是整条轨迹的总播放时长。很多开发者会踩的坑是路径点数量不同但希望视觉速度一致那么duration应按路径总长度算而不是固定写死。比如路径总长 2 公里设 10 秒另一条路径总长 20 公里也设 10 秒视觉上速度差十倍非常失真。autoRotation只有当你使用的图标本身有方向性时才需要比如箭头上朝上的车辆图标。如果图标是圆形的点开启旋转反而显得莫名其妙。另外轨迹回放时建议先隐藏轨迹线等播放完成再显示线否则线先画好、点再跑视觉割裂。4.2 行政区域边界利用 DistrictSearch 获取边界坐标有些需求要绘制整个城市的边界比如“某区的数据分布图”。如果你手工收集坐标一是数据不准二是行政边界会随区划调整变化。更稳的方案是利用高德的AMap.DistrictSearch插件获取区域边界坐标再构造 Polygon。function drawDistrict(map, cityName) { const districtSearch new AMap.DistrictSearch({ level: district, // 省级 province、市级 city、区级 district subdistrict: 0, // 不返回下级行政区 extensions: all, // 返回边界坐标 }); districtSearch.search(cityName, (status, result) { if (status complete result.districts.length 0) { const bounds result.districts[0].boundaries; // boundaries 是一个二维数组每个元素代表一块独立区域 // 一个城市可能由多个不相连的面组成如包含岛屿 bounds.forEach((path) { const polygon new AMap.Polygon({ path: path, strokeColor: #0088ff, strokeWeight: 1, fillColor: #0088ff, fillOpacity: 0.15, }); map.add(polygon); }); map.setFitView(); } }); }需要注意boundaries是数组的数组。这一点很容易忽略——中国多数城市的主城区是一块连续区域但一些沿海城市有岛屿或者区划上包含飞地这时返回的就是多条独立边界。如果你只取boundaries[0]画出来的区域会缺一块。我的习惯是先判断boundaries.length如果大于 1就循环全部添加。4.3 海量点绘制点聚合与性能取舍当业务数据量到上万级别直接 add 一万个 Marker 是不现实的。地图渲染扛不住用户交互也会卡顿。常见做法是点聚合Cluster把相邻的点合并成一个聚合标记缩放时再裂开。高德提供AMap.MarkerClusterer插件。import MarkerClusterer from amap/amap-jsapi-loader; // 实际通过 plugins 引入 const clusterer new AMap.MarkerClusterer(map, markersList, { gridSize: 80, // 聚合网格像素大小越小越容易聚合 maxZoom: 18, // 超过该缩放级别不聚合显示原始点 renderClusterMarker: (cluster) { // 自定义聚合点样式 const count cluster.getCount(); const div document.createElement(div); div.className cluster-marker; div.innerHTML count; return div; }, });gridSize是最常用的调节参数。调小聚合更密集远看就是一坨点调大聚合更分散近看会提前裂开。我通常从 80 开始调然后按实际数据分布微调。还有一个经验点聚合只解决渲染数量问题不解决“点到信息”的映射问题。点击聚合点你要自己计算它代表哪些原始数据。一般做法是在renderClusterMarker里把聚合包含的原始点数据绑定到 DOM 上或者用一个 Map 结构在外层维护 clusterId 到原始点的映射。5. 高德地图绘制的避坑与排查五个高频翻车现场5.1 地图容器高度为 0白屏怎么查现象页面加载后地图区域一片空白控制台没有任何报错或者只有一句“container not found”。原因高德地图的 Map 实例会尝试获取传入容器 DOM 的宽高如果 CSS 没有给该元素设置明确的height很多浏览器下计算结果是 0地图渲染不出来。这个问题在前后端分离的项目里尤其常见因为组件挂载时序和 CSS 加载顺序不一致。解决先在 CSS 中给地图容器设置固定高度比如#mapContainer { height: 600px; }确认地图能显示后再改成百分比或视口高度。如果是 Vue/React 组件确保地图初始化代码在 DOM 渲染完成后执行常见做法是在mounted或useEffect里初始化且不要写v-if控制容器显示。5.2 安全密钥配置导致地图加载失败现象AMapLoader.load报错错误信息类似INVALID_USER_KEY或USER_KEY_PLAT_NOMATCH但对照开放平台配置感觉都对。原因JS API 2.0 除了要配置key还必须设置安全密钥。高德官方要求安全密钥不能直接暴露在浏览器端需要由你的后端服务调用接口换取。但很多开发者在本地调试时图省事把securityJsCode直接写在前端代码里或者干脆没配置。解决在全局配置window._AMapSecurityConfig.securityJsCode时确认它来自后端接口。本地调试可以先用后端代理下发不要硬编码在前端仓库里。如果只是临时联调也可以在后端服务里配置高德提供的安全密钥代理方案前端无感知。注意不同域名需要校验前后端环境不一致时会踩这个错。5.3 覆盖物坐标偏移GCJ-02 与 WGS-84 的换算问题现象导入一批设备上报的 GPS 坐标落到高德地图上偏了几百米有的甚至偏移到隔壁街道。原因设备拿到的是 WGS-84 坐标系坐标而高德地图在国内使用 GCJ-02 加密坐标系。两种坐标系之间存在非线性偏移直接拿原始坐标绘制必然不准。这不是高德的 bug而是规范层面的差异。解决在覆盖物传给地图之前完成坐标转换。常见做法是使用系统自带定位时请求高德的定位 SDK它返回的坐标已经是 GCJ-02。如果是三方设备数据需要在前置服务里完成坐标转换再下发到前端。前端也可以引入转换库但转换逻辑放在后端更统一避免多端代码不一致。坐标转换不是一劳永逸的逆转换存在一定精度损耗对精度要求高的场景尽量从源头拿到 GCJ-02 坐标。5.4 绘制轨迹时线段消失或断线现象Polyline 添加后不显示或者显示到一半突然断开移动地图后又恢复。原因最常见的原因是path数据里出现了非法坐标比如null、undefined或越界值。另一个隐藏原因是路径点顺序写反了把[lat, lng]当成了[lng, lat]两三个点的时候可能碰巧显示点多之后轨迹就乱飞或消失。解决在 add 之前先做一次数据清洗。遍历路径数组过滤掉非数字或超出经纬度范围的元素。同时自己定一个打印函数把path的首尾几个点输出肉眼确认纬度在前还是经度在前。还有一个排查技巧用map.setFitView()让地图自动缩放到覆盖物的包围盒如果线确实添加成功视野会跳过去。5.5 聚合点事件丢失点击无反应现象用 MarkerClusterer 聚合后点击聚合点没有任何响应但放大后点击单个 Marker 是正常的。原因聚合点的事件绑定方式和普通 Marker 不一样。MarkerClusterer 生成聚合节点时会替换掉原有 Marker 的 DOM 结构事件监听如果绑定在原始 Marker 上就丢了。解决采用renderClusterMarker返回自定义 DOM 的方式在 DOM 上绑定事件。同时不要用marker.on(click)去监听聚合节点要监听clusterer.on(click)通过cluster.getMarkers()拿到聚合包含的原始 Marker 列表。如果需要展示聚合点的信息比如“范围内共有 35 条记录”可以维护一个 clusterId 到数据的散列表。6. 高德地图绘制的进阶技巧把绘制结果导出成标准数据绘制完成只是第一步真正让地图能力产生价值的是绘制结果能被业务系统消费。我的习惯是所有覆盖物数据统一收敛成 GeoJSON 格式这样不管是存入数据库还是交给后端做空间计算都有标准范式。function overlayToGeoJSON(overlay) { if (overlay instanceof AMap.Marker) { const pos overlay.getPosition(); return { type: Feature, geometry: { type: Point, coordinates: [pos.lng, pos.lat], }, properties: overlay.getExtData(), // 业务数据挂在扩展属性上 }; } if (overlay instanceof AMap.Polygon) { const path overlay.getPath(); return { type: Feature, geometry: { type: Polygon, coordinates: [path.map(p [p.lng, p.lat])], }, properties: overlay.getExtData(), }; } if (overlay instanceof AMap.Polyline) { const path overlay.getPath(); return { type: Feature, geometry: { type: LineString, coordinates: path.map(p [p.lng, p.lat]), }, properties: overlay.getExtData(), }; } return null; }这段代码核心是getPath()和getPosition()的返回值。它们返回的不是普通数组而是包含lng、lat属性的对象转成 GeoJSON 时必须显式取出。另一个小技巧是setExtData它可以在覆盖物上挂任意业务数据比如设备 ID、名称、状态导出时一并带走。很多团队就是漏掉了这一步绘制结果和业务数据对不上后续处理非常痛苦。验证导出的数据是否可用我通常会做一个测试把 GeoJSON 内容丢到任意支持空间数据展示的在线工具里看形状是否和地图上画的一致。如果点、线、面的形状都吻合说明坐标顺序和数据结构没问题。然后用后端接口把这个 GeoJSON 存入数据库再写一个查询接口把数据取出来重新渲染回高德地图。来回一次整个链路的正确性就有保证了。之前接手一个某图像处理Demo的迁移老系统直接把高德覆盖物 path 序列化存库后来要换成别的底图数据全部作废。那次的教训让我养成了统一转 GeoJSON 的习惯。高德绘制只是起点数据和坐标系才是核心资产。希望这个技巧能帮你在绘制之外把数据这层地基也打牢后面换底图、上空间分析都有退路。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

5款AI写论文哪个好?aigcbiye用“真实图表+真实文献”给出了一个不一样的答案

5款AI写论文哪个好?aigcbiye用“真实图表+真实文献”给出了一个不一样的答案

aigcbiye官网:www.aigcbiye.com 微信公众号搜一搜:aigcbiye 先说一个被忽略的事实 2026年,几乎每一款主流AI都能“写出一篇论文”。你输入题目,它输出八千字,结构完整,语言流畅,看起来像模像…

📅 2026/10/15 0:17:26
9款AI写论文哪个好:我用“一个真实写论文的人”的视角,重新排了一遍序

9款AI写论文哪个好:我用“一个真实写论文的人”的视角,重新排了一遍序

aigcbiye官网www.aigcbiye.com 微信公众号搜一搜 aigcbiye 如果你在搜索引擎里敲下“9款AI写论文哪个好”,你会得到什么? 大概率是一堆“亲测”“避坑”“排行榜”。但那些文章有一个共同的毛病:它们评价的是“工具能做什么”&#xff0c…

📅 2026/10/15 0:17:26
评分标准逐条对不上,标书白写?按评分项生成标书的5步实操流程

评分标准逐条对不上,标书白写?按评分项生成标书的5步实操流程

做过投标的人都懂这种憋屈:招标文件三百页,评分标准散落在附件、表格、正文注释里,翻了三遍还是怕漏。方案写了几万字,评委却只盯着评分表打分——评分表里没认的内容,写得再漂亮也不加分。行业调研数据也印证了这点&a…

📅 2026/10/15 0:17:26
MORE NEWS

更多资讯

📰

Qt自适应控件:基于BDU的跨DPI/缩放响应式UI方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

2026论文爆款降AIGC平台大曝光:一键改写直达人工原创!

降AI率的核心技术也在这场博弈中完成了进化。到了2026年,那些只会机械替换同义词的劣质软件早就被淘汰,顶级的降AIGC大模型已经迈入了深度语义重构的新纪元。真正硬核的降AI平台,不仅能顺手把重复率降下来,更牛的是它们能像X光一样…

📰

BiliTools 快速上手:免费 B 站视频下载、弹幕存档与媒体库整理

BiliTools 快速上手:免费 B 站视频下载、弹幕存档与媒体库整理 【免费下载链接】BiliTools 本项目已停止维护。 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools BiliTools 是一款免费开源的 B 站工具箱,在 Windows、macOS 和 Li…

📰

Qt状态机与状态模式:工业UI状态管理实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

[技术讨论] 了解一下EtherCAT模块的竞品设计,想不到也是蛮有意思的事情

之前给客户开发一款定制的EtherCAT模块的时候,客户寄给我们一套相应的另一供应商设计的产品,对于我们而言,称之为竞品,然后好像就是因为这个竞品模块在客户现场时不时就出现EtherCAT网络断开的异常,才找我们来开发和设…

📰

Linux软件安装 —— zookeeper集群安装

文章目录一、节点说明二、下载软件三、安装JDK四、安装zookeeper五、zookeeper基本命令一、节点说明 IP主机名192.168.10.102node02192.168.10.103node03192.168.10.104node04二、下载软件 官网地址:Apache ZooKeeper 本文安装版本为:apache-zookeepe…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬