Использование выражений Mapbox GL JS для установки значка-изображения

#javascript #expression #mapbox #mapbox-gl-js #mapbox-gl

#javascript #выражение #mapbox #mapbox-gl-js #mapbox-gl

Вопрос:

Я хотел бы установить icon-image на основе значения данных (https://docs.mapbox.com/mapbox-gl-js/style-spec/#expressions).

Также смотрите https://github.com/mapbox/mapbox-gl-js/issues/6935 в котором есть несколько примеров того, как это сделать.

Я попробовал несколько способов…

Использование match

 'icon-image': [
  'match',
  ['get', 'tap_ports'],
  2,
  '{tubes}-circle-15',
  4,
  '{tubes}-square-15',
  8,
  '{tubes}-octagon-15',
  '{tubes}-circle-15' // default
]
  

Использование case

 'icon-image': [
  'case',
  ['==', ['get', 'tap_ports'], 2],
  '{tubes}-circle-15',
  ['==', ['get', 'tap_ports'], 4],
  '{tubes}-square-15',
  ['==', ['get', 'tap_ports'], 4],
  '{tubes}-octagon-15',
  '{tubes}-circle-15' // default
]
  

Использование property и stops

 'icon-image': {
  property: 'tap_ports',
  type: 'categorical',
  stops: [
    [2, '{tubes}-circle-15'],
    [4, '{tubes}-square-15'],
    [8, '{tubes}-octagon-15']
  ]
}
  

Все это не создает никаких значков.

Кроме того, если я попытаюсь зарегистрировать отображаемые объекты с этого слоя с помощью queryRenderedFeatures , я увижу только пустые массивы, поэтому объекты не отображаются из-за моих попыток.

Если я просто установлю

 'icon-image': '{tubes}-circle-15'
  

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

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

1. Вы пробовали подобное: github.com/mapbox/mapbox-gl-js/blob /…

Ответ №1:

Спасибо за предложение @ChaseChoi.

Когда я впервые попробовал steps , это тоже не сработало, но затем я добавил инструкцию debug для моего слоя, которая вызывала проблемы.

 map.on('zoom', () => {
  console.log(map.queryRenderedFeatures({ layers: ['tubes'] }))
})
  

Здесь я заметил, что layout.image-icon свойство было чем-то вроде {tubes}-circle-15 , а не blue-circle-15 . {tubes} должен был быть цвет.

Итак, придерживаясь пошагового подхода, я использовал concat выражение, и оно сработало!

 'icon-image': [
  'step',
  ['get', 'tap_ports'],
  ['concat', ['get', 'tubes'], '-circle-15'], // default
  2,
  ['concat', ['get', 'tubes'], '-circle-15'],
  4,
  ['concat', ['get', 'tubes'], '-square-15'],
  8,
  ['concat', ['get', 'tubes'], '-octagon-15']
]
  

Я вернулся назад и попробовал другие подходы, используя concat этот раз, и все они работают ожидаемо для подхода « property и stops «.