Я заметил, что когда я показываю результаты на карте, и если у вас включена кластеризация, вы получаете два типа фигур.
- Кластеры
- Особенности (В моем случае Персоны)
Я хочу показать все результаты в виде списка людей, даже когда они объединяются в кластеры.
Карта:
Карта
Как вы можете видеть, у нас есть 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();
И это работает Хорошо:)