长地名的后两个字被裁掉,text-max-width 太小
「乌鲁木齐高新技术产业开发区」只显示成「乌鲁木齐高新」,后面的字全没了。
现象
标注字段是完整地名,屏幕上只显示前 6 个字,
没有任何省略号,也没有换行,像是被画布边界直接切掉。
改用英文地名 Urumqi High-tech Industrial Development Zone 时,
显示为两行但第二行也被截断。
原因
text-max-width 的单位是 em,不是像素,也不是字数。
它表示「一行最多容纳多少个字号宽度的字符」,换行由引擎按这个宽度计算。
设成 4 时,每行只能放 4 个汉字宽度,超出的部分被折到下一行;
而 text-max-width 与容器尺寸、text-size 共同决定总高度,
超出纹理区域的内容不会绘制。
中文每个字约占 1 em,所以 text-max-width: 4 约等于每行 4 个汉字,
8 个字的地名需要 2 行,长于 3 行就会被裁。
| text-max-width | 每行汉字数 | 8 字地名 |
|---|---|---|
| 4 | 约 4 | 2 行,常被裁 |
| 8 | 约 8 | 1 行,完整 |
| 10 | 约 10 | 1 行,留余量 |
排查过程
- 看该图层的
layout['text-max-width']与text-size值。 - 算每行可容纳字数:
max-width × 字号 / 字号 ≈ max-width(中文)。 - 把
text-max-width临时改成 20,若显示完整即可确认。 - 检查是否有
text-clip之类的自定义后处理,或外层容器overflow: hidden。
console.log(map.getLayer('district-label').layout['text-max-width']); // 4
console.log(map.getLayer('district-label').layout['text-size']); // 12
// 中文估算:每行约 4 个汉字,8 字地名需要 2 行
// 若同时 text-max-width 4 + text-size 12,字号 12px,可行宽度约 48px
解决方案
中文场景把 text-max-width 设到 8~12,并按缩放插值字号;
地名过长时用 text-transform 或换行符手动断句。
map.addLayer({
id: 'district-label',
type: 'symbol',
source: 'districts',
layout: {
'text-field': ['get', 'name'],
'text-size': ['interpolate', ['linear'], ['zoom'], 8, 11, 14, 13, 17, 15],
'text-max-width': 10, // 中文每行约 10 字
'text-line-height': 1.2,
'text-max-angle': 30,
'symbol-placement': 'point'
},
paint: {
'text-color': '#1b2733',
'text-halo-color': '#ffffff',
'text-halo-width': 1.2
}
});
更长的地名可以在数据侧插入换行符,让断句符合阅读习惯。
// 数据侧预处理:超过 8 字的地名在语义处断行
const name = '乌鲁木齐高新技术产业开发区';
const display = name.length > 8 ? name.slice(0, 6) + '\n' + name.slice(6) : name;
// "乌鲁木齐高新\n技术产业开发区"
验证
该标注显示完整,无裁切;行数不超过 2 行; 缩放到 17 级时字号变大但文字仍在障碍物范围内。
const l = map.getLayer('district-label');
console.assert(l.layout['text-max-width'] >= 8, '宽度仍不足');
console.assert('乌鲁木齐高新技术产业开发区'.length <= l.layout['text-max-width'] * 2, '预计仍会裁切');
适用版本
| 库 | 版本 | 说明 |
|---|---|---|
| Mapbox GL JS | 2.15 / 3.x | text-max-width 单位为 em |
| MapLibre GL JS | 3.x / 4.x | 同上 |
| Leaflet | 1.9.x | divIcon 需自行控制 white-space |
经纬志(2026)。《长地名的后两个字被裁掉,text-max-width 太小》。https://www.jingweizhi.com/cookbook/label-text-clipped.html(访问日期 2026-11-03)。