package com.mutu.mapapi.tileprovider.modules;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import org.mapsforge.core.model.Tile;
import org.mapsforge.map.layer.renderer.DatabaseRenderer;
import org.mapsforge.map.layer.renderer.RendererJob;
import org.mapsforge.map.reader.MapDatabase;
import org.mapsforge.map.reader.header.FileOpenResult;
import org.mapsforge.map.rendertheme.InternalRenderTheme;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import com.mutu.mapapi.tileprovider.MapTile;
import com.mutu.mapapi.tileprovider.tilesource.ITileSource;
import com.mutu.mapapi.tileprovider.util.StreamUtils;
public class MapsforgeFileArchive implements IArchiveFile {
private static final Logger logger = LoggerFactory.getLogger(MapsforgeFileArchive.class);
private final File mFile;
private final MapDatabase mMapDatabase;
private final DatabaseRenderer mDatabaseRenderer;
private MapsforgeFileArchive(final File pFile){
mFile = pFile;
mMapDatabase = new MapDatabase();
FileOpenResult result = mMapDatabase.openFile(pFile);
mDatabaseRenderer = new DatabaseRenderer(mMapDatabase);
}
public static MapsforgeFileArchive getMapsforgeFileArchive(final File pFile) throws FileNotFoundException, IOException {
return new MapsforgeFileArchive(pFile);
}
@Override
public InputStream getInputStream(ITileSource tileSource, MapTile tile) {
// TODO Auto-generated method stub
try {
Tile maptile = new Tile(tile.getX(),tile.getY(),(byte) tile.getZoomLevel());
//MapReadResult map = mMapDatabase.readMapData();
//logger.debug("poi = " + map.pointOfInterests.size() + "way = " + map.ways.size());
// DatabaseRenderer DatabaseRenderer = new DatabaseRenderer(mMapDatabase,AndroidGraphicFactory.INSTANCE);
RendererJob rendererJob = new RendererJob(maptile, mFile, InternalRenderTheme.OSMARENDER, 1.5f);
Bitmap bitmap = mDatabaseRenderer.executeJob(rendererJob);
// Bitmap bitmap = Bitmap.createBitmap(tileSource.getTileSizePixels(), tileSource.getTileSizePixels(), Config.ARGB_8888);
// Canvas canvas = new Canvas(bitmap);
// canvas.drawColor(Color.BLUE);
final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
BufferedOutputStream out = new BufferedOutputStream(dataStream, StreamUtils.IO_BUFFER_SIZE);
bitmap.compress(CompressFormat.PNG, 0, out);
out.flush();
final byte[] data = dataStream.toByteArray();
final ByteArrayInputStream byteStream = new ByteArrayInputStream(data);
return byteStream;
} catch (IOException e) {
// TODO Auto-generated catch block
logger.warn("Error getting tile: " + tile, e);
}
return null;
}
@Override
public String toString() {
return "MapsforgeFileArchive [mMapDatabase=" + mMapDatabase.toString() + "]";
}
}