我已将谷歌地图集成到我的应用程序中,我想动态加载标记。所以这就是我做的事情
setOnCameraMoveListener
并覆盖onCameraMove
方法,每次用户在地图上滚动时我都会向用户屏幕坐标发送请求json
对象,标记为id,lat,lng)我会在这里添加一些代码片段
mMap.setOnCameraMoveListener(new GoogleMap.OnCameraMoveListener() {
@Override
public void onCameraMove() {
VisibleRegion vr = mMap.getProjection().getVisibleRegion();
LatLng top = vr.latLngBounds.northeast;
LatLng bottom = vr.latLngBounds.southwest;
String url = "http://192.168.137.1:3000/api/location/border?"
+ "leftLongitude=" + bottom.longitude
+ "&leftLatitude=" + bottom.latitude
+ "&rightLongitude=" + top.longitude
+ "&rightLatitude=" + top.latitude;
downloader.sendGetToServer(url);
}
});
public void sendGetToServer(String url) {
AndroidNetworking.get(url)
.setPriority(Priority.LOW)
.build()
.getAsString(new StringRequestListener() {
@Override
public void onResponse(String response) {
if(listener != null && response != null && response.length() > 0) {
listener.downloadComplete(response);
}
}
@Override
public void onError(ANError anError) {
Log.e("Error", anError.getMessage());
}
});
}
@覆盖
public void downloadComplete(String string) {
try {
Collection<MarkerItemData> mapMarkers = algorithm.getItems(); // get all markers from the map
JSONObject jsonObject = new JSONObject(string);
JSONArray respondArray = jsonObject.getJSONArray("respond");
for(int i=0; i<respondArray.length(); i++) {
JSONObject station = respondArray.getJSONObject(i);
int id = station.getInt("_id");
boolean skip = false;
for(MarkerItemData markerItemData : mapMarkers) {
if(markerItemData.getId() == id) {
skip = true;
break;
}
}
if(!skip) {
boolean criticalData = station.has("latitude") && station.has("longitude");
if (criticalData) {
double lat = station.getDouble("latitude");
double lng = station.getDouble("longitude");
MarkerItemData offsetItem = new MarkerItemData(id, lat, lng, 1, "");
mClusterManager.addItem(offsetItem);
}
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
所以我想知道还有其他想法吗?我不认为这种方法是最好的。首先,即使用户移动地图,我也会做出Web请求。此外,如果我下载大量标记,我的应用程序将非常慢。还有其他一些应用程序,比如PlugShare,已经使用大量标记实现了这种行为。