mapbox android: доступ к одному свойству слоя в другом слое с помощью выражения - PullRequest
0 голосов
/ 24 октября 2019

Я новичок в mapbox и не могу найти решение для этого:

У меня есть 2 слоя на карте:

  1. слой данных с geoJsonSource + FeatureCollection. (Контактыlayer)
  2. кластерный слой (я использовал этот пример).

каждый элемент (контакт) в первом слое имеет логическое свойство "isInEmergency" (Iзнаю, что это хорошо работает, потому что я отображаю цвет текста соответственно этому свойству)

Теперь я хочу отобразить аварийную индикацию (из первого слоя) на иконке кластера (второго слоя):

  1. Если есть какая-либо аварийная точка (из GeoJsonSource) под кластером - Значок элемента кластера будет X.
  2. Если нет никакой аварийной точки (из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(
     ...
        ));

Буду признателен за любую помощь

Спасибо, что уделили нам время!

...