Android кластеризация менеджера символов mapbox - PullRequest
0 голосов
/ 10 января 2020

Я хотел бы реализовать кластеризацию символов. Основываясь на этом руководстве - https://github.com/mapbox/mapbox-android-demo/blob/master/MapboxAndroidDemo/src/main/java/com/mapbox/mapboxandroiddemo/examples/dds/CircleLayerClusteringActivity.java и на том факте, что менеджер символов - это то же самое, что и SymbolLayer, я пришел к выводу, что вы можете использовать вместе менеджер символов и Symbol Layer, но это не работает для мне, подскажите, пожалуйста, что я делаю не так.

 private void showCluster() {
        List<Feature> markerCoordinates = new ArrayList<>();
        for(int i = 0; i < mCarData.getSize(); i++) {
            double lat = mCarData.getLat(i);
            double lon = mCarData.getLon(i);
            if (lat == 0.0 || lon == 0.0) {
                continue;
            }
            markerCoordinates.add(Feature
                    .fromGeometry(Point.fromLngLat(mCarData.getLon(i), mCarData.getLat(i))));
        }
        GeoJsonSource mSource = (GeoJsonSource) mStyle.getSource("markers");
        if (mSource == null) {
            mStyle.addSource(
                    new GeoJsonSource("markers",
                            FeatureCollection.fromFeatures(markerCoordinates),
                            new GeoJsonOptions()
                                    .withCluster(true)
                                    .withClusterRadius(20)
                                    .withTolerance(0.7f)
                                    .withMaxZoom(21)
                    )
            );
        } else {
            mSource.setGeoJson(FeatureCollection.fromFeatures(markerCoordinates));
        }

        //Add clusters' circles
        CircleLayer circles = (CircleLayer) mStyle.getLayer("cluster-0");
        if (circles == null) {
            circles = new CircleLayer("cluster-0", "markers"); //mapbox-android-symbol-source
            circles.setProperties(
                    circleColor(ContextCompat.getColor(context, R.color.mapbox_blue)),
                    circleRadius(18f),
                    iconAllowOverlap(true),
                    textIgnorePlacement(true),
                    iconIgnorePlacement(true),
                    textAllowOverlap(true),
                    symbolAvoidEdges(false)
            );

            Expression pointCount = toNumber(get("point_count"));

            // Add a filter to the cluster layer that hides the circles based on "point_count"
            circles.setFilter(all(has("point_count"), gte(pointCount, literal(0))));
            mStyle.addLayer(circles);
        }

        //Add the count labels
        SymbolLayer count = (SymbolLayer) mStyle.getLayer("count");
        if (count == null) {
            count = new SymbolLayer("count", "markers");
            count.setProperties(
                    textField(Expression.toString(get("point_count"))),
                    textSize(12f),
                    textColor(Color.WHITE),
                    textIgnorePlacement(true),
                    textAllowOverlap(true),
                    iconIgnorePlacement(true)
//                    symbolAvoidEdges(false)
            );
            mStyle.addLayer(count);
        }

    }

Некоторые изменения в вопросе. Я играю со следующими свойствами диспетчера символов.

symbolManager.setIconIgnorePlacement(false);
symbolManager.setTextIgnorePlacement(true);
symbolManager.setIconAllowOverlap(false);
symbolManager.setTextAllowOverlap(true);
symbolManager.setIconOptional(false);
symbolManager.setTextOptional(true);
symbolManager.setSymbolAvoidEdges(true);

И со следующими свойствами слоя символов.

iconAllowOverlap(true),
textIgnorePlacement(true),
iconIgnorePlacement(true),
textAllowOverlap(true),
symbolAvoidEdges(false)

Я получаю следующий результат , так что скажите Я хотел бы, чтобы я мог перекрыть нижний слой с верхним. И также у меня есть этот proplem . Маркеры исчезают, и кластер еще не появился как this . Это та же картина, но с другим зумом.

1 Ответ

0 голосов
/ 16 января 2020

Благодарим Вас за помощь здесь!

У вас была возможность проверить этот stackoverflow вопрос еще?

Похоже, что он отвечает на ваш вопрос. Если нет, я с радостью помогу вам!

К вашему первому вопросу:

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

A: Нижние слои не перекрываются со слоями на верхнем уровне, это то, что определяет их как нижние слои , Порядок, в котором вы добавляете слои на карту, определяет их уровень. Если вы хотите, чтобы определенный слой, который вы добавили ПОСЛЕ другого слоя, был наложен на этот слой, вы можете использовать функцию addLayerBelow (layerToAdd, layerToBeBelowOf) .

Пожалуйста, также обращайтесь к этому пример

На ваш второй вопрос:

Q: Маркеры исчезают, и кластер еще не выглядел как это. Это та же картина, но с другим увеличением.

-> Не могли бы вы уточнить, что вы ожидаете и чем это отличается от того, что вы получаете?

...