Android地图动态地从服务器加载标记

时间:2017-01-05 18:03:08

标签: android google-maps client-server google-maps-markers

我已将谷歌地图集成到我的应用程序中,我想动态加载标记。所以这就是我做的事情

  • 获得左下角和右上角的屏幕坐标
  • 注册setOnCameraMoveListener并覆盖onCameraMove方法,每次用户在地图上滚动时我都会向用户屏幕坐标发送请求
  • 服务器仅返回用户屏幕范围内的标记(返回为json对象,标记为id,lat,lng)
  • 检查地图上是否存在新下载的标记ID,以及是否在地图上添加新标记

我会在这里添加一些代码片段

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,已经使用大量标记实现了这种行为。

0 个答案:

没有答案