如何在 Android Studio 中删除谷歌地图上多个更新位置的旧标记?

Posted

技术标签:

【中文标题】如何在 Android Studio 中删除谷歌地图上多个更新位置的旧标记?【英文标题】:How to remove the old marker of multiple updated location on Google Map in 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) 时会发生什么?。 有效!!!非常感谢! 【参考方案1】:

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

【讨论】:

通过@alias建议的方法,现在可以删除旧的标记。你能解释一下如何在每条记录中存储日期和时间吗?这样我就可以相应地查询数据库并在地图上显示多个标记(用户位置)。

以上是关于如何在 Android Studio 中删除谷歌地图上多个更新位置的旧标记?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android Studio 中删除谷歌地图上多个更新位置的旧标记?

有时我在 Android Studio 中遇到谷歌地图问题,但并非总是如此。为啥?如何删除谷歌地图上方的白条?

离子框架:不在设备上加载谷歌地图库

如何在 Android Studio 中添加捕捉到道路谷歌地图

如何在我的微调器中使用 getItemAtPosition 从谷歌地图中的火力基地使用 android studio

在谷歌地图 V2 android studio 中单击 InfoWindowClick 时,如何设置唯一键?