这里加载并且缓存影像的目的是为了防止遥感影像的拷贝,项目之前都是在拷贝影像(因为数据较大,下载太费事),在此进行更新,改为先是加载在线影像,然后再进行缓存。
一、先重写了Arcgis for android的一个ImageTiledLayer(因为别的大多数方法是不允许被重写的----),先看一下官方文档的介绍:
大致可以看出来,我们可以通过重写这个类的方法来获得给定切片键的切片的编码字节,即获得发布影像的切片信息。
下面我们看一下这里面的一个方法:
我们就是要重写这个方法!
在写之前我们先看一下发布的影像服务:
这些参数待会都是我们需要用到的。
下面给大家看一下重写的ImageTileLayer:代码如下:
public class ArcGISLocalDataLayer extends ImageTiledLayer {
private String mUrl = null;
private Context mContext;
private SQLiteDatabase mDb;
// private SpatialReference mSpatialReference;
public ArcGISLocalDataLayer(Context mContext, String url, TileInfo tileInfo, Envelope envelope) {
super(tileInfo, envelope);
this.mContext = mContext;
this.mUrl = url;
this.init();
}
private void init() {
DBHelper gadbHelper = new DBHelper(mContext);
mDb = gadbHelper.getWritableDatabase();
//setDefaultSpatialReference(SpatialReference.create(4326));
//设置mapservice
//ArcGISLocalDataLayer.this.initLayer();
}
@Override
protected byte[] getTile(TileKey tileKey) {
int level = tileKey.getLevel();
int col = tileKey.getColumn();
int row = tileKey.getRow();
byte[] result = null;
String tileIndex = "tile_" + level + "_" + row + "_" + col;
String sql = "select * from " + DBHelper.TABLE_MAP + " where TILEINDEX = '" + tileIndex + "'";
Cursor mCursor = mDb.rawQuery(sql, null);
boolean hasData = false;
boolean isWifi = isWifi();
while (mCursor.moveToNext()) {//判断是否存在数据
hasData = true;
}
if (hasData && !isWifi) {//数据库中有数据