【问题标题】:How to remove the old marker of multiple updated location on Google Map in Android Studio?如何在 Android Studio 中删除谷歌地图上多个更新位置的旧标记?
【发布时间】:2022-01-03 23:21:21
【问题描述】:
private final HashMap<String, Marker> hm=new HashMap<String, Marker>();
 @Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
    mMap.getUiSettings().setZoomControlsEnabled(true);


    DatabaseReference db = FirebaseDatabase.getInstance().getReference();
    DatabaseReference userLocationRef = db.child("UserLocation");

    db.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {

            userLocationRef.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
                @Override
                public void onComplete(@NonNull Task<DataSnapshot> task) {
                    if (task.isSuccessful()) {


                        for (DataSnapshot ds : task.getResult().getChildren()) {
                            String userID = String.valueOf(ds.child("userID").getValue());

                            double lat = ds.child("You").child("l").child("0").getValue(Double.class);
                            double lng = ds.child("You").child("l").child("1").getValue(Double.class);
                            Log.d("TAG", lat + ", " + lng); //Check the values
                            Log.d("TAG", userID+"hi"); //Check the values

                            //Add location on Google Map
                            LatLng location = new LatLng(lat, lng);


                            if (hm.containsKey(userID)) {
                                hm.get(userID).remove();
                            }

                            currentLocationMarker = mMap.addMarker(new MarkerOptions().position(location).title(userID));
                            currentLocationMarker.showInfoWindow();
                            hm.put(userID, currentLocationMarker);







                        }
                    } else {
                        Log.d("TAG", task.getException().getMessage()); //Don't ignore potential errors!
                    }
                }
            });

        }

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

        }
    });}

上述代码用于从实时 Firebase 中检索多个用户的实时位置。 实时firebase的结构如下图所示:

当多个用户的位置发生变化时,标记开始更新用户的位置,但问题是当标记开始更新用户的新位置时,用户的旧标记并没有被删除。

问题如下图所示:

那么,问题是如何去除多个标记的旧标记,而地图只能为每个用户显示一个标记?如果您能提供帮助,谢谢!

【问题讨论】:

  • 尝试将addMarker 返回的markers 保存在map 对象中(我建议hashmap)并使用marker.remove 删除重复的标记。来源:Remove old markers on Google Map-安东尼
  • 如果您使用hashmap,您可以使用.contains 或其他实现的条件来跟踪哪个用户已经有标记并删除以前的标记。
  • 声明private HashMap&lt;string, Marker&gt; hm=new HashMap()&lt;&gt;,用String g=ds.child("you").child("g")获取g作为字符串(添加getValue),检查if(hm.contains(g))(替换你原来的if)然后hm.get(g).remove()在if中删除标记如果是。最后,像往常一样创建标记并使用hm.put(g, marker) 将其放入哈希图中。
  • 当您使用hm.get(userid).remove() 而不是hm.remove(userID) 时会发生什么?。
  • 有效!!!非常感谢!

标签: java android firebase firebase-realtime-database


【解决方案1】:

您正在尝试在数据库中存储和检索用户的每个位置信息(纬度、经度)。 但我认为对于地图上的显示,您可能只想显示用户的最新或当前位置。这样,地图中每个用户最多只能有一个标记。当用户的位置发生变化时,您可以更新相同的标记或删除现有标记并添加新标记。为此,您可以检查@alias 在上述 cmets 中对您的问题的建议。 要识别每个用户的最新位置,您可以将日期和时间与每条记录一起存储。以便您可以相应地查询数据库。

【讨论】:

  • 通过@alias建议的方法,现在可以删除旧的标记。你能解释一下如何在每条记录中存储日期和时间吗?这样我就可以相应地查询数据库并在地图上显示多个标记(用户位置)。
猜你喜欢
  • 2018-06-06
  • 2019-03-07
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
相关资源
最近更新 更多