Тепловая карта MapBox скрывает внешние границы

#heatmap #mapbox-gl-js

#тепловая карта #mapbox-gl-js

Вопрос:

Я создаю тепловую карту Соединенных Штатов, и дизайнеры хотят «остановить» выделение цвета за пределы границ США. Таким образом, в Техасе цвета достигли бы границы штата и просто остановились.

Возможно ли это?

Я попытался создать другой слой, который включал Мексику, Канаду и Тихий / Атлантический океаны, но тепловые карты отображаются после, и я также не могу узнать, как установить приоритет отображения.

редактировать: Вот изображение, которое показывает желаемый эффект: введите описание изображения здесь

И вот мой код, за вычетом некоторых нерелевантных данных:

 mapboxgl.accessToken = 'accessTokenString';
var map = new mapboxgl.Map({
    container: 'map-heatmap',
    style: 'mapbox://uri/for/styles',
    center: [-95.922211, 37.881266],
    zoom: 3.15,
    minZoom: 3.15,
    maxZoom: 3.15,
    maxPitch: 0,
    dragPan: false,
    dragRotate: false
});

map.on('load', function() {

    map.addSource('states', {
        'type': 'geojson',
        'data': '/path/to/us-states-contiguous.geojson'
    });

    map.addLayer({
        'id': 'state-fills',
        'type': 'fill',
        'source': 'states',
        'layout': {},
        'paint': {
            'fill-color': '#F2F2F2'
        }
    });

    map.addSource('mexico', {
        'type': 'geojson',
        'data': '/path/to/mexico.geojson'
    });

    map.addLayer({
        'id': 'mexico',
        'type': 'fill',
        'source': 'mexico',
        'layout': {},
        'paint': {
            'fill-color': '#fff'
        }
    });

    map.addSource('heatmapCoordinates', {
        'type': 'geojson',
        data: {
            "type": "FeatureCollection",
            "features": {/* JSON coordinates */}
        }
    });

    map.addLayer({
        'id': 'myHeatmap',
        'type': 'heatmap',
        'source': 'heatmapCoordinates',
        'layout': {},
        'paint': {
            'heatmap-weight': 1,
            'heatmap-color': [
                'interpolate',
                ['linear'],
                ['heatmap-density'],
                0,
                'rgba(0, 0, 0, 0)',
                1,
                'rgba(0, 183, 79, 1)',
            ],
            'heatmap-radius': 100,
            'heatmap-opacity': .5
        }
    }, 'mexico');

    map.addLayer({
        'id': 'state-borders',
        'type': 'line',
        'source': 'states',
        'layout': {},
        'paint': {
            'line-color': 'rgba(43, 43, 43, .5)',
            'line-width': .25
        }
    });
});

  

По какой-то причине границы, которые я рисую над тепловой картой, отображаются «поверх» нее. Но когда я пытаюсь слой «заполнить» (как в случае с Мексикой выше), он не будет отображаться поверх градиентов тепловой карты, всегда под ними.

Итак, как бы я мог «обрезать» затенение тепловой карты за пределами границ США для достижения желаемого эффекта вышеуказанного изображения?

Комментарии:

1. Не очень понятно, о чем вы спрашиваете. Можете ли вы включить скриншоты и свой код стиля?

2. @SteveBennett Я добавил изображение и фрагмент кода. Если это недостаточно ясно, дайте мне знать, и я смогу пересмотреть еще раз. Спасибо!

Ответ №1:

Ваша тепловая карта отображается над полигонами клипа, потому что вы добавляете ее на карту впоследствии.

Вам просто нужно изменить порядок двух addLayer() вызовов.

Комментарии:

1. Итак, второй параметр для функции map.addLayer() должен загружать ее «под» (или перед) элементом, идентификатор которого указан. Но даже если я попытаюсь загрузить тепловую карту перед слоем «мексика», тепловая карта все равно появится поверх нее.

2. О, я пропустил это, извините. Я удивлен таким поведением. Можете ли вы поместить это в codepen?