问题
I seek to change the position of markers in google maps with the value of the real-time database
I try to mMap.clear to but it's not the right solution because if I have 100 markers and change position of 1 marker the 100 is clear and reposition for make 1 marker change
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
mMap.clear();
for (DataSnapshot ds : dataSnapshot.getChildren()) {
Double lang = ds.child("lang").getValue(Double.class);
Double lat = ds.child("lat").getValue(Double.class);
save = new model(lat, lang);
ll = new LatLng(save.getLat(), save.getLang());
mCurrLocationMarker = mMap.addMarker(options
.position(ll));
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
I try to change position for the marker but actual results add a new one if I not write mMap.clear and clear all markers and added them for change one marker if I write mMap.clear
回答1:
Without removing marker update new position in google map()
1.initially created marker:
Double lang = ds.child("lang").getValue(Double.class);
Double lat = ds.child("lat").getValue(Double.class);
LatLng latLng=new latLng(lang ,lat )
// Creating a marker
Marker marker= mMap.addMarker(new MarkerOptions()
.position(latLng)
.draggable(true));
2.while getting updateedlocation
LatLng oldLocation, newLocaation;
float bearing = (float) bearingBetweenLocations(oldLocation, newLocaation);
rotateMarker(marker, bearing);
private double bearingBetweenLocations(LatLng perviousPos,LatLng newPos) {
double PI = 3.14159;
double lat1 = perviousPos.latitude * PI / 180;
double long1 = perviousPos.longitude * PI / 180;
double lat2 = newPos.latitude * PI / 180;
double long2 = newPos.longitude * PI / 180;
double dLon = (long2 - long1);
double y = Math.sin(dLon) * Math.cos(lat2);
double x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1)
* Math.cos(lat2) * Math.cos(dLon);
double brng = Math.atan2(y, x);
brng = Math.toDegrees(brng);
brng = (brng + 360) % 360;
return brng;
}
.To rotate marker using above bearing angle i have used this code
Here isMarkerRotating is a boolean value. Add isMarkerRotating = false in OnCreate
method
private void rotateMarker(final Marker marker, final float toRotation) {
if(!isMarkerRotating) {
final Handler handler = new Handler();
final long start = SystemClock.uptimeMillis();
final float startRotation = marker.getRotation();
final long duration = 2000;
final Interpolator interpolator = new LinearInterpolator();
handler.post(new Runnable() {
@Override
public void run() {
isMarkerRotating = true;
long elapsed = SystemClock.uptimeMillis() - start;
float t = interpolator.getInterpolation((float) elapsed / duration);
float rot = t * toRotation + (1 - t) * startRotation;
float bearing = -rot > 180 ? rot / 2 : rot;
marker.setRotation(bearing);
if (t < 1.0) {
// Post again 16ms later.
handler.postDelayed(this, 16);
} else {
isMarkerRotating = false;
}
}
});
}
}
回答2:
I suggest store marker in an array or Hashmap throw which you can update whenever you want like bellow.
// code for ploat and store marker
HashMap<String, Marker> mPlotedMarker = new HashMap<>();
if (mMap != null) {
mMap.clear();
ArrayList<MarkerDataModel> mDataList = new ArrayList<>();
//With Hash map
for (int positon = 0; positon < mDataList.size(); positon++) {
LatLng markerPosition = new LatLng(mDataList.get(positon).getMarkerLat(), mDataList.get(positon).getMarkerLong());
Marker marker = mMap.addMarker(new MarkerOptions().position(markerPosition)
.title(mDataList.get(positon).getMarkerTitle()));
mPlotedMarker.put(mDataList.get(positon).getMarkerId(), marker);
}
}
//Now whenever you want to update
String markerId="1"; // replace which you want to update
if(mPlotedMarker.containsKey(markerId)){
Marker marker=mPlotedMarker.get(markerId);
if(marker!=null){
marker.setPosition(newPostion); //Specifie new position
}
}
回答3:
You can store marker object as a global variable and just change selected markers position on location change.
Like,
if (mCurrLocationMarker == null)
mCurrLocationMarker = mGoogleMap.addMarker(new MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_pin_red)).position(location));
else
mCurrLocationMarker.setPosition(location);
As you have more then one markers, you can try the same logic by using ArrayList or LinkedHashMap.
Please check this file: https://filebin.net/m2vgvcms6g73kef2/TestFragment.java?t=e9g0tdki
Hope it helps.. :)
来源:https://stackoverflow.com/questions/55570188/change-markers-position-base-on-realtime-firebase-lat-and-lang-values