Mapbox gl js — Пользовательские иконки на основе нескольких критериев

#mapbox #mapbox-gl-js #mapbox-marker

#mapbox #mapbox-gl-js #mapbox-маркер

Вопрос:

В настоящее время я пытаюсь создать веб-карту клиента с помощью mapbox gl js и пытаюсь решить, как наилучшим образом структурировать код для отображения данных geojson на слое карты на основе нескольких свойств.

Свойства следующие:

  • тип: включает свойство маркера с 3 значениями: статический, самолет, корабль
  • имя: включает имя маркера, может быть любым именем для корабля и самолета, но определяет подтип для статического: аэропорт, здание, мост
  • нация: включает числовое значение, основанное на нации, к которой принадлежат вышеуказанные элементы: 0, 1, 2

Тип и имя определяют тип значка, нация — цвет значка (значки в формате sdf)

Теперь у меня есть следующий код, который работает, но без учета подкласса name для статических объектов. Есть какие-либо предложения о том, как можно включить это соответствие подкласса, чтобы я мог показывать разные значки для статического аэропорта, статического здания, статического моста, но не заботиться о названии типов самолетов и кораблей?

 map.addLayer({
        'id': 'marker',
        'type': 'symbol',
        'source': 'db-json',
        'layout': {
            'icon-image': [
                    'match', // Use the 'match' expression: https://docs.mapbox.com/mapbox-gl-js/style-spec/#expressions-match
                    ['get', 'type'], // Use the result 'coalition' property
                    'airplane', 'plane-icon',
                    'static', 'circle-stroked-15',
                    'ship', 'harbor-15',
                    'airfield-15' // any other type
                    ]
            },
            'paint': {
                'icon-color': [
                    'match', // Use the 'match' expression: https://docs.mapbox.com/mapbox-gl-js/style-spec/#expressions-match
                    ['get', 'nation'], // Use the result 'nation' property
                    0, '#808080',
                    1, '#FF0000',
                    2, '#0000FF',
                    '#00FF00' // any other nation
                    ]
                }
        });
 

Спасибо миллион!!

Ответ №1:

Чтобы ответить на мой собственный вопрос. Конечно, можно сложить несколько уровней. Возможно, это не самое оптимальное решение (по сравнению с запросом, который проверяет и сравнивает 2 переменные одновременно), но оно работает.

Пример:

 map.addLayer({
        'id': 'marker',
        'type': 'symbol',
        'source': 'db-json',
        'layout': {
            'icon-image': [
                    'match', 
                    ['get', 'type'], // Use the result 'type' property
                    'airplane', 'plane-icon',
                    'static', [
                       'match', 
                        ['get', 'name'], // Use the result 'name' property
                        'airport', 'airport-icon',
                        'building', 'building-icon',
                        'bridge', 'bridge-icon',
                        '' // none for any other type
                         ],
                    'ship', 'harbor-15',
                    'airfield-15' // any other type
                    ]
            },
            'paint': {
                'icon-color': [
                    'match', 
                    ['get', 'nation'], // Use the result 'nation' property
                    0, '#808080',
                    1, '#FF0000',
                    2, '#0000FF',
                    '#00FF00' // any other nation
                    ]
                }
        });
 

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

1. Спасибо, что нашли время поделиться.