Как отобразить точки в соответствии с уникальной категорией в слое символов без создания нескольких слоев?

#azure-maps

#azure-карты

Вопрос:

У меня включен пузырьковый слой с кластеризацией.Однако при увеличении я хочу отобразить точки в уникальных цветах в соответствии со свойством компании в данных. Я достигаю этого, создавая отдельные слои символов с уникальными цветами и добавляя их на карту. У меня более 30 компаний (более 1000 точек), поэтому он добавляет 30 дополнительных слоев для удовлетворения требований при масштабировании. Снижает ли производительность добавление 30 слоев к карте? Или есть лучший способ написать одно выражение данных в параметрах символьного слоя, чтобы решить эту проблему?Спасибо

 function addLayers() {
    const company = [...new Set(Data.map((i) => i.company))]; // creating a list of unique companies 
    
    // Looping through each company
    company.forEach((i) => { 
      let layerName = i   "Layer";
      let iconName = i   "Icon";
      let rColor = randomColor().hexString(); // get a random color
      
      map.imageSprite
        .createFromTemplate(iconName, "marker-flat", rColor, "#fff")
        .then(function () {
          map.layers.add(
            new atlas.layer.SymbolLayer(datasource, layerName, {
              filter: [
                "all",
                ["!", ["has", "point_count"]],
                ["==", ["get", "company"], i],
              ], //Filter out clustered points amp; unique company from this layer.
              iconOptions: { image: iconName, allowOverlap: false },
            })
          );

        });
    });
  }
  

Ответ №1:

Использование одного слоя с выражением будет намного лучше для производительности.

Вот пример блока кода, который загружает 4 значка, а затем создает слой символов с выражением, которое выбирает соответствующий значок для точки данных на основе некоторого свойства в точке данных:

 //Create an array of custom icon promises to load into the map. 
var iconPromises = [
    map.imageSprite.add('gas_station_icon', '../Common/images/icons/gas_station_pin.png'),
    map.imageSprite.add('grocery_store_icon', '../Common/images/icons/grocery_cart_pin.png'),
    map.imageSprite.add('restaurant_icon', '../Common/images/icons/restaurant_pin.png'),
    map.imageSprite.add('school_icon', '../Common/images/icons/school_pin.png'),
];

//Load all the custom image icons into the map resources.
Promise.all(iconPromises).then(function () {

    //Add a layer for rendering point data as symbols.
    map.layers.add(new atlas.layer.SymbolLayer(datasource, null, {
        iconOptions: {
            //Use a match expression to select the image icon based on the EntityType property of the data point.
            image: [
                'match',

                ['get', 'EntityType'],

                //For each entity type, specify the icon name to use.
                'Gas Station', 'gas_station_icon',
                'Grocery Store', 'grocery_store_icon',
                'Restaurant', 'restaurant_icon',
                'School', 'school_icon',

                //Default fallback icon.
                'marker-blue'
            ]
        }
    }));
});
  

Вот рабочая версия этого кода: https://azuremapscodesamples.azurewebsites.net/?sample=Data-driven symbol icons