当前位置: 首页 > 知识库问答 >
问题:

移动标记时,谷歌地图会显示两个标记

冯嘉珍
2023-03-14

我使用Google Maps Android SDK在地图上添加标记,这些标记的位置存储在我的应用程序的所有用户都可以使用的Firebase数据库中。每个标记的数据存储在唯一的Firebase记录中,每个记录包含纬度

  • 添加了一个新标记。
  • 更改现有标记(移动到新位置和/或“验证”)
  • 删除现有标记

我实现了一个哈希图,如如何使用Firebase Google Maps API Android中的数据更新标记位置中所示。

添加标记后,条目将添加到哈希映射中,其中 Firebase pushID(键)用作哈希映射中标记对象的索引(请参阅下面的代码)。

    private Map<String, Marker> mMarkerMap = new HashMap<> ();
        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) {
                try {
                    markerKey = dataSnapshot.getKey ();
                    Log.i ( TAG, "Adding Markers: " );
                    Log.i ( TAG, "Marker Key: " + markerKey );
                    double x = (Double) dataSnapshot.child ( "x" ).getValue ();
                    double y = (Double) dataSnapshot.child ( "y" ).getValue ();
                    boolean v = (Boolean) dataSnapshot.child ( "v" ).getValue ();
                    Log.i ( TAG, "Marker Data - x: " + x + " y: " + y + " v: " + v );
                    if (v == true) {
                        Marker marker = mMap.addMarker ( new MarkerOptions ()
                                .position ( new LatLng ( y, x ) )
                                .icon ( BitmapDescriptorFactory.fromResource ( R.drawable.verified ) ) );
                        marker.setTag(markerKey);
                        mMarkerMap.put (markerKey, marker);
                    } else {
                        Marker marker = mMap.addMarker ( new MarkerOptions ()
                                .position ( new LatLng ( y, x ) )
                                .icon ( BitmapDescriptorFactory.fromResource ( R.drawable.unverified ) ) );
                        marker.setTag(markerKey);
                        mMarkerMap.put (markerKey, marker);
                    }
                } catch (Error error) {
                    noFirebaseAccessAlert ();
                }
            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                try {
                    markerKey = dataSnapshot.getKey ();
                    Log.i ( TAG, "Changing Marker: " );
                    Log.i ( TAG, "Marker Key: " + markerKey );
                    double x = (Double) dataSnapshot.child ( "x" ).getValue ();
                    double y = (Double) dataSnapshot.child ( "y" ).getValue ();
                    boolean v = (Boolean) dataSnapshot.child ( "v" ).getValue ();
                    Log.i ( TAG, "Marker Data - x: " + x + " y: " + y + " v: " + v );
                    Marker changedMarker = mMarkerMap.get(markerKey);
                    if (v == true) {
                        changedMarker.setPosition (new LatLng(y,x));
                        changedMarker.setIcon ( BitmapDescriptorFactory.fromResource ( R.drawable.verified ) );
                    } else {
                        changedMarker.setPosition (new LatLng(y,x));
                        changedMarker.setIcon ( BitmapDescriptorFactory.fromResource ( R.drawable.unverified ) );
                    }
                } catch (Error error) {
                    noFirebaseAccessAlert ();
                }
            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
                try {
                    markerKey = dataSnapshot.getKey ();
                    Log.i ( TAG, "Deleting Marker: " );
                    Log.i ( TAG, "Marker Key: " + markerKey );
                    Marker deletedMarker = mMarkerMap.get (markerKey);
                    deletedMarker.remove ();
                    mMarkerMap.remove(markerKey);
                } catch (Error error) {
                    noFirebaseAccessAlert ();
                }
            }

问题在于,当数据在Firebase中更改并调用“childChanged”侦听器时,会在地图上更新的位置放置一个新图标,但原始图标仍保留。哈希表中没有新条目。

如果我点击任一图标,“onClickMarker”函数接收相同的标记标识符。我可以简单地删除现有标记并添加一个新标记,但如果可能的话,我更愿意移动现有标记。

这是一个已知的问题吗?

共有1个答案

翟学文
2023-03-14

在您的代码中 问题在这里

Marker marker = mMap.addMarker ( new MarkerOptions ()
                                .position ( new LatLng ( y, x ) )
                                .icon ( BitmapDescriptorFactory.fromResource ( R.drawable.verified ) ) );

您每次创建新的标记对象,无需每次创建新的标记对象,您只需在创建对象后设置您的标记位置once.like下面的代码。

Marker marker;

            if (mMap != null) {
                if (marker == null) {
                    MarkerOptions options = new MarkerOptions().position(mLatlng)
                            .title(mCity);
                    marker = mMap.addMarker(options);
                } else {
                    marker.setPosition(mLatlng);
                }
                mMap.moveCamera(CameraUpdateFactory.newLatLng(mLatlng));
                mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(mLatlng, 15f));
            }
 类似资料:
  • 问题内容: 我想在Google Maps android上显示带有多个标记的位置,问题是当我运行我的应用程序时,它只显示一个位置/标记,这是我的代码: 我不知道我的错在哪里,希望有人能帮助我解决我的问题,非常感谢你 问题答案: 用这个: 或者,您也可以使用以下命令: 其中 纬度 和 经度 是存储在数组列表中的具有不同名称的字符串.....

  • 我有代码允许我输入带有纬度和经度的位置名称,然后地图用标记显示位置。 我遇到的问题是,我希望地图显示所有位置,每个位置都有自己的标记。 下面是我用来获取地图上显示的一个位置的代码 非常感谢您的帮助 我没有错误只是显示了一个位置,我已添加到Firebasedatabase

  • 如何显示中心半径内的标记?我需要显示基于半径的位置,因为这将是我根据一个位置的km半径来查找此类位置的函数的基础。 正如你所看到的,我有许多记号笔。这是通过调用axios请求从我的数据库得到的。 这是我的代码片段

  • 我正在尝试创建一个Google地图标记图标,该图标显示为特定标记的警报。该计划是在地图加载后动态增加图标的strokeWeight。 我对警报的想法是:将外部“红色”的strokewweight从1增加到30,然后从1重新启动到30,这样看起来就像是对红色图标发出警报。 参考:谷歌地图标记图标填充在图标填充颜色和strokeColor之间 我的标记代码: 尝试1:触发器确实有效:( 尝试2:这对循

  • 我成功创建了一个活动,用户可以在其中发布他的状态并将他的当前位置放置在android工作室中创建的google map中。我还尝试在map中查看所有其他用户,我成功地做到了。但是,随着他们的位置发生变化,不断增加。我想实现这样一种情况,即用户在移动时可以在地图上看到彼此,并且这些也会相应地移动。我使用Firebase作为我的后端来存储他们的位置和状态。这是我想出的代码。 请帮帮我!提前感谢!:)

  • 我想更改Google Maps上选定的标记图标,因此我有以下代码: 在这一行,我从下面得到错误: 例外情况如下: