Как настроить видимость map.LoadImage по уровню масштабирования в Mapbox GL JS?

#mapbox #mapbox-gl-js

#mapbox #mapbox-gl-js

Вопрос:

Я загружаю изображение со следующим кодом:

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

map.loadImage('....png', function(error, image) { 
  if (error) throw error;
  map.addImage('b7', image);
  map.addLayer({ 
    "id": "b7",
    "type": "symbol",
    "source": { 
      "type": "geojson",
      "data": {
        "type": "FeatureCollection",
        "features": [{
          "type": "Feature",
          "geometry": {
            "type": "Point",
            "coordinates": [0, 0] 
          } 
        }] 
      }
    },
    "layout": {
      "icon-image": "b7",
      "icon-size": 0.2
    }
  });
});
  

Как я могу установить видимость равной нулю при определенном уровне масштабирования?

Похоже, вы не можете использовать map.setLayoutProperty для LoadImage. В консоли написано: Ошибка: слой ‘b7’ не существует в стиле карты и не может быть оформлен.

Почему бы мне не попробовать что-то вроде:

 map.setLayoutProperty( 'b7', 'visibility', 'none' );
  

Есть идеи?

Ответ №1:

Два предложения о том, как решить эту проблему:

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

Во-вторых, если это не сработает, попробуйте добавить свой источник отдельно, а не внутри слоя.

  map.addSource("mySource", {
  "type": "geojson",
  "data": {
    "type": "FeatureCollection",
    "features": [{
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": [-74.981906, 41.742503]
      },
      "properties": {
        "title": "title ",
        "icon": "myImage",
      }
    }]
  }
});
  

А затем добавьте слой с исходным кодом.

  map.addLayer({
  "id": "b7",
  "type": "symbol",
  "source": "mySource",
  "layout": {
    "icon-image": "myImage",
    "icon-size": 0.2
  }
});
  

Теперь вы можете вызвать свойство setLayoutProperty в прослушивателе zoomstart. Добавьте условное значение, если оно требуется только при определенном уровне масштабирования, используя map.getZoom(); Здесь нужно настраивать видимость для слоя, а не для изображения.

 map.on('zoomstart', 'b7', function(e) {
  if (map.getZoom() > 12) {
    map.setLayoutProperty('b7', 'visibility', 'none');
  }
})
  

Фрагмент ниже, дайте мне знать, если у вас возникнут какие-либо проблемы.

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

  map.loadImage('myImage.png', function(error, image) {
    if (error) throw error;
    map.addImage('myImage', image);
    map.addSource("mySource", {
      "type": "geojson",
      "data": {
        "type": "FeatureCollection",
        "features": [{
          "type": "Feature",
          "geometry": {
            "type": "Point",
            "coordinates": [-73.981906, 40.742503]
          },
          "properties": {
            "title": "title ",
            "icon": "myImage",
          }
        }]
      }
    });

    map.addLayer({
      "id": "b7",
      "type": "symbol",
      "source": "mySource",
      "layout": {
        "icon-image": "myImage",
        "icon-size": 0.2
      }
    });
  });
});

map.on('zoomstart', 'b7', function(e) {
  if (map.getZoom() > 12) {
    map.setLayoutProperty('b7', 'visibility', 'none');
  }
})  

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

1. map.LoadImage доступна ли эта функция mapbox для Maps SDK для Android?