vtm/vtm-playground/src/org/oscim/test/TileRenderTest.java
2014-09-20 02:23:32 +02:00

202 lines
5.3 KiB
Java

package org.oscim.test;
import org.oscim.backend.canvas.Color;
import org.oscim.core.GeometryBuffer.GeometryType;
import org.oscim.core.MapElement;
import org.oscim.core.MapPosition;
import org.oscim.core.MercatorProjection;
import org.oscim.event.Event;
import org.oscim.gdx.GdxMapApp;
import org.oscim.layers.TileGridLayer;
import org.oscim.layers.tile.MapTile;
import org.oscim.layers.tile.MapTile.TileNode;
import org.oscim.layers.tile.TileLoader;
import org.oscim.layers.tile.TileManager;
import org.oscim.layers.tile.TileSet;
import org.oscim.layers.tile.VectorTileRenderer;
import org.oscim.layers.tile.vector.VectorTileLayer;
import org.oscim.layers.tile.vector.VectorTileLoader;
import org.oscim.layers.tile.vector.labeling.LabelLayer;
import org.oscim.map.Map;
import org.oscim.renderer.MapRenderer;
import org.oscim.theme.VtmThemes;
import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.oscimap4.OSciMap4TileSource;
public class TileRenderTest extends GdxMapApp {
static boolean loadOneTile = true;
// static int tileX = 34365 >> 2;
// static int tileY = 21333 >> 2;
// static byte tileZ = 14;
static int tileX = 68747 >> 3;
static int tileY = 42648 >> 3;
static byte tileZ = 14;
@Override
public void createLayers() {
mMap.layers().add(new TileGridLayer(mMap, Color.LTGRAY, 1.2f, 1));
MapTile tile = new MapTile(null, tileX, tileY, tileZ);
double w = 1.0 / (1 << tile.zoomLevel);
double minLon = MercatorProjection.toLongitude(tile.x);
double maxLon = MercatorProjection.toLongitude(tile.x + w);
double minLat = MercatorProjection.toLatitude(tile.y + w);
double maxLat = MercatorProjection.toLatitude(tile.y);
double lat = minLat + (maxLat - minLat) / 2;
double lon = minLon + (maxLon - minLon) / 2;
MapPosition mapPosition = new MapPosition(lat, lon, 1 << tile.zoomLevel);
mMap.setMapPosition(mapPosition);
final TileManager tileManager;
if (loadOneTile) {
tile = new MapTile(new TileNode(), tileX, tileY, tileZ);
/* setup tile quad-tree, expected for locking */
tile.node.parent = tile.node;
tile.node.parent.parent = tile.node;
/* setup TileSet contatining one tile */
final TileSet tiles = new TileSet();
tiles.cnt = 1;
tiles.tiles[0] = tile;
tiles.lockTiles();
tileManager = new TestTileManager(mMap, tiles);
} else {
/* create TileManager and calculate tiles for current position */
tileManager = new TileManager(mMap, 0, 32, 100);
}
/* get the loader created by VectorTileLayer ... */
final TestTileLoader[] tileLoader = { null };
TestVectorTileLayer tileLayer = new TestVectorTileLayer(mMap, tileManager);
tileLoader[0] = tileLayer.getTileLoader();
TileSource tileSource = new OSciMap4TileSource();
//TileSource tileSource = new TestTileSource();
tileLayer.setTileSource(tileSource);
//IRenderTheme theme = ThemeLoader.load(VtmThemes.OSMARENDER);
//tileLayer.setRenderTheme(theme);
//tileLayer.setRenderTheme(new DebugTheme());
/* need to create the labellayer here to get the tileloaded event */
LabelLayer labelLayer = new LabelLayer(mMap, tileLayer);
//mMap.layers().add(tileLayer);
mMap.setBaseMap(tileLayer);
mMap.setTheme(VtmThemes.DEFAULT);
log.debug("load tiles:");
if (loadOneTile) {
log.debug("load {}", tile);
tileLoader[0].loadTile(tile);
tileManager.jobCompleted(tile, true);
} else {
tileManager.update(mapPosition);
MapTile t = tileManager.getTileJob();
while (t != null) {
log.debug("load {}", t);
tileLoader[0].loadTile(t);
tileManager.jobCompleted(t, true);
t = tileManager.getTileJob();
}
}
mMap.layers().add(labelLayer);
MapRenderer.setBackgroundColor(0xff888888);
}
static class TestTileLoader extends VectorTileLoader {
public TestTileLoader(VectorTileLayer tileLayer) {
super(tileLayer);
}
@Override
public boolean loadTile(MapTile tile) {
mTile = tile;
return super.loadTile(tile);
}
@Override
public void process(MapElement element) {
/* ignore polygons for testing */
if (element.type != GeometryType.LINE)
return;
if (element.tags.containsKey("name"))
super.process(element);
}
}
static class TestVectorTileLayer extends VectorTileLayer {
final VectorTileLoader[] tileLoader = { null };
public TestVectorTileLayer(Map map, TileManager tileManager) {
super(map, tileManager, new VectorTileRenderer());
}
TestTileLoader getTileLoader() {
return (TestTileLoader) mTileLoader[0];
}
@Override
protected int getNumLoaders() {
return 1;
}
@Override
protected void initLoader(int numLoaders) {
mTileLoader = new TileLoader[numLoaders];
for (int i = 0; i < numLoaders; i++) {
mTileLoader[i] = new TestTileLoader(this);
}
}
@Override
public void onMapEvent(Event event, MapPosition mapPosition) {
/* ignore map events */
if (event != Map.CLEAR_EVENT)
return;
//super.onMapEvent(event, mapPosition);
}
}
static class TestTileManager extends TileManager {
TileSet fixedTiles;
public TestTileManager(Map map, TileSet fixedTiles) {
super(map, 0, 30, 100);
this.fixedTiles = fixedTiles;
}
@Override
public boolean getActiveTiles(TileSet tileSet) {
if (tileSet == null)
tileSet = new TileSet(fixedTiles.cnt);
tileSet.setTiles(fixedTiles);
return true;
}
}
public static void main(String[] args) {
GdxMapApp.init();
GdxMapApp.run(new TileRenderTest(), null, 512);
}
}