/*
* Copyright (C) 2015 Baidu, Inc. All Rights Reserved.
*/
package baidumapsdk.demo.map;
import android.app.Activity;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.EditText;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.FileTileProvider;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Tile;
import com.baidu.mapapi.map.TileOverlay;
import com.baidu.mapapi.map.TileOverlayOptions;
import com.baidu.mapapi.map.TileProvider;
import com.baidu.mapapi.map.UrlTileProvider;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.model.LatLngBounds;
import java.io.InputStream;
import java.nio.ByteBuffer;
import baidumapsdk.demo.R;
import baidumapsdk.demo.map.BaseMapDemo;
/**
* TileOverlay 测试demo
* <p/>
*/
public class TileOverlayDemo extends Activity implements BaiduMap.OnMapLoadedCallback {
@SuppressWarnings("unused")
private static final String LTAG = BaseMapDemo.class.getSimpleName();
private MapView mMapView;
private BaiduMap mBaiduMap;
private Button mOnline;
private Button mOffline;
// 设置瓦片图的在线缓存大小,默认为20 M
private static final int TILE_TMP = 20 * 1024 * 1024;
private static final int MAX_LEVEL = 21;
private static final int MIN_LEVEL = 3;
private EditText mEditText;
private CheckBox hidePoiInfo = null;
TileProvider tileProvider;
TileOverlay tileOverlay;
Tile offlineTile;
MapStatusUpdate mMapStatusUpdate;
private final String onlineUrl = "http://api0.map.bdimg.com/customimage/tile"
+ "?&x={x}&y={y}&z={z}&udt=20150601&customid=light";
private boolean mapLoaded = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tile_overlay_demo);
mMapView = (MapView) findViewById(R.id.mapview);
mBaiduMap = mMapView.getMap();
mBaiduMap.setOnMapLoadedCallback(this);
MapStatus.Builder builder = new MapStatus.Builder();
builder.zoom(16.0f);
builder.target(new LatLng(39.914935D, 116.403119D));
mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(builder.build());
mBaiduMap.setMapStatus(mMapStatusUpdate);
mOnline = (Button) findViewById(R.id.online);
mOffline = (Button) findViewById(R.id.offline);
mEditText = (EditText) findViewById(R.id.online_url);
hidePoiInfo = (CheckBox) findViewById(R.id.hide_poiinfo);
// 设置在线方法监听
mOnline.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
onlineTile();
}
});
// 设置离线方法监听
mOffline.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
offlineTile();
}
});
hidePoiInfo.setOnCheckedChangeListener(new HidePoiInfoListener());
mEditText.setText(onlineUrl);
}
/**
* 使用瓦片图的在线方式
*/
private void onlineTile() {
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
if (tileOverlay != null && mBaiduMap != null) {
tileOverlay.removeTileOverlay();
}
final String urlString = mEditText.getText().toString();
/**
* 定义瓦片图的在线Provider,并实现相关接口
* MAX_LEVEL、MIN_LEVEL 表示地图显示瓦片图的最大、最小级别
* urlString 表示在线瓦片图的URL地址
*/
TileProvider tileProvider = new UrlTileProvider() {
@Override
public int getMaxDisLevel() {
return MAX_LEVEL;
}
@Override
public int getMinDisLevel() {
return MIN_LEVEL;
}
@Override
public String getTileUrl() {
return urlString;
}
};
TileOverlayOptions options = new TileOverlayOptions();
// 构造显示瓦片图范围,当前为世界范围
LatLng northeast = new LatLng(80, 180);
LatLng southwest = new LatLng(-80, -180);
// 通过option指定相关属性,向地图添加在线瓦片图对象
tileOverlay = mBaiduMap.addTileLayer(options.tileProvider(tileProvider).setMaxTileTmp(TILE_TMP)
.setPositionFromBounds(new LatLngBounds.Builder().include(northeast).include(southwest).build()));
if (mapLoaded) {
mBaiduMap.setMaxAndMinZoomLevel(21.0f, 3.0f);
mBaiduMap.setMapStatusLimits(new LatLngBounds.Builder().include(northeast).include(southwest).build());
mBaiduMap.setMapStatus(mMapStatusUpdate);
}
}
/**
* 瓦片图的离线添加
*/
private void offlineTile() {
if (tileOverlay != null && mBaiduMap != null) {
tileOverlay.removeTileOverlay();
}
/**
* 定义瓦片图的离线Provider,并实现相关接口
* MAX_LEVEL、MIN_LEVEL 表示地图显示瓦片图的最大、最小级别
* Tile 对象表示地图每个x、y、z状态下的瓦片对象
*/
tileProvider = new FileTileProvider() {
@Override
public Tile getTile(int x, int y, int z) {
// 根据地图某一状态下x、y、z加载指定的瓦片图
String filedir = "LocalTileImage/" + z + "/" + z + "_" + x + "_" + y + ".jpg";
Bitmap bm = getFromAssets(filedir);
if (bm == null) {
return null;
}
// 瓦片图尺寸必须满足256 * 256
offlineTile = new Tile(bm.getWidth(), bm.getHeight(), toRawData(bm));
bm.recycle();
return offlineTile;
}
@Override
public int getMaxDisLevel() {
return MAX_LEVEL;
}
@Override
public int getMinDisLevel() {
return MIN_LEVEL;
}
};
TileOverlayOptions options = new TileOverlayOptions();
// 构造显示瓦片图范围,当前为世界范围
LatLng northeast = new LatLng(80, 180);
LatLng southwest = new LatLng(-80, -180);
// 设置离线瓦片图属性option
options.tileProvider(tileProvider)
.setPositionFromBounds(new LatLngBounds.Builder().include(northeast).include(southwest).build());
// 通过option指定相关属性,向地图添加离线瓦片图对象
tileOverlay = mBaiduMap.addTileLayer(options);
if (mapLoaded) {
setMapStatusLimits();
}
}
private void setMapStatusLimits() {
LatLngBounds.Builder builder = new LatLngBounds.Builder();
builder.include(new LatLng(39.94001804746338, 116.41224644234747))
.include(new LatLng(39.90299859954822, 116.38359947963427));
mBaiduMap.setMapStatusLimits(builder.build());
mBaiduMap.setMaxAndMinZoomLevel(17.0f, 16.0f);
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);
}
/**
* 瓦片文件解析为Bitmap
* @param fileName
* @return 瓦片文件的Bitmap
*/
public Bitmap getFromAssets(String fileName) {
AssetManager am = this.getAssets();
InputStream is = null;
Bitmap bm;
try {
is = am.open(fileName);
bm = BitmapFactory.decodeStream(is);
return bm;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public void onMapLoaded() {
mapLoaded = true;
}
private class HidePoiInfoListener implements CompoundButton.OnCheckedChangeListener {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
mBaiduMap.showMapPoi(false);
} else {
mBaiduMap.showMapPoi(true);
}
}
}
@Override
protected void onPause() {
super.onPause();
// activity 暂停时同时暂停地图控件
mMapView.onPause();
}
@Override
protected void onResume() {
super.onResume();
// activity 恢复时同时恢复地图控件
mMapView.onResume();
}
@Override
protected void onDestroy() {
super.onDestroy();
// activity 销毁时同时销毁地图控件
mMapView.onDestroy();
}
/**
* 解析Bitmap
* @param bitmap
* @return
*/
byte[] toRawData(Bitmap bitmap) {
ByteBuffer buffer = ByteBuffer.allocate(bitmap.getWidth()
* bitmap.getHeight() * 4);
bitmap.copyPixelsToBuffer(buffer);
byte[] data = buffer.array();
buffer.clear();
return data;
}
}