extract ThemeLoader from MapTileLayer

This commit is contained in:
Hannes Janetzek 2013-07-23 21:39:40 +02:00
parent e29c36d6e7
commit 5e9b517f50
5 changed files with 153 additions and 139 deletions

View File

@ -3,12 +3,12 @@ package org.oscim.android.test;
import org.oscim.android.AndroidMapView;
import org.oscim.layers.labeling.LabelLayer;
import org.oscim.layers.overlay.BuildingOverlay;
import org.oscim.layers.overlay.GenericOverlay;
import org.oscim.layers.tile.bitmap.BitmapTileLayer;
import org.oscim.layers.tile.bitmap.HillShadeTiles;
import org.oscim.layers.tile.vector.MapTileLayer;
import org.oscim.renderer.layers.GridRenderLayer;
import org.oscim.theme.InternalRenderTheme;
import org.oscim.tilesource.TileSource;
import org.oscim.tilesource.oscimap4.OSciMap4TileSource;
import org.oscim.tilesource.oscimap2.OSciMap2TileSource;
import android.os.Bundle;
import android.view.Menu;
@ -24,23 +24,26 @@ public class MapActivity extends org.oscim.android.MapActivity {
mAndroidMapView = (AndroidMapView) findViewById(R.id.mapView);
//mMap = mMapView.getMap();
//TileSource tileSource = new OSciMap2TileSource();
//tileSource.setOption("url", "http://city.informatik.uni-bremen.de/osci/map-live");
TileSource tileSource = new OSciMap2TileSource();
tileSource.setOption("url", "http://city.informatik.uni-bremen.de/osci/map-live");
TileSource tileSource = new OSciMap4TileSource();
tileSource.setOption("url", "http://city.informatik.uni-bremen.de/osci/testing");
//TileSource tileSource = new OSciMap4TileSource();
//tileSource.setOption("url", "http://city.informatik.uni-bremen.de/osci/testing");
MapTileLayer l = mMapView.setBaseMap(tileSource);
//mMapView.setDebugSettings(new DebugSettings(false, false, true, false, false));
mMapView.getLayerManager().add(new BuildingOverlay(mMapView, l.getTileLayer()));
mMapView.getLayerManager().add(new LabelLayer(mMapView, l.getTileLayer()));
l.setRenderTheme(InternalRenderTheme.DEFAULT);
//l.setRenderTheme(InternalRenderTheme.TRONRENDER);
mMapView.setTheme(InternalRenderTheme.DEFAULT);
//mMapView.setTheme(InternalRenderTheme.TRONRENDER);
mMapView.getLayerManager().add(new BitmapTileLayer(mMapView, HillShadeTiles.INSTANCE));
//mMapView.setBackgroundMap(new BitmapTileLayer(mMapView, StamenWaterTiles.INSTANCE));
//mMap.setBackgroundMap(new BitmapTileLayer(mMap, MapQuestAerial.INSTANCE));
mMapView.getLayerManager().add(new GenericOverlay(mMapView, new GridRenderLayer(mMapView)));
//mMapView.getLayerManager().add(new GenericOverlay(mMapView, new GridRenderLayer(mMapView)));
mAndroidMapView.setClickable(true);
mAndroidMapView.setFocusable(true);

View File

@ -10,6 +10,7 @@ import org.oscim.layers.tile.vector.MapTileLayer;
import org.oscim.renderer.GLRenderer;
import org.oscim.renderer.GLState;
import org.oscim.theme.InternalRenderTheme;
import org.oscim.theme.ThemeLoader;
import org.oscim.tilesource.TileSource;
import org.oscim.view.MapRenderCallback;
import org.oscim.view.MapView;
@ -69,7 +70,7 @@ public class GdxMap implements ApplicationListener, MapRenderCallback {
// TileSource tileSource = new TestTileSource();
mMapLayer = mMapView.setBaseMap(mTileSource);
mMapLayer.setRenderTheme(InternalRenderTheme.DEFAULT);
mMapView.setTheme(InternalRenderTheme.DEFAULT);
mMapView.getLayerManager().add(new BuildingOverlay(mMapView, mMapLayer.getTileLayer()));
mMapView.getLayerManager().add(new LabelLayer(mMapView, mMapLayer.getTileLayer()));
@ -87,8 +88,9 @@ public class GdxMap implements ApplicationListener, MapRenderCallback {
mMapView.getMapViewPosition().setViewport(w, h);
MapPosition p = new MapPosition();
p.setZoomLevel(17);
p.setPosition(53.08, 8.83);
p.setZoomLevel(3);
//p.setPosition(53.08, 8.83);
p.setPosition(0.0, 0.0);
mMapView.setMapPosition(p);
mMapRenderer.onSurfaceCreated();
@ -264,18 +266,18 @@ public class GdxMap implements ApplicationListener, MapRenderCallback {
mMapView.updateMap(true);
break;
case Input.Keys.R:
mMapLayer.reloadTheme();
mMapView.updateMap(false);
break;
// case Input.Keys.R:
// mMapLayer.reloadTheme();
// mMapView.updateMap(false);
// break;
case Input.Keys.D:
mMapLayer.setRenderTheme(InternalRenderTheme.DEFAULT);
mMapView.setTheme(InternalRenderTheme.DEFAULT);
mMapView.updateMap(false);
break;
case Input.Keys.T:
mMapLayer.setRenderTheme(InternalRenderTheme.TRONRENDER);
mMapView.setTheme(InternalRenderTheme.TRONRENDER);
mMapView.updateMap(false);
break;

View File

@ -14,32 +14,29 @@
*/
package org.oscim.layers.tile.vector;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import org.oscim.backend.CanvasAdapter;
import org.oscim.backend.Log;
import org.oscim.core.GeoPoint;
import org.oscim.core.MapPosition;
import org.oscim.layers.tile.TileLayer;
import org.oscim.layers.tile.TileLoader;
import org.oscim.layers.tile.TileManager;
import org.oscim.renderer.GLRenderer;
import org.oscim.theme.ExternalRenderTheme;
import org.oscim.theme.IRenderTheme;
import org.oscim.theme.InternalRenderTheme;
import org.oscim.theme.RenderThemeHandler;
import org.oscim.theme.Theme;
import org.oscim.tilesource.ITileDataSource;
import org.oscim.tilesource.MapInfo;
import org.oscim.tilesource.TileSource;
import org.oscim.tilesource.TileSource.OpenResult;
import org.oscim.utils.IOUtils;
import org.oscim.view.MapView;
/**
* The vector-tile-map layer. This class manages instances of
* {@link MapTileLoader} that load and assemble vector tiles
* for rendering.
*/
public class MapTileLayer extends TileLayer<MapTileLoader> {
private final static String TAG = MapTileLayer.class.getName();
private TileSource mTileSource;
public MapTileLayer(MapView mapView) {
super(mapView);
}
@ -49,15 +46,10 @@ public class MapTileLayer extends TileLayer<MapTileLoader> {
return new MapTileLoader(tm);
}
private TileSource mTileSource;
private String mRenderTheme;
/**
* Sets the TileSource for this MapView.
* Sets the {@link TileSource} used by {@link TileLoader}.
*
* @param tileSource
* the new TileSource.
* @return true if TileSource changed
* @return true when new TileSource was set (has changed)
*/
public boolean setTileSource(TileSource tileSource) {
@ -93,6 +85,21 @@ public class MapTileLayer extends TileLayer<MapTileLoader> {
return true;
}
/**
* Set {@link IRenderTheme} used by {@link TileLoader}
*/
public void setRenderTheme(IRenderTheme theme) {
pauseLoaders(true);
for (MapTileLoader g : mTileLoader)
g.setRenderTheme(theme);
resumeLoaders();
}
/**
* @deprecated
*/
public MapPosition getMapFileCenter() {
if (mTileSource == null)
return null;
@ -113,105 +120,11 @@ public class MapTileLayer extends TileLayer<MapTileLoader> {
mapPosition.setPosition(startPos);
if (mapInfo.startZoomLevel == null)
mapPosition.setZoomLevel(12);
mapPosition.setZoomLevel(2);
else
mapPosition.setZoomLevel((mapInfo.startZoomLevel).byteValue());
return mapPosition;
}
public String getRenderTheme() {
return mRenderTheme;
}
/**
* Sets the internal theme which is used for rendering the map.
*
* @param internalRenderTheme
* the internal rendering theme.
* @return ...
* @throws IllegalArgumentException
* if the supplied internalRenderTheme is null.
*/
public boolean setRenderTheme(InternalRenderTheme internalRenderTheme) {
if (internalRenderTheme == null) {
throw new IllegalArgumentException("render theme must not be null");
}
if (internalRenderTheme.name() == mRenderTheme)
return true;
boolean ret = setRenderTheme((Theme) internalRenderTheme);
if (ret)
mRenderTheme = internalRenderTheme.name();
mMapView.clearMap();
return ret;
}
public boolean reloadTheme(){
Theme t = InternalRenderTheme.valueOf(mRenderTheme);
if (t == null)
return false;
boolean ret = setRenderTheme(t);
mMapView.clearMap();
return ret;
}
/**
* Sets the theme file which is used for rendering the map.
*
* @param renderThemePath
* the path to the XML file which defines the rendering theme.
* @throws IllegalArgumentException
* if the supplied internalRenderTheme is null.
* @throws FileNotFoundException
* if the supplied file does not exist, is a directory or cannot
* be read.
*/
public void setRenderTheme(String renderThemePath) throws FileNotFoundException {
if (renderThemePath == null) {
throw new IllegalArgumentException("render theme path must not be null");
}
boolean ret = setRenderTheme(new ExternalRenderTheme(renderThemePath));
if (ret)
mRenderTheme = renderThemePath;
mMapView.clearMap();
}
private boolean setRenderTheme(Theme theme) {
pauseLoaders(true);
InputStream inputStream = null;
try {
inputStream = theme.getRenderThemeAsStream();
IRenderTheme t = RenderThemeHandler.getRenderTheme(inputStream);
t.scaleTextSize(1 + (CanvasAdapter.dpi / 240 - 1) * 0.5f);
// FIXME !!!
GLRenderer.setRenderTheme(t);
for (MapTileLoader g : mTileLoader)
g.setRenderTheme(t);
return true;
} catch (IOException e) {
Log.e(TAG, e.getMessage());
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(inputStream);
resumeLoaders();
}
return false;
}
}

View File

@ -0,0 +1,72 @@
/*
* Copyright 2013 Hannes Janetzek
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.oscim.theme;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import org.oscim.backend.CanvasAdapter;
import org.oscim.backend.Log;
import org.oscim.utils.IOUtils;
public class ThemeLoader {
private final static String TAG = ThemeLoader.class.getName();
/**
* Load internal theme, see {@link InternalRenderTheme}.
*
* @param internalRenderTheme ...
* @return ...
*/
public static IRenderTheme load(InternalRenderTheme internalRenderTheme) {
return load((Theme) internalRenderTheme);
}
/**
* Load theme from XML file.
*
* @param renderThemePath ..
* @return ...
* @throws FileNotFoundException ...
*/
public static IRenderTheme load(String renderThemePath) throws FileNotFoundException {
return load(new ExternalRenderTheme(renderThemePath));
}
public static IRenderTheme load(Theme theme) {
InputStream inputStream = null;
try {
inputStream = theme.getRenderThemeAsStream();
IRenderTheme t = RenderThemeHandler.getRenderTheme(inputStream);
t.scaleTextSize(1 + (CanvasAdapter.dpi / 240 - 1) * 0.5f);
return t;
} catch (IOException e) {
Log.e(TAG, e.getMessage());
} catch (Exception e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(inputStream);
}
return null;
}
}

View File

@ -16,6 +16,7 @@ package org.oscim.view;
import java.util.List;
import org.oscim.backend.Log;
import org.oscim.core.BoundingBox;
import org.oscim.core.GeoPoint;
import org.oscim.core.MapPosition;
@ -25,10 +26,16 @@ import org.oscim.layers.overlay.Overlay;
import org.oscim.layers.tile.bitmap.BitmapTileLayer;
import org.oscim.layers.tile.vector.MapTileLayer;
import org.oscim.layers.tile.vector.MapTileLoader;
import org.oscim.renderer.GLRenderer;
import org.oscim.theme.IRenderTheme;
import org.oscim.theme.InternalRenderTheme;
import org.oscim.theme.ThemeLoader;
import org.oscim.tilesource.TileSource;
public class MapView {
private static final String TAG = MapView.class.getName();
//public static boolean enableClosePolygons;
private final LayerManager mLayerManager;
private final MapViewPosition mMapViewPosition;
@ -50,21 +57,21 @@ public class MapView {
mLayerManager.add(0, new MapEventLayer(this));
}
private MapTileLayer mBaseLayer;
public MapTileLayer setBaseMap(TileSource tileSource) {
MapTileLayer baseLayer = new MapTileLayer(this);
baseLayer.setTileSource(tileSource);
mBaseLayer = new MapTileLayer(this);
mBaseLayer.setTileSource(tileSource);
//mLayerManager.add(0, new MapEventLayer(this));
mLayerManager.add(1, baseLayer);
mLayerManager.add(1, mBaseLayer);
//mRotationEnabled = true;
//mLayerManager.add(new GenericOverlay(this, new GridRenderLayer(this)));
return baseLayer;
return mBaseLayer;
}
public void setBackgroundMap(BitmapTileLayer tileLayer) {
@ -77,6 +84,21 @@ public class MapView {
return null;
}
public void setTheme(InternalRenderTheme theme) {
if (mBaseLayer == null){
Log.e(TAG, "No base layer set");
throw new IllegalStateException();
}
IRenderTheme t = ThemeLoader.load(theme);
if (t == null){
Log.e(TAG, "Invalid theme");
throw new IllegalStateException();
}
mBaseLayer.setRenderTheme(t);
GLRenderer.setRenderTheme(t);
}
public void destroy() {
mLayerManager.destroy();
}
@ -110,7 +132,7 @@ public class MapView {
}
/**
* Do not call directly. This function is run on main-loop
* Do not call directly! This function is run on main-loop
* before rendering a frame.
*/
public void updateLayers() {
@ -199,4 +221,6 @@ public class MapView {
public int getHeight() {
return mMapRenderCallback.getHeight();
}
}