Как обновить Mapbox Android Symbol layer новыми маркерами - PullRequest
1 голос
/ 16 марта 2020

Я использую SDK Mapbox Android и хочу заполнить карту маркерами, чьи местоположения хранятся в базе данных Firebase, общей для всех пользователей моего приложения. Каждый маркер хранится в уникальной записи, и каждая запись содержит широту и долготу маркера вместе с логическим значением, указывающим, было ли местоположение проверено. Я успешно сделал это с помощью Mapbox iOS SDK с использованием аннотаций. Когда приложение Android запущено, я создаю список характеристик всех маркеров в базе данных, используя symbolOptions, как показано ниже внутри слушателя FireBase «childAdded» (другие слушатели также реализованы как часть ChildEventListener):

        DatabaseReference dbRef = FirebaseDatabase.getInstance().getReference();
        DatabaseReference markerRef = dbRef.child("markers");
        //load all markers when app starts
        //child added returns all markers, then listens for new additions
        //Log.i(TAG, "Database Reference: " + dbRef);
        List<SymbolOptions> options = new ArrayList<> ();
        markerRef.addChildEventListener ( new ChildEventListener () {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                markerRead = markerRead+1;
                markerKey = dataSnapshot.getKey();
                Log.i(TAG, "Adding Markers: ");
                Log.i(TAG, "Marker Key: " + markerKey);
                x = (Double)dataSnapshot.child ( "x" ).getValue();
                y = (Double) dataSnapshot.child ( "y" ).getValue();
                v = (Boolean) dataSnapshot.child ( "v" ).getValue();
                Log.i(TAG, "Marker Data - x: " + x + " y: " + y + " v: " + v);

                if(v == true) {
                    options.add(new SymbolOptions ()
                            .withLatLng ( new LatLng (y,x))
                            .withIconImage ( "verified" )
                            .withIconAnchor ( "bottom" )
                            .withDraggable ( false )
                    );
                } else {
                    options.add(new SymbolOptions ()
                        .withLatLng ( new LatLng (y,x))
                        .withIconImage ( "unverified" )
                        .withIconAnchor ( "bottom" )
                        .withDraggable ( false )
                    );
                }
                if (markerRead == 1) {
                    symbols = symbolManager.create(options);
                }
            }


Приведенный выше код заполняет список возможностей, но, поскольку у меня нет возможности узнать, когда функция «childAdded» в Firebase завершила начальное чтение базы данных, в приведенном выше добавляется только первый маркер.

Я пытался найти документацию Mapbox о том, как добавить аннотации, аналогичные iOS SDK, но безуспешно. Учебные видео не были обновлены и используют "addMarker", который устарел.

Мне нужно добавить маркеры на карту, а также мне нужно назначить уникальный идентификатор ("markerKey" в приведенном выше коде) каждому маркеру, так что отдельный маркер может быть изменен или удален в будущем. Также на карте должны отображаться новые маркеры, которые добавляются и обнаруживаются слушателем «Добавленный ребенок». Я не нашел способа отображения дополнений в списке объектов при добавлении и создании символов.

Как только маркеры изначально добавлены на карту, приложение «прослушивает» базу данных Firebase для следующего события:

  • Добавлен новый маркер
  • Существующий маркер перемещен в новое место
  • Существующий маркер удален

Когда маркер перемещается или удаляется, соответствующий слушатель базы данных получает уведомление и передает номер записи (ключ) маркера ("markerKey" в приведенном выше коде), который был перемещен (или удален). Если маркер был перемещен, запись будет содержать новую информацию о широте и долготе.

Заранее благодарим за помощь.

...