Я использую 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" в приведенном выше коде), который был перемещен (или удален). Если маркер был перемещен, запись будет содержать новую информацию о широте и долготе.
Заранее благодарим за помощь.