MapBox 中的可变线偏移

Variable line offset in MapBox

我有一个 MapBox 地图,我正在上面画一些线。

首先,我创建了一个 geojson 对象。我所有的功能都是 LineStrings。 我的某些行可以有 left/right 属性,但它不是强制参数。所以功能看起来像这样:

const feature = {
    'type': 'Feature',
    'properties': {
        'id': LINE_ID,
        'color': LINE_COLOR,
        'left_right': "LEFT",  // can be "LEFT", "RIGHT", or ""
    },
    "geometry": {
        'type': 'LineString',
        "coordinates": [
            [LINE_POINTS[0].lng, LINE_POINTS[0].lat],
            [LINE_POINTS[1].lng, LINE_POINTS[1].lat],
        ]
    }
}

我的 geojson 准备就绪后,我将其作为源添加到地图中:

map.addSource('geojson_lines', {type: 'geojson', data: LINE_FEATURES});

现在需要从这个来源向地图添加一个图层。没问题。
但是我需要我的图层来满足这些要求:

我可以设置颜色和线宽,但无法确定偏移量:

map.addLayer({
    id: 'lines_layer', type: 'line', source: 'geojson_lines',
    layout: {},
    paint: {
        'line-color': ['get', 'color'],
        'line-width': {
            stops: [[8, 4], [18, 10]]
        },
        'line-offset': [] // need help with this
    }
});

目标是使“右”线在范围内具有正偏移值,例如缩放级别 8 到 18 为 2 到 6,而“左”线具有负偏移值。

是否可以使用某种表达式和停止或插入数组来实现此目的?

阅读文档并尝试在 Whosebug 上找到的一些技巧后,我能够自己解决这个问题

这里的关键是首先对值进行插值,然后使用 case 表达式确定方向。

map.addLayer({
    id: 'lines_layer', type: 'line', source: 'geojson_lines',
    layout: {},
    paint: {
        'line-color': ['get', 'color'],
        'line-width': {
            stops: [[8, 4], [18, 10]]
        },

        'line-offset': ['interpolate', ['linear'], ['zoom'],
            8
            ['case',
                ["==", ["get", "left_right"], "LEFT"],
                -2,
                ["==", ["get", "left_right"], "RIGHT"],
                2,
                0
            ],
            18,
            ['case',
                ["==", ["get", "left_right"], "LEFT"],
                -6,
                ["==", ["get", "left_right"], "RIGHT"],
                6,
                0
            ],
        ],

    }
});