TransWikia.com

OSMDroid работа с Overlays и SimpleFastPointOverlay в частности

Stack Overflow на русском Asked by Mulber on February 4, 2021

Собственно возник вопрос по работе с оверлеями OSMDroid. Допустим, у меня их несколько (1 – компас, 2 – маркеры и т.д). Не понимаю принципа работы с оными. По примеру из OSMDroid, добавляю Overlay с множеством геоточек с быстрой отрисовкой:

private void loadChats() {
    // create and set up a clusterer
    final List<IGeoPoint> points = new ArrayList<>();

    DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    DatabaseReference chatsRef = rootRef.child("ChatsP");
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            for(DataSnapshot ds : snapshot.getChildren()) {
                String name = ds.child("name").getValue(String.class);
                Double lat = Double.parseDouble(String.valueOf(ds.child("lat").getValue()).replace(",", "."));
                Double lon = Double.parseDouble(String.valueOf(ds.child("lon").getValue()).replace(",", "."));

                points.add(new LabelledGeoPoint(lat, lon, name));
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {

        }
    };

    chatsRef.addListenerForSingleValueEvent(valueEventListener);

    // wrap them in a theme
    SimplePointTheme pt = new SimplePointTheme(points, true);

    // create label style
    Paint textStyle = new Paint();
    textStyle.setStyle(Paint.Style.FILL);
    textStyle.setColor(Color.parseColor("#FF7700"));
    textStyle.setTextAlign(Paint.Align.CENTER);
    textStyle.setTextSize(24);

    Paint pointStyle = new Paint();
    pointStyle.setStrokeWidth(0);
    pointStyle.setColor(Color.parseColor("#FF7700"));

    // set some visual options for the overlay
    // we use here MAXIMUM_OPTIMIZATION algorithm, which works well with >100k points
    SimpleFastPointOverlayOptions opt = SimpleFastPointOverlayOptions.getDefaultStyle()
            .setAlgorithm(SimpleFastPointOverlayOptions.RenderingAlgorithm.MAXIMUM_OPTIMIZATION)
            .setSymbol(SimpleFastPointOverlayOptions.Shape.CIRCLE)
            .setPointStyle(pointStyle)
            .setSelectedPointStyle(pointStyle)
            .setMinZoomShowLabels(12)
            .setMaxNShownLabels(120)
            .setRadius(12).setIsClickable(true).setCellSize(15).setTextStyle(textStyle);

    // create the overlay with the theme
    final SimpleFastPointOverlay sfpo = new SimpleFastPointOverlay(pt, opt);

    // onClick callback
    sfpo.setOnClickListener(new SimpleFastPointOverlay.OnClickListener() {
        @Override
        public void onClick(SimpleFastPointOverlay.PointAdapter points, Integer point) {

        }
    });

    // add overlay
    map.getOverlays().add(sfpo);
}

Таким образом, массово добавили точки на один Overlay, который добавили к MapView.
Теперь мне необходимо в real-time добавить точку на этот оверлей, не создавать же отдельные для каждой новой точки? Каждый раз пересоздавать оверлей с вновь добавленной точкой (удалить старый, добавив вместо него новый, со старыми точками + новой точкой), или как?
Спасибо!

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP