Google 地图android: 多个标记的实时更新位置
Google Maps android: Live update position of multiple markers
我正在尝试创建一张地图,显示指定人员在 Google Map
上的位置。我已经设置了一个带有 MySQL 数据库的网络服务器。每当 android 应用程序运行时,它都会将用户的当前位置存储在数据库中。之后,每当 onLocationChanged()
被调用时,该应用程序会在用户位置的邻近范围(比如 50 公里)内获取(比如 10 个人)的位置数据。使用这些位置坐标,我在地图上添加了多个标记。现在我面临以下问题:
当10个人的位置数据发生变化时,正在创建新的标记而不是原来的标记改变其位置。
当这10个人中的任何一个的位置数据从数据库中删除时,相应的标记仍然在地图上。
注意:我正在使用 JSON 从服务器获取数据并解析 IntentService
中的 JSON 数据以创建标记。
这是我解析的方式 JSON:
@Override
protected void onHandleIntent(Intent intent) {
if (intent != null) {
String json_result = intent.getExtras().getString("JSON Data");
try {
JSONObject jsonObject = new JSONObject(json_result);
JSONArray jsonArray = jsonObject.getJSONArray("location data");
int counter = 0;
String name, lat, lng;
double dist;
int arrayLength;
while (counter < jsonArray.length()) {
JSONObject object = jsonArray.getJSONObject(counter);
name = object.getString("name");
lat = object.getString("lat");
lng = object.getString("lng");
dist = object.getDouble("distance");
arrayLength = jsonArray.length();
Intent jsonDataIntent = new Intent();
jsonDataIntent.setAction(Constants.STRING_ACTION);
jsonDataIntent.putExtra(Constants.STRING_NAME, name);
jsonDataIntent.putExtra(Constants.STRING_LAT, lat);
jsonDataIntent.putExtra(Constants.STRING_LNG, lng);
jsonDataIntent.putExtra(Constants.STRING_DIST, dist);
jsonDataIntent.putExtra(Constants.STRING_LENGTH, arrayLength);
jsonDataIntent.putExtra(Constants.STRING_ID, counter);
LocalBroadcastManager.getInstance(this).sendBroadcast(jsonDataIntent);
counter++;
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
下面是我如何使用解析的 JSON 数据来创建标记:
private class ParseJSONDataReceiver extends BroadcastReceiver {
Marker usersMarker;
double lat, lng, dist;
int numberOfConnections, id;
HashMap<Marker,Integer> hashMap = new HashMap<>();
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null) {
String name = intent.getExtras().getString(ParseJSONDataService.Constants.STRING_NAME);
lat = Double.parseDouble(intent.getExtras().getString(ParseJSONDataService.Constants.STRING_LAT));
lng = Double.parseDouble(intent.getExtras().getString(ParseJSONDataService.Constants.STRING_LNG));
dist = intent.getExtras().getDouble(ParseJSONDataService.Constants.STRING_DIST);
numberOfConnections = intent.getExtras().getInt(ParseJSONDataService.Constants.STRING_LENGTH);
id = intent.getExtras().getInt(ParseJSONDataService.Constants.STRING_ID) + 1;
usersMarker = mMap.addMarker(new MarkerOptions()
.position(new LatLng(lat, lng))
.title("Name: " + name)
.snippet(id + ": Distance: " + dist + " Km")
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
hashMap.put(usersMarker,id);
}
}
}
谁能帮我解决以上问题????
要更新现有标记的位置,您需要更改代码,请使用 HashMap<Integer, Marker>
而不是 HashMap<Marker, Integer>
,这样您就可以通过用户 ID 查询您的地图:
HashMap<Integer, Marker> hashMap = new HashMap<>();
然后,您像这样添加我们的标记(更新现有标记):
if (hashMap.containsKey(id)) {
Marker marker = hashMap.get(id);
marker.setPosition(new LatLng(lat, lng)); // Update your marker
} else {
usersMarker = mMap.addMarker(new MarkerOptions()
.position(new LatLng(lat, lng))
.title("Name: " + name)
.snippet(id + ": Distance: " + dist + " Km")
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
hashMap.put(id, usersMarker);
}
如果要删除用户,还需要从地图和 HashMap
:
中删除其标记
Marker marker = hashMap.get(id);
if (marker!= null) {
marker.remove();
hashMap.remove(id);
}
我正在尝试创建一张地图,显示指定人员在 Google Map
上的位置。我已经设置了一个带有 MySQL 数据库的网络服务器。每当 android 应用程序运行时,它都会将用户的当前位置存储在数据库中。之后,每当 onLocationChanged()
被调用时,该应用程序会在用户位置的邻近范围(比如 50 公里)内获取(比如 10 个人)的位置数据。使用这些位置坐标,我在地图上添加了多个标记。现在我面临以下问题:
当10个人的位置数据发生变化时,正在创建新的标记而不是原来的标记改变其位置。
当这10个人中的任何一个的位置数据从数据库中删除时,相应的标记仍然在地图上。
注意:我正在使用 JSON 从服务器获取数据并解析 IntentService
中的 JSON 数据以创建标记。
这是我解析的方式 JSON:
@Override
protected void onHandleIntent(Intent intent) {
if (intent != null) {
String json_result = intent.getExtras().getString("JSON Data");
try {
JSONObject jsonObject = new JSONObject(json_result);
JSONArray jsonArray = jsonObject.getJSONArray("location data");
int counter = 0;
String name, lat, lng;
double dist;
int arrayLength;
while (counter < jsonArray.length()) {
JSONObject object = jsonArray.getJSONObject(counter);
name = object.getString("name");
lat = object.getString("lat");
lng = object.getString("lng");
dist = object.getDouble("distance");
arrayLength = jsonArray.length();
Intent jsonDataIntent = new Intent();
jsonDataIntent.setAction(Constants.STRING_ACTION);
jsonDataIntent.putExtra(Constants.STRING_NAME, name);
jsonDataIntent.putExtra(Constants.STRING_LAT, lat);
jsonDataIntent.putExtra(Constants.STRING_LNG, lng);
jsonDataIntent.putExtra(Constants.STRING_DIST, dist);
jsonDataIntent.putExtra(Constants.STRING_LENGTH, arrayLength);
jsonDataIntent.putExtra(Constants.STRING_ID, counter);
LocalBroadcastManager.getInstance(this).sendBroadcast(jsonDataIntent);
counter++;
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
下面是我如何使用解析的 JSON 数据来创建标记:
private class ParseJSONDataReceiver extends BroadcastReceiver {
Marker usersMarker;
double lat, lng, dist;
int numberOfConnections, id;
HashMap<Marker,Integer> hashMap = new HashMap<>();
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null) {
String name = intent.getExtras().getString(ParseJSONDataService.Constants.STRING_NAME);
lat = Double.parseDouble(intent.getExtras().getString(ParseJSONDataService.Constants.STRING_LAT));
lng = Double.parseDouble(intent.getExtras().getString(ParseJSONDataService.Constants.STRING_LNG));
dist = intent.getExtras().getDouble(ParseJSONDataService.Constants.STRING_DIST);
numberOfConnections = intent.getExtras().getInt(ParseJSONDataService.Constants.STRING_LENGTH);
id = intent.getExtras().getInt(ParseJSONDataService.Constants.STRING_ID) + 1;
usersMarker = mMap.addMarker(new MarkerOptions()
.position(new LatLng(lat, lng))
.title("Name: " + name)
.snippet(id + ": Distance: " + dist + " Km")
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
hashMap.put(usersMarker,id);
}
}
}
谁能帮我解决以上问题????
要更新现有标记的位置,您需要更改代码,请使用 HashMap<Integer, Marker>
而不是 HashMap<Marker, Integer>
,这样您就可以通过用户 ID 查询您的地图:
HashMap<Integer, Marker> hashMap = new HashMap<>();
然后,您像这样添加我们的标记(更新现有标记):
if (hashMap.containsKey(id)) {
Marker marker = hashMap.get(id);
marker.setPosition(new LatLng(lat, lng)); // Update your marker
} else {
usersMarker = mMap.addMarker(new MarkerOptions()
.position(new LatLng(lat, lng))
.title("Name: " + name)
.snippet(id + ": Distance: " + dist + " Km")
.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)));
hashMap.put(id, usersMarker);
}
如果要删除用户,还需要从地图和 HashMap
:
Marker marker = hashMap.get(id);
if (marker!= null) {
marker.remove();
hashMap.remove(id);
}