我使用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”函数接收相同的标记标识符。我可以简单地删除现有标记并添加一个新标记,但如果可能的话,我更愿意移动现有标记。
这是一个已知的问题吗?
在您的代码中 问题在这里
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上选定的标记图标,因此我有以下代码: 在这一行,我从下面得到错误: 例外情况如下: