动态线宽与多段虚线
共同二维 line-dasharray 接受 1~16 个非负数字,交替表示实段和空白,单位为当前线宽倍率。[4, 2, 1, 2] 表示长实段、间隔、短实段、间隔;线宽 4px 时分别为 16、8、4、8 CSS 像素。奇数数组的末项和首项都是实段,在周期边界相连,例如 [3, 1, 1] 形成 4 倍线宽实段和 1 倍线宽空白。不会按 Canvas 规则翻转第二个周期。
map.addSource('roads', { type: 'geojson', data: {
type: 'Feature', id: 1, properties: { width: 4, dash: [4, 2, 1, 2] },
geometry: { type: 'LineString', coordinates: [[-10, 0], [10, 0]] }
} });
map.addLayer({ id: 'road-dash', type: 'line', source: 'roads', paint: {
'line-color': 'blue', 'line-width': ['get', 'width'],
'line-dasharray': ['get', 'dash']
} });
await map.sqs.flush({ render: true });
map.setPaintProperty('road-dash', 'line-dasharray',
['coalesce', ['feature-state', 'dash'], ['literal', [4, 2, 1, 2]]]);
map.setFeatureState({ source: 'roads', id: 1 }, { dash: [1, 1, 3, 1] });
await map.sqs.flush({ render: true });
可以使用 get、feature-state、global-state、词法变量和共同 case、match、coalesce、step 表达式。分支中的常量数组写成 ['literal', [...]]。dash 的 zoom 按整数求值;线宽继续按其原有 paint 表达式求值。源或状态更新不改变图层身份,折点之间相位连续。
数组长度上限 16 是本项目预算,不能理解为 MapLibre 规范限制。允许零长度项,但周期总和须大于零。每项乘实际线宽不超过 100 CSS 像素;动态线宽采用原有 24px 最大值预检。空数组、负值、非数字、全零、超长和超预算明确拒绝,不静默裁剪。候选源或样式失败保留原先内容。
能力查询 commonLineDashArrays 表示此共同二维子集。当前仅平面虚线;完整三维/球面、端帽/连接和逐虚线空白查询尚未实现。查询沿用整条线包络。图层和工具 UI 由使用方自行编写。
完整共同脚本 可用于原生持续 QuickJS、网页主线程和地图 Worker;独立 SDK 将 map.sqs.flush() 换为地图对象的 flush()。真实像素和平台验收状态随证据更新,手机设备和正式发行另行验收。