export function scaleMapStyleByResolution()

in src/utils/map-style-utils/mapbox-gl-style-editor.js [149:184]


export function scaleMapStyleByResolution(mapboxStyle, scale) {
  if (scale !== 1 && mapboxStyle) {
    const labelLayerGroup = DEFAULT_LAYER_GROUPS.find(lg => lg.slug === 'label');
    // @ts-ignore
    const {filter: labelLayerFilter} = labelLayerGroup;
    const zoomOffset = Math.log2(scale);

    const copyStyle = clondDeep(mapboxStyle);
    (copyStyle.layers || []).forEach(d => {
      // edit minzoom and maxzoom
      if (d.maxzoom) {
        d.maxzoom = Math.max(d.maxzoom + zoomOffset, 1);
      }

      if (d.minzoom) {
        d.minzoom = Math.max(d.minzoom + zoomOffset, 1);
      }

      // edit text size
      if (labelLayerFilter(d)) {
        if (d.layout && d.layout['text-size'] && Array.isArray(d.layout['text-size'].stops)) {
          d.layout['text-size'].stops.forEach(stop => {
            // zoom
            stop[0] = Math.max(stop[0] + zoomOffset, 1);
            // size
            stop[1] *= scale;
          });
        }
      }
    });

    return copyStyle;
  }

  return mapboxStyle;
}