Mapbox получает выражение с интерполированными размерами текста

#angular #mapbox #geojson #mapbox-gl-js #data-driven

#angular #mapbox #geojson #mapbox-gl-js #управляемый данными

Вопрос:

Я хотел бы добавить только один слой для текстовых символов, которые добавляются из FeatureCollection. С каждым объектом связано несколько размеров текста и стилей, которые хранятся в их свойствах. Я использую управляемые данными выражения, доступные с Mapbox, для назначения стилей.

В свойствах каждого объекта есть массив с именем ‘text_size’, который содержит интерполированный размер текста, предназначенный для извлечения с ['get', 'text_size'] помощью выражения. Ниже показан пример того, что хранится в свойстве ‘text_size’ объекта.

 text_size: [
  'interpolate',
  ['linear'],
  ['zoom'],
  18,
  0,
  20,
  8,
  22,
  20
]
 

Проблема ['get', 'text_size'] в том, что выражение, похоже, не работает для установки значения. Пример кода с использованием выражения, которое не работает, показан ниже. Ошибок не возникает, размер текста просто устанавливается на размер по умолчанию.

 this.map.addLayer({
        id: `text-dynamic-layer`,
        type: 'symbol',
        source: `dynamic-text-source`,
        layout: {
          'text-size': ['get', 'text_size'],
          'text-font': ['Open Sans Regular'],
          'text-offset': [0.85, -1.7],
          'text-anchor': 'top',
          'text-max-width': 8,
          'text-field': '{name}'
        },
        paint: <any>{
          'text-color': '#FFF',
        },
      });
 

Те же значения работают, когда массив применяется напрямую, а не извлекается с ['get', 'text_size'] помощью выражения. Ниже показан пример используемого кода, который корректно работает при добавлении слоя без выражения.

 this.map.addLayer({
        id: `text-dynamic-layer`,
        type: 'symbol',
        source: `dynamic-text-source`,
        layout: {
          'text-size': [
            'interpolate',
            ['linear'],
            ['zoom'],
            18,
            0,
            20,
            8,
            22,
            20
          ],
          'text-font': ['Open Sans Regular'],
          'text-offset': [0.85, -1.7],
          'text-anchor': 'top',
          'text-max-width': 8,
          'text-field': '{name}'
        },
        paint: <any>{
          'text-color': '#FFF',
        },
      });
 

Есть идеи, что может быть причиной этого? Заранее спасибо за любые ответы.

Ответ №1:

Вы не можете сохранить выражение для объекта и интерпретировать его таким образом. Ну, не afaik.

Если действительно важно, чтобы каждая функция могла устанавливать свой собственный размер шрифта для этих трех разных уровней масштабирования, я бы предложил сохранить их напрямую и иметь выражение типа:

"font-size": ['interpolate', ['linear'], ['zoom'], 18, ['get', 'font18'], 20, ['get', 'font20'], 22, ['get', 'font22']]

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

1. Спасибо, мне было интересно, действительно ли это возможно. Спасибо за возможное решение, хотя, к сожалению, из-за того, что для каждой функции также используются разные уровни масштабирования, я думаю, мне просто нужно создать несколько слоев.