Я новичок в mapbox и не могу найти решение для этого:
У меня есть 2 слоя на карте:
- слой данных с geoJsonSource + FeatureCollection. (Контактыlayer)
- кластерный слой (я использовал этот пример).
каждый элемент (контакт) в первом слое имеет логическое свойство "isInEmergency" (Iзнаю, что это хорошо работает, потому что я отображаю цвет текста соответственно этому свойству)
Теперь я хочу отобразить аварийную индикацию (из первого слоя) на иконке кластера (второго слоя):
- Если есть какая-либо аварийная точка (из GeoJsonSource) под кластером - Значок элемента кластера будет X.
- Если нет никакой аварийной точки (изGeoJsonSource) под кластером - значок кластера будет Y.
GeoJsonSource очень динамичен, на лету я добавляю / удаляю точки в / из источника и обновляю местоположения для существующих точек, поэтомукластер очень динамичныйd все время менять
Как мне реализовать это поведение?
Я пытался использовать выражение на уровне кластера для извлечения свойства чрезвычайной ситуации, но возвращаемое значение всегда ложно, хотя я знаю, что оно верно впервый слой
что я делаю не так?
соответствующий код: 1) слой контактов:
public void createContactsLayer(@NonNull Style loadedMapStyle , String contactsSourceId , String contactLayerId) {
FeatureCollection featureCollection = FeatureCollection.fromFeatures(contactsMapTable.values().toArray(new Feature[0]));
geoJsonSource = new GeoJsonSource(contactsSourceId, featureCollection, new GeoJsonOptions()
.withCluster(true)..;
loadedMapStyle.addSource(geoJsonSource);
loadedMapStyle.addLayer(new SymbolLayer(contactLayerId, contactsSourceId).withProperties(...
//////////////here I use the emergency property and it works well/////////////////////////////
textColor(switchCase(
eq(get("emergency-field"), true), rgba(255, 0, 0, 1.0f),
eq(get("emergency-field"), false), rgba(0, 255, 0, 1.0f), get("#FF5733")))
));
}
2) кластерслой:
private void createClusterLayer(@NonNull Style loadedMapStyle) {
int[] layers = new int[]{150, 20, 0};
for (int i = 0; i < layers.length; i++) {
//Add clusters' SymbolLayers images
SymbolLayer symbolLayer = new SymbolLayer(CLUSTER_LAYER_ID + i, CONTACTS_SOURCE_ID);
symbolLayer.setProperties(
//here I tried to use the emergency property and it's always false (the image is always CLUSTER_IMAGE_ID)/////////////////////////////
iconImage(switchCase(eq(toBool(get("emergency-field")), true), literal(CLUSTER_EMERGENCY_IMAGE_ID), eq(toBool(get("emergency-field")), false), literal(CLUSTER_IMAGE_ID), literal(CLUSTER_EMERGENCY_IMAGE_ID))),
textOffset(new Float[]{0.0f, -0.2f}),
textIgnorePlacement(true),
textAllowOverlap(false)
);
Expression pointCount = toNumber(get("point_count"));
// Add a filter to the cluster layer that hides the icons based on "point_count"
symbolLayer.setFilter(
i == 0
? all(has("point_count"),
gte(pointCount, literal(layers[i]))
) : all(has("point_count"),
gt(pointCount, literal(layers[i])),
lt(pointCount, literal(layers[i - 1]))
)
);
loadedMapStyle.addLayer(symbolLayer);
}
//Add a SymbolLayer for the cluster data number point count
loadedMapStyle.addLayer(new SymbolLayer(CLUSTER_LAYER_ID, CONTACTS_SOURCE_ID).withProperties(
...
));
Буду признателен за любую помощь
Спасибо, что уделили нам время!