【问题标题】:How to reload TileOverlay for geoserver tiles on android google map v2 implementation如何在 android google map v2 实现上为 geoserver 瓦片重新加载 TileOverlay
【发布时间】:2015-05-28 10:02:12
【问题描述】:

我正在使用 geoserve 实现来检索我的地图图块。 我请求切片的方式是,当相机更改地图上的视图时,它会触发我的 api 调用,然后发送地图中心视图的纬度和经度,然后 api 响应 TileOverlay 的 getTileUrl 所需的地理服务器层列表。

但不幸的是,当我的 Api 返回图层列表时,getTileUrl 已经被触发并且我的图块没有呈现。

简而言之,我的地理服务器请求的图层参数是动态变化的。所以我的问题是如何触发再次加载地图叠加层,以便当我的 Api 返回列表时,它会重新加载带有适当图层的叠加层。

这是我对 OnCameraChangeListener 的实现:

private GoogleMap.OnCameraChangeListener cameraChange = new GoogleMap.OnCameraChangeListener() {
    @Override
    public void onCameraChange(CameraPosition cameraPosition) {
        LatLng latLng = map.getCameraPosition().target;
        getLayerLists(latLng);
    }
};

这里是getLayerList方法:

private void getLayerList(LatLng latLng) {
    nigsApi.getLayerForArea(TAG_FLOOD_MAP_REQUEST,
            String.valueOf(latLng.latitude), String.valueOf(latLng.longitude),
            onApiResponse);
}

这是返回层列表的 onApiResponse 回调:

private OnApiResponse<NigsApi.ResponsePair<List<String>>> onApiResponse = new OnApiResponse<NigsApi.ResponsePair<List<String>>>() {
    @Override
    public void onRequestSuccessful(NigsApi.ResponsePair<List<String>> result) {
        tileProviderFactory.setLayerArea(result.getResult());
    }

    @Override
    public void onRequestFailed(String errorMessage, Object tag) {
        Log.e("Maps", errorMessage);
    }

    @Override
    public void onRequestError(RetrofitError error, Object tag) {
        Log.e("Maps", error.getMessage());
    }
};

响应后它转到 My TileProviderFactory 类并设置 getTileUrl 所需的层列表。

这里是 getTileUrl 的块:

public void setLayerArea(List<String> listLayer){
    this.listLayer = listLayer;
}    

public WmsTileProvider getOsgeoWmsTileProvider() {

    //This is configured for:
    // http://beta.sedac.ciesin.columbia.edu/maps/services
    // (TODO check that this WMS service still exists at the time you try to run this demo,
    // if it doesn't, find another one that supports EPSG:900913
    final String WMS_FORMAT_STRING =
            "http://202.90.153.87:8080/geoserver/flood_100/wms?" +
                    "service=WMS" +
                    "&version=1.1.0" +
                    "&request=GetMap" +
                    "&bbox=%f,%f,%f,%f" +
                    "&width=256" +
                    "&height=256" +
                    "&srs=EPSG:900913" +
                    "&format=image/png" +
                    "&transparent=true" +
                    "&tiled=true";

    WmsTileProvider tileProvider = new WmsTileProvider(256,256) {
        @Override
        public synchronized URL getTileUrl(int x, int y, int zoom) {
            double[] bbox = getBoundingBox(x, y, zoom);

            String layerTitles = getLayerTitles();

            String s = String.format(Locale.US, WMS_FORMAT_STRING, bbox[MINX],
                    bbox[MINY], bbox[MAXX], bbox[MAXY]);

            s = s + layerTitles;

            Log.e("MapLayers", s);
            URL url = null;

            try {
                url = new URL(s);
            } catch (MalformedURLException e) {
                throw new AssertionError(e);
            }
            return url;
        }
    };

    return tileProvider;
}

getLayerTitles() 方法将所有图层连接成一个字符串并将其附加到 WMS_FORMAT_STRING url..

private String getLayerTitles(){
    if (listLayer.size() == 0) {
        return layers;
    } else {
        layers = "&layers=";
        for (String location : listLayer) {
            if (layers.equals("&layers="))
                layers = layers + location;
            else
                layers = layers + "," + location;
        }
        return layers;
    }
}

【问题讨论】:

    标签: android google-maps-android-api-2 geoserver


    【解决方案1】:

    你需要渲染多少层?您是否需要一次渲染所有这些?

    如果可以的话,最好每层创建一个WmsTileProvider;这将使您能够精细地启用或禁用图层。

    如果您需要(或想要)一次渲染所有这些,您可以以更智能的方式使用您的 getTileUrl:

    在您的 WmsTileProvider 中创建一个允许您设置图层的方法(您可以在类中创建一个 mLayers String 变量并更改 getLayersTitles 方法以更改此变量而不是返回它),然后在需要时调用此方法更改图层列表并调用 clearTileCache:

    https://developers.google.com/android/reference/com/google/android/gms/maps/model/TileOverlay#clearTileCache%28%29

    您的图块将重新加载新图层...

    代码(抱歉格式错误):

    public void setLayerArea(List<String> listLayer){
      this.mLayers = getLayerTitles(listLayer);
    }   
    
    private String getLayerTitles(List<String> listLayer){
    if (listLayer.size() == 0) {
        return "DEFAULT LAYERS";
    } else {
        layers = "&layers=";
        for (String location : listLayer) {
            if (layers.equals("&layers="))
                layers = layers + location;
            else
                layers = layers + "," + location;
        }
        return layers;
    }
    } 
    
    public WmsTileProvider getOsgeoWmsTileProvider() {
    
    //This is configured for:
    // http://beta.sedac.ciesin.columbia.edu/maps/services
    // (TODO check that this WMS service still exists at the time you try to run this demo,
    // if it doesn't, find another one that supports EPSG:900913
    final String WMS_FORMAT_STRING =
            "http://202.90.153.87:8080/geoserver/flood_100/wms?" +
                    "service=WMS" +
                    "&version=1.1.0" +
                    "&request=GetMap" +
                    "&bbox=%f,%f,%f,%f" +
                    "&width=256" +
                    "&height=256" +
                    "&srs=EPSG:900913" +
                    "&format=image/png" +
                    "&transparent=true" +
                    "&tiled=true";
    
    WmsTileProvider tileProvider = new WmsTileProvider(256,256) {
        @Override
        public synchronized URL getTileUrl(int x, int y, int zoom) {
            double[] bbox = getBoundingBox(x, y, zoom);
    
            String s = String.format(Locale.US, WMS_FORMAT_STRING, bbox[MINX],
                    bbox[MINY], bbox[MAXX], bbox[MAXY]);
    
            s = s + this.mLayers;
    
            Log.e("MapLayers", s);
            URL url = null;
    
            try {
                url = new URL(s);
            } catch (MalformedURLException e) {
                throw new AssertionError(e);
            }
            return url;
        }
    };
    
    return tileProvider;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-07-28
      • 2014-03-06
      • 1970-01-01
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多