Кластеризация в Mapbox с использованием SymbolManager

104
24 апреля 2021, 01:40

Пытаюсь сделать кластеризацию в приложении с использованием библиотеки mapbox и их плагина аннотаций. В разрабатываемом приложении необходимо использовать обработчик нажатий и задавать свойства каждому маркеру (угол, иконка, цвет и прочее), поэтому вариант с использованием SymbolLayer отпал сразу. Единственное почти рабочее решение, которое мне пришло в голову это создать слой с использованием SymbolManager и попытаться перекрыть его слоем SymbolLayer. Недостаток этого решения в том, что перекрытие слоев осуществляется неправильно, можно сказать асинхронно. Например, может быть так, что кластер уже появился, а маркеры еще не пропали, или наоборот... Также кластер не до конца перекрывает маркеры. Кто сталкивался с такой задачей, подскажите как вы ее решили? Мое решение выглядит так. Заранее спасибо!

    int[] layers = new int[] { 0, ContextCompat.getColor(this, R.color.colorAccent) } ;
    private void createSymbols() {
        Expression pointCount = toNumber(get("point_count"));
        for (int i = 0; i < mCarData.getSize(); i++) {
            String color = ColorUtils.colorToRgbaString(ContextCompat.getColor(this, R.color.gray));
            if (mCarData.isOnline(i)) {
                if (mCarData.getDrive(i) == 1) {
                    color = ColorUtils.colorToRgbaString(ContextCompat.getColor(this, R.color.mapboxGreen));
                } else {
                    color = ColorUtils.colorToRgbaString(ContextCompat.getColor(this, R.color.mapbox_blue));
                }
            }
            createSymbol(mCarData.getLatLng(i), mCarData.getAngle(i), mCarData.getNumber(i), color, "ic_marker");
            symbolManager.setFilter(all(has("point_count",  gte(pointCount, literal(layers[0])))));
        }
    }
    private void createSymbol(LatLng latLng, float angle, String number, String color,@Nullable String icon) {
        SymbolOptions symbolOptions = new SymbolOptions()
                .withLatLng(latLng)
                .withIconImage(icon)
                .withIconSize(0.8f)
                .withTextField(number)
                .withIconRotate(angle)
                .setDraggable(false);
        markers.add(symbolManager.create(symbolOptions));
    }

    private void showCluster() {
        List<Feature> markerCoordinates = new ArrayList<>();
        for(int i = 0; i < mCarData.getSize(); i++) {
            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)
                                    .withTolerance(0.5f)
                                    .withClusterRadius(50)
                                    .withClusterMaxZoom(14)
                    )
            );
        } else {
            mSource.setGeoJson(FeatureCollection.fromFeatures(markerCoordinates));
        }
        for (int i = 0; i < layers.length; i++) {
            //Add clusters' circles
            CircleLayer circles = (CircleLayer) mStyle.getLayer("cluster-" + i);
            if (circles == null) {
                circles = new CircleLayer("cluster-" + i, "markers");
                circles.setProperties(
                        circleColor(layers[1]),
                        circleRadius(18f)
                );
                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(layers[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)
            );
            mStyle.addLayer(count);
        }
    }
READ ALSO
Метод JPArepository.save() кидает NullpointerException

Метод JPArepository.save() кидает NullpointerException

Пожалуйста помогите решить эту проблему, хотя бы в какую сторону копать решение

86
.sort() Не сортирует

.sort() Не сортирует

Размер ArrayList задаю через BufferedReader, вывожу сообщение о последнем элементе массива, далее сортируюsort()-ом

96
поиск символа в строке

поиск символа в строке

Имеется строка в которой может присутствовать любой один из пяти символов: & или @ или + или * или %

88
Какие типы изображений поддерживает iText?

Какие типы изображений поддерживает iText?

Я хочу добавить PNG-изображение в PDF-файл, но я знаю, что PDF не поддерживает PNG-файлыЗначит ли это, что я не могу использовать PNG-файлы в iText?

99