MapLibre GL JS第52课:显示和样式化富文本标签

📌 学习目标

  • 掌握显示和样式化富文本标签的实现方法
  • 理解相关API的使用
  • 能够独立完成类似功能开发

🎯 核心概念

显示和样式化富文本标签。

💻 完 整 代 码

代码示例

<!DOCTYPE html>
<html lang="en">
<head>
    <title>Display and style rich text labels</title>
    <meta property="og:description" content="使用 format 表达式以英文和当地语言显示国家标签。" />
    <meta property="og:created" content="2023-06-27" />
    <meta charset='utf-8'>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel='stylesheet' href='https://unpkg.com/maplibre-gl@5.24.0/dist/maplibre-gl.css' />
    <script src='https://unpkg.com/maplibre-gl@5.24.0/dist/maplibre-gl.js'></script>
    <style>
        body { margin: 0; padding: 0; }
        html, body, #map { height: 100%; }
    </style>
</head>
<body>
<!-- The lang attribute is read from the map container if present, otherwise from the HTML document -->
<div id="map" lang="zh-HK"></div>
<script>
    maplibregl.setRTLTextPlugin(
        'https://unpkg.com/@mapbox/mapbox-gl-rtl-text@0.3.0/dist/mapbox-gl-rtl-text.js'
    );

    const map = new maplibregl.Map({
        container: 'map', // 容器ID
        style: 'https://tiles.openfreemap.org/styles/bright', // 样式URL
        center: [17.49, 40.01], // 初始位置 [经度, 纬度]
        zoom: 4 // 初始缩放级别
    });

    map.on('load', () => {
        map.setLayoutProperty('label_country', 'text-field', [
            'format',
            ['get', 'name_en'],
            {'font-scale': 1.2},
            '\n',
            {},
            ['get', 'name'],
            {
                'font-scale': 0.8,
                'text-font': [
                    'literal',
                    ['Noto Sans Regular']
                ]
            }
        ]);
    });
</script>
</body>
</html>

🔍 代码解析

初始化地图

使用 new maplibregl.Map() 创建地图实例,配置基本参数。本示例的核心特色是展示如何使用 format 表达式创建富文本标签,同时显示英文和当地语言名称。

加载 RTL 插件

maplibregl.setRTLTextPlugin(
    'https://unpkg.com/@mapbox/mapbox-gl-rtl-text@0.3.0/dist/mapbox-gl-rtl-text.js'
);

关键配置项

  • container: 地图容器的 DOM 元素 ID
  • style: 使用 OpenStreetMap 亮色样式 https://tiles.openfreemap.org/styles/bright
  • center: 地图初始中心点 [17.49, 40.01](巴尔干半岛区域)
  • zoom: 初始缩放级别为 4,显示区域级别视图

format 表达式配置

map.setLayoutProperty('label_country', 'text-field', [
    'format',
    ['get', 'name_en'],      // 第一部分:英文名称
    {'font-scale': 1.2},     // 英文名称样式:放大1.2倍
    '\n',                    // 换行符
    {},                      // 换行符不需要样式
    ['get', 'name'],         // 第二部分:当地语言名称
    {
        'font-scale': 0.8,   // 当地语言样式:缩小0.8倍
        'text-font': ['literal', ['Noto Sans Regular']]
    }
]);

⚙️ 参数说明

参数类型必填默认值说明
containerstring-地图容器元素的 ID
stylestring/object-地图样式 URL 或内联样式对象
center[number, number][0, 0]初始中心点坐标
zoomnumber0初始缩放级别

format 表达式

参数类型说明
textexpression要显示的文本内容
optionsobject文本样式选项

文本样式选项

属性类型说明
font-scalenumber字体缩放比例
text-fontarray字体名称数组
text-colorstring文本颜色
text-halo-colorstring文本光晕颜色
text-halo-widthnumber文本光晕宽度

🎨 效果说明

在这里插入图片描述

运行代码后,地图上的国家标签会以双行富文本形式显示:

  • 第一行: 英文名称(放大1.2倍)
  • 第二行: 当地语言名称(缩小0.8倍,使用 Noto Sans 字体)
  • 示例: 国家标签显示为 “Italy” 在上方,意大利文 “Italia” 在下方

视觉效果:

  • 英文名称更大更突出
  • 当地语言名称作为补充信息
  • 支持 RTL(从右到左)语言(如阿拉伯语、希伯来语)

💡 常 见 问 题

Q1: format 表达式是什么?
A: format 表达式允许创建富文本标签,支持多行文本和不同样式的组合。每个文本片段都可以有独立的样式设置。

Q2: 为什么需要 RTL 插件?
A: RTL(Right-to-Left)插件支持从右到左书写的语言,如阿拉伯语、希伯来语等,确保这些语言正确显示。

Q3: 如何添加更多文本样式?
A:format 表达式中添加更多的文本和样式对象对:

['format',
    ['get', 'name'], {'font-scale': 1.2},
    '\n', {},
    ['get', 'capital'], {'font-scale': 0.8, 'text-color': '#888'}
]

Q4: 可以使用哪些字体?
A: 可以使用样式中定义的字体或通过 text-font 属性指定字体。建议使用支持多语言的字体如 Noto Sans。

📝 练习任务

  1. 基础练习:修改字体大小比例,调整中英文名称的显示效果
  2. 进阶挑战:添加第三行文本显示国家首都
  3. 拓展思考:如何根据国家属性动态改变文本颜色?

🌟 最佳实践

  1. 字体选择: 使用支持多语言的字体(如 Noto Sans)确保各种语言正确显示
  2. 样式层次: 主文本使用较大字体,辅助信息使用较小字体
  3. RTL 支持: 加载 RTL 插件支持从右到左的语言
  4. 性能考虑: 避免过多的文本样式组合,影响渲染性能
  5. 可读性: 确保文本颜色与背景有足够对比度
  6. 语言属性: 使用 lang 属性帮助浏览器正确处理文本方向

🔗 延伸阅读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丷丩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值