【发布时间】: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