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

JSAPIThree 标签使用学习笔记:在地图上添加文字和图标

作为一个刚开始学习 mapvthree 的小白,今天要学习标签功能了!听说这个功能可以在地图上添加文字和图标,用来显示地点名称、数值信息等!想想就实用!

第一次听说标签功能

今天在文档里看到了"标签"这个词,一开始我还以为是 HTML 的标签,结果查了一下才知道,原来这是在地图上显示文字和图标的功能!

文档说标签可以:

  • 展示地点名称
  • 显示数值信息
  • 显示状态提示
  • 添加图标和文字组合

我的理解:简单说就是在地图上"贴标签",就像给地图上的位置加个说明一样!

第一步:发现标签管理器

文档说 engine.rendering.label 就是标签管理器,引擎创建后自动实例化,不需要手动创建。

import * as mapvthree from '@baidumap/mapv-three';const container = document.getElementById('container');
const engine = new mapvthree.Engine(container);// 标签管理器已经自动创建了
console.log(engine.rendering.label);

我的理解engine.rendering.label 适合添加少量的、独立的、需要精确控制的标签,不需要配置数据源。

第二步:添加文字标签

使用 engine.rendering.label.addLabel() 添加标签,最简单的就是添加文字:

import * as mapvthree from '@baidumap/mapv-three';const container = document.getElementById('container');const engine = new mapvthree.Engine(container, {map: {center: [116.404, 39.915],range: 2000,},rendering: {enableAnimationLoop: true,},
});// 添加文字标签
const label = engine.rendering.label.addLabel({text: '北京',position: [116.404, 39.915], // [经度, 纬度]
});

我的发现:地图上出现了文字标签!就几行代码,很简单!

第三步:配置标签样式

可以设置文字大小、颜色、描边等样式:

const label = engine.rendering.label.addLabel({text: '北京',position: [116.404, 39.915],textSize: 16,              // 文字大小(像素)textFillStyle: '#000000',  // 文字颜色textStrokeStyle: '#ff0000', // 文字描边颜色textStrokeWidth: 1,        // 文字描边宽度
});

我的发现:可以自定义文字样式,让标签更清晰、更美观!

第四步:设置文字锚点

通过 textAnchor 控制文字相对于位置点的位置:

// 文字在位置点下方
const label1 = engine.rendering.label.addLabel({text: '北京',position: [116.404, 39.915],textAnchor: 'bottom',
});// 文字在位置点左侧
const label2 = engine.rendering.label.addLabel({text: '上海',position: [121.473, 31.230],textAnchor: 'left',
});

我的理解textAnchor 可以控制文字相对于位置点或图标的位置,适合图标和文字组合使用。

第五步:添加图标标签

使用 mapSrc 设置图标 URL,可以添加纯图标标签:

const iconLabel = engine.rendering.label.addLabel({position: [116.404, 39.915],mapSrc: 'assets/images/marker/library.png',width: 32,   // 图标宽度(像素)height: 32,  // 图标高度(像素)
});

我的发现:可以添加图标标签,适合做 POI 展示!

第六步:图标和文字组合

同时设置 mapSrctext,可以显示图标和文字组合:

const label = engine.rendering.label.addLabel({text: '故宫博物院',position: [116.397, 39.918],mapSrc: 'assets/images/marker/library.png',textSize: 14,textFillStyle: '#000000',textStrokeStyle: '#ff0000',textStrokeWidth: 1,textAnchor: 'left', // 文字在图标左侧width: 24,height: 24,
});

我的发现:可以同时显示图标和文字,看起来更专业!

第七步:开启碰撞检测

设置 collision: true 开启碰撞检测,标签会自动避免重叠:

const label = engine.rendering.label.addLabel({text: '北京',position: [116.404, 39.915],collision: true, // 开启碰撞检测group: 'label', // 可选:碰撞分组
});

我的理解:开启碰撞检测后,标签会自动调整位置避免重叠。可以通过 group 设置碰撞分组,不同分组之间不会碰撞。

第八步:设置标签高度和贴地

通过 position 的第三个参数设置高度(米),通过 flat 控制是否贴地:

// 标签在地面上
const label1 = engine.rendering.label.addLabel({text: '地面',position: [116.404, 39.915, 0],flat: true, // 贴地
});// 标签在空中 100 米
const label2 = engine.rendering.label.addLabel({text: '空中',position: [116.414, 39.925, 100],flat: false, // 不贴地(默认)
});

我的理解flat: true 表示标签始终贴地,不会因视角变化而倾斜;flat: false 标签会跟随视角变化。

第九步:删除标签

addLabel() 返回一个 DataItem 对象,调用 dispose() 可以删除标签:

// 添加标签
const label = engine.rendering.label.addLabel({text: '临时标签',position: [116.404, 39.915],
});// 删除标签
label.dispose();

第十步:完整示例

下面是一个完整的示例,展示不同类型的标签:

import * as mapvthree from '@baidumap/mapv-three';const container = document.getElementById('container');const engine = new mapvthree.Engine(container, {map: {center: [116.402, 39.9145],range: 2000,},rendering: {enableAnimationLoop: true,},
});// 纯文字标签
const textLabel = engine.rendering.label.addLabel({text: '北京',position: [116.404, 39.915],textSize: 16,textFillStyle: '#000000',textStrokeStyle: '#ff0000',textStrokeWidth: 1,collision: true,
});// 图标和文字组合标签
const iconTextLabel = engine.rendering.label.addLabel({text: '故宫博物院',position: [116.397, 39.918],mapSrc: 'assets/images/marker/library.png',textSize: 14,textFillStyle: '#000000',textStrokeStyle: '#ff0000',textStrokeWidth: 1,textAnchor: 'left',width: 24,height: 24,collision: true,
});// 纯图标标签
const iconLabel = engine.rendering.label.addLabel({position: [116.414, 39.925],mapSrc: 'assets/images/marker/library.png',width: 32,height: 32,
});

第十一步:实际应用场景

场景 1:地点标注

const spots = [{ name: '天安门', position: [116.397, 39.909] },{ name: '故宫', position: [116.397, 39.918] },{ name: '天坛', position: [116.407, 39.882] },
];spots.forEach(spot => {engine.rendering.label.addLabel({text: spot.name,position: spot.position,textSize: 14,textFillStyle: '#333333',collision: true,});
});

场景 2:数据展示

const dataPoints = [{ value: 100, position: [116.404, 39.915] },{ value: 200, position: [116.414, 39.925] },
];dataPoints.forEach(point => {engine.rendering.label.addLabel({text: point.value.toString(),position: point.position,textSize: 16,textFillStyle: '#ff0000',textStrokeStyle: '#ffffff',textStrokeWidth: 2,});
});

场景 3:POI 展示

const pois = [{ name: '图书馆', type: 'library', position: [116.404, 39.915] },{ name: '餐厅', type: 'restaurant', position: [116.414, 39.925] },
];const iconMap = {library: 'assets/images/marker/library.png',restaurant: 'assets/images/marker/restaurant.png',
};pois.forEach(poi => {engine.rendering.label.addLabel({text: poi.name,position: poi.position,mapSrc: iconMap[poi.type],textAnchor: 'left',width: 24,height: 24,collision: true,});
});

第十二步:踩过的坑

坑 1:标签不显示

原因:位置坐标格式错误,或没有开启循环渲染。

解决:确保坐标格式是 [经度, 纬度][经度, 纬度, 高度],并开启 enableAnimationLoop

坑 2:图标不显示

原因:图标路径错误或文件不存在。

解决:检查图标路径是否正确。

坑 3:文字样式不生效

原因:属性名写错,如 textSize 写成了 fontSize

解决:使用正确的属性名:textSizetextFillStyletextStrokeStyletextStrokeWidth

坑 4:碰撞检测不工作

原因:没有设置 collision: true

解决:明确设置 collision: true

坑 5:标签位置不对

原因:经纬度顺序写反。

解决:确保坐标格式是 [经度, 纬度, 高度],经度在前。

我的学习总结

经过这一天的学习,我掌握了:

  1. 如何添加标签:通过 engine.rendering.label.addLabel() 添加
  2. 文字标签:设置 text 属性
  3. 图标标签:设置 mapSrc 属性
  4. 组合标签:同时设置 textmapSrc
  5. 标签样式:通过 textSizetextFillStyletextStrokeStyletextStrokeWidth 配置
  6. 文字锚点:通过 textAnchor 控制文字位置
  7. 碰撞检测:通过 collision: true 开启,避免标签重叠
  8. 标签高度:通过 position 的第三个参数设置
  9. 标签贴地:通过 flat 参数控制
  10. 图标大小:通过 widthheight 控制

我的感受:标签功能很实用!虽然参数很多,但是用起来不难。关键是要理解每个参数的作用,然后根据需求合理配置!


学习笔记就到这里啦!作为一个初学者,我觉得标签功能虽然参数很多,但是用起来其实不难。关键是要理解每个参数的作用,然后根据需求合理配置!希望我的笔记能帮到其他初学者!大家一起加油!

http://www.jsqmd.com/news/50069/

相关文章:

  • 2025 美本留学机构十大推荐:双轨赋能冲刺名校,2025-2026 申请季选对机构赢在起点!
  • 为什么企业死盯第一学历?
  • 2025年本安型低速图像处理摄像仪批发厂家权威推荐榜单:矿用本安型低速图像处理摄像仪/矿用本安型显示屏/本安型海思3403主板源头厂家精选
  • 实用指南:【C++】C++11都有什么新特性?
  • 移动端弱网优化专题(十五):字节跳动移动端网络HttpDNS优化实践
  • k8s 容器部署 - 教程
  • STM32F103ZTE6 + W5500编程遇到的问题与解决过程
  • 2025年新疆电线电缆厂家权威推荐榜单:耐火电缆/扁电缆/高温电缆源头厂家精选
  • 深入解析:LLM辅助轻量级MES编排系统低代码开发方案介绍
  • ClickHouse的实践经验
  • 小白建站3天就被爬?10分钟部署免费WAF,护住我的Java学习笔记
  • 2025年质量好的新能源轴专用磨床最新TOP厂家排名
  • 2025 价值流智能时代 ITSM 选型指南:如何让平台成为 IT 服务价值闭环核心引擎?
  • 2025年北京房产分割律师权威推荐榜单:离婚诉讼/继承律师/婚姻诉讼专业律师精选
  • 医疗器械注册公司哪家好?2025年权威机构推荐榜单
  • 超越像素:兰亭妙微揭示,卓越的APP界面设计始于“产品策略”
  • 基于SVM与K-means的图像分割实现
  • 控油好用洗发水牌子盘点!什么洗发水去屑止痒控油又蓬松?9款高口碑必入清单
  • Valgrind内存错误检测工具使用
  • Setup线程组使用注意事项 - BKY007
  • 2025年北京离婚诉讼律师权威推荐榜单:离婚律师/继承律师/房产分割专业律师团队精选
  • 微信原生开发者工具-关于wxml中text标签的坑
  • 2025年北京继承律师权威推荐榜单:房产分割/离婚诉讼/婚姻诉讼专业律师团队精选
  • 丐版 OI 技巧 / 杂项部分总结 + 作者学习笔记
  • OI 常见经典技巧 (遗产)
  • 2025 最新衡阳装修设计公司推荐!家装行业全产业链闭环服务品牌排行榜权威发布,透明化保障与品质之选深度解析
  • 2025年口碑好的铝木实验台厂家推荐及选择指南
  • 2025年知名的中央实验台厂家最新实力排行
  • 27考研数学听谁的课更好?
  • 2025年甘肃广告策划服务商哪家权威