make VectorTileLayer extendable

This commit is contained in:
Hannes Janetzek 2014-02-20 15:55:24 +01:00
parent 99cfdd6e14
commit 1b232cca84
10 changed files with 47 additions and 56 deletions

View File

@ -30,8 +30,8 @@ import org.oscim.renderer.elements.BitmapLayer;
import org.oscim.renderer.elements.ElementLayers;
import org.oscim.tiling.ITileDataSink;
import org.oscim.tiling.ITileDataSource;
import org.oscim.tiling.TileSource;
import org.oscim.tiling.ITileDataSource.QueryResult;
import org.oscim.tiling.TileSource;
import org.oscim.utils.FastMath;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -61,9 +61,14 @@ public class BitmapTileLayer extends TileLayer {
}
public BitmapTileLayer(Map map, TileSource tileSource, int cacheLimit) {
super(map, tileSource.getZoomLevelMin(), tileSource.getZoomLevelMax(), cacheLimit);
super(map,
new TileManager(map,
tileSource.getZoomLevelMin(),
tileSource.getZoomLevelMax(),
cacheLimit),
new VectorTileRenderer());
mTileSource = tileSource;
setRenderer(new VectorTileRenderer(mTileManager));
initLoader(4);
}

View File

@ -66,8 +66,8 @@ public class MapTile extends Tile {
public final static byte CANCEL = 1 << 3;
}
public MapTile(TileNode node, int tileX, int tileY, byte zoomLevel) {
super(tileX, tileY, zoomLevel);
public MapTile(TileNode node, int tileX, int tileY, int zoomLevel) {
super(tileX, tileY, (byte)zoomLevel);
this.x = (double) tileX / (1 << zoomLevel);
this.y = (double) tileY / (1 << zoomLevel);
this.node = node;

View File

@ -28,31 +28,25 @@ public abstract class TileLayer extends Layer implements UpdateListener {
static final Logger log = LoggerFactory.getLogger(TileLayer.class);
private final static int MAX_ZOOMLEVEL = 17;
private final static int MIN_ZOOMLEVEL = 2;
private final static int CACHE_LIMIT = 150;
/**
* TileManager responsible for adding visible tiles
* to load queue and managing in-memory tile cache.
*/
protected final TileManager mTileManager;
protected TileLoader[] mTileLoader;
public TileLayer(Map map) {
this(map, MIN_ZOOMLEVEL, MAX_ZOOMLEVEL, CACHE_LIMIT);
}
public TileLayer(Map map, int minZoom, int maxZoom, int cacheLimit) {
public TileLayer(Map map, TileManager tileManager, TileRenderer renderer) {
super(map);
/* TileManager responsible for adding visible tiles
* to load queue and managing in-memory tile cache. */
mTileManager = new TileManager(map, minZoom, maxZoom, cacheLimit);
renderer.setTileManager(tileManager);
mTileManager = tileManager;
mRenderer = renderer;
}
abstract protected TileLoader createLoader(TileManager tm);
protected void setRenderer(TileRenderer renderer) {
mRenderer = renderer;
}
public TileRenderer tileRenderer() {
return (TileRenderer) mRenderer;
}

View File

@ -107,14 +107,6 @@ public class TileManager {
private final QuadTree<TileNode, MapTile> mIndex = new QuadTree<TileNode, MapTile>() {
@Override
public MapTile create(int x, int y, int z) {
TileNode t = super.add(x, y, z);
t.item = new MapTile(t, x, y, (byte) z);
return t.item;
}
@Override
public void removeItem(MapTile t) {
if (t.node == null) {
@ -204,9 +196,6 @@ public class TileManager {
* jobs come in. */
jobQueue.clear();
// load some tiles more than currently visible (* 0.75)
//double scale = pos.scale * 0.9f;
int tileZoom = FastMath.clamp(pos.zoomLevel, mMinZoom, mMaxZoom);
if (mZoomTable != null) {
@ -352,7 +341,8 @@ public class TileManager {
MapTile tile = mIndex.getTile(x, y, zoomLevel);
if (tile == null) {
tile = mIndex.create(x, y, zoomLevel);
TileNode n = mIndex.add(x, y, zoomLevel);
tile = n.item = new MapTile(n, x, y, zoomLevel);
mJobs.add(tile);
addToCache(tile);
} else if (!tile.isActive()) {
@ -363,7 +353,8 @@ public class TileManager {
/* prefetch parent */
MapTile p = tile.node.parent.item;
if (p == null) {
p = mIndex.create(x >> 1, y >> 1, zoomLevel - 1);
TileNode n = mIndex.add(x >> 1, y >> 1, zoomLevel - 1);
p = n.item = new MapTile(n, x >> 1, y >> 1, zoomLevel - 1);
addToCache(p);
// hack to not add tile twice to queue
p.state = LOADING;

View File

@ -36,7 +36,7 @@ public abstract class TileRenderer extends LayerRenderer {
/** fade-in time */
protected static final float FADE_TIME = 500;
private final TileManager mTileManager;
private TileManager mTileManager;
protected final TileSet mDrawTiles;
protected int mProxyTileCnt;
@ -49,12 +49,15 @@ public abstract class TileRenderer extends LayerRenderer {
private int mUploadSerial;
public TileRenderer(TileManager tileManager) {
mTileManager = tileManager;
public TileRenderer() {
mUploadSerial = 0;
mDrawTiles = new TileSet();
}
protected void setTileManager(TileManager tileManager) {
mTileManager = tileManager;
}
/**
* Current number of frames drawn, used to not draw a
* tile twice per frame.

View File

@ -31,9 +31,9 @@ public class VectorTileRenderer extends TileRenderer {
protected GLMatrix mViewProj = new GLMatrix();
public VectorTileRenderer(TileManager tileManager) {
super(tileManager);
}
// public VectorTileRenderer(TileManager tileManager) {
// super(tileManager);
// }
@Override
protected synchronized void update(GLViewport v) {

View File

@ -24,6 +24,7 @@ import org.oscim.layers.tile.MapTile;
import org.oscim.layers.tile.TileLayer;
import org.oscim.layers.tile.TileLoader;
import org.oscim.layers.tile.TileManager;
import org.oscim.layers.tile.VectorTileRenderer;
import org.oscim.map.Map;
import org.oscim.renderer.elements.ElementLayers;
import org.oscim.renderer.elements.LineLayer;
@ -35,7 +36,9 @@ public class TestTileLayer extends TileLayer {
static final Logger log = LoggerFactory.getLogger(TestTileLayer.class);
public TestTileLayer(Map map) {
super(map);
super(map,
new TileManager(map, 0, 20, 10),
new VectorTileRenderer());
}
@Override

View File

@ -35,17 +35,20 @@ import org.slf4j.LoggerFactory;
public class VectorTileLayer extends TileLayer {
static final Logger log = LoggerFactory.getLogger(VectorTileLayer.class);
private TileSource mTileSource;
protected final static int MAX_ZOOMLEVEL = 17;
protected final static int MIN_ZOOMLEVEL = 2;
protected final static int CACHE_LIMIT = 150;
protected TileSource mTileSource;
public VectorTileLayer(Map map) {
super(map);
setRenderer(new VectorTileRenderer(mTileManager));
initLoader(4);
this(map, MIN_ZOOMLEVEL, MAX_ZOOMLEVEL, CACHE_LIMIT);
}
public VectorTileLayer(Map map, int minZoom, int maxZoom, int cacheLimit) {
super(map, minZoom, maxZoom, cacheLimit);
setRenderer(new VectorTileRenderer(mTileManager));
super(map, new TileManager(map, minZoom, maxZoom, cacheLimit),
new VectorTileRenderer());
initLoader(4);
}

View File

@ -96,15 +96,9 @@ public abstract class BoxTree<Box extends BoxItem<E>, E> extends QuadTree<BoxNod
this.maxDepth = maxDepth;
}
@Override
public Box create(int x, int y, int z) {
return null;
}
@Override
public BoxNode<Box> create() {
BoxNode<Box> node = new BoxNode<Box>();
return node;
return new BoxNode<Box>();
}
@Override

View File

@ -39,8 +39,6 @@ public abstract class QuadTree<T extends Node<T, E>, E> {
}
}
public abstract E create(int x, int y, int z);
public abstract T create();
public abstract void removeItem(E item);