经纬志
首页 / 实战手册 / 样式与渲染

长地名的后两个字被裁掉,text-max-width 太小

先看结论

「乌鲁木齐高新技术产业开发区」只显示成「乌鲁木齐高新」,后面的字全没了。

最后验证 2026-11-03 · 多技术栈 · 更新 2026-10-29 · 引用本文

现象

标注字段是完整地名,屏幕上只显示前 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约 42 行,常被裁
8约 81 行,完整
10约 101 行,留余量

排查过程

  1. 看该图层的 layout['text-max-width'] 与 text-size 值。
  2. 算每行可容纳字数:max-width × 字号 / 字号 ≈ max-width(中文)。
  3. 把 text-max-width 临时改成 20,若显示完整即可确认。
  4. 检查是否有 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 JS2.15 / 3.xtext-max-width 单位为 em
MapLibre GL JS3.x / 4.x同上
Leaflet1.9.xdivIcon 需自行控制 white-space
引用本文

经纬志(2026)。《长地名的后两个字被裁掉,text-max-width 太小》。https://www.jingweizhi.com/cookbook/label-text-clipped.html(访问日期 2026-11-03)。