Карты Azure, показать все результаты поиска в виде кластеров - PullRequest
0 голосов
/ 20 февраля 2019

Я заметил, что когда я показываю результаты на карте, и если у вас включена кластеризация, вы получаете два типа фигур.

  • Кластеры
  • Особенности (В моем случае Персоны)

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

Карта:

Карта

Как вы можете видеть, у нас есть 1 кластер с 2 людьми.Причина в том, что для данных у нас есть 2 фигуры, кластер и объект персонажа.

Для достижения этой цели мы сделали следующее,

Событие Moveend, которое мы храним на 2 отдельныхМассивы лиц и кластеров:

   var clusters = [];
   var persons = [];
   data.forEach(function (shape) {
        if (typeof shape.properties !== "undefined") {
            if (shape.properties.cluster) {
                clusters.push(shape.properties);
            }
        } else if (typeof shape.properties === "undefined") {
            properties = shape.getProperties();
            persons.push(properties);
        }
    });

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

         if (clusters.length > 0) {
            for (var i = 0; i < clusters.length; i++) {
                datasource.getClusterLeaves(clusters[i].cluster_id).then(function (children) {
                    for (var i = 0; i < children.length; i++) {
                        children.forEach(function (personProps) {
                            persons.push(personProps.properties);
                        });
                    }
                });
            }
        }

И я создаю кластерный слой следующим образом:

var clusterBubbleLayer = new atlas.layer.BubbleLayer(datasource, null, {
                radius: 15,
                color: '#007faa',
                strokeColor: 'white',
                strokeWidth: 2
            });

            map.layers.add(clusterBubbleLayer);

            var clusterLabelLayer = new atlas.layer.SymbolLayer(datasource, null, {
                iconOptions: {
                    image: 'none',
                    font: ['SegoeUi-Bold'],
                    anchor: 'center',
                    allowOverlap: true,
                    ignorePlacement: true
                },
                textOptions: {
                    textField: '{point_count_abbreviated}',
                    size: 12,
                    font: ['StandardFont-Bold'],
                    offset: [0, 0.4],
                    color: 'white'
                }
            });

            map.layers.add(clusterLabelLayer);

Но я хочу знать, есть ли другой способ, чтобы показать все записикарты как кластеры, даже когда есть только один человек?

Большое спасибо!

Решение 1:

Я нашел то, что я считаю хорошимРешение с использованием «последовательного выполнения» обещаний,

Теперь у меня есть массив Promises, поэтому при каждом использовании метода getClusterLeaves возвращает обещание, и я сохраняю этот ответ в массиве,

   var persons = [];
   var promises = [];
    data.forEach(function (shape) {
        if (typeof shape.properties !== "undefined") {
            if (shape.properties.cluster) {
                promises.push(datasource.getClusterLeaves(shape.properties.cluster_id, 9999999, 0).then((e) => {
                    e.forEach(function (result) {
                        properties = result.properties;
                        persons.push(properties);
                    });
                }));
            }
        }
    });

Итогда я получаюлюди,

var buildPerson = new Promise(resolve => {
            data.forEach(function (shape) {
                if (typeof shape.properties === "undefined") {
                    properties = shape.getProperties();
                    persons.push(properties);
                }
            });
            resolve("solved");
        });

И наконец я показываю все результаты, когда все обещания кластерной функции это сделано,

 function runSerial() {
        Promise.all(promises)
            .then(buildPerson)
            .then(function () {
                persons.forEach(function (person) {
                    BuildHtml(person);
                });
                displayNext();
            });
    }
    runSerial();

И это работает Хорошо:)

...