From 5e9b517f50a180e6b6789a5052428d0d1036cabe Mon Sep 17 00:00:00 2001 From: Hannes Janetzek Date: Tue, 23 Jul 2013 21:39:40 +0200 Subject: [PATCH] extract ThemeLoader from MapTileLayer --- .../org/oscim/android/test/MapActivity.java | 25 ++-- vtm-gdx/src/org/oscim/gdx/GdxMap.java | 20 +-- .../layers/tile/vector/MapTileLayer.java | 139 ++++-------------- vtm/src/org/oscim/theme/ThemeLoader.java | 72 +++++++++ vtm/src/org/oscim/view/MapView.java | 36 ++++- 5 files changed, 153 insertions(+), 139 deletions(-) create mode 100644 vtm/src/org/oscim/theme/ThemeLoader.java diff --git a/vtm-android-example/src/org/oscim/android/test/MapActivity.java b/vtm-android-example/src/org/oscim/android/test/MapActivity.java index 23c80b43..395c8e52 100644 --- a/vtm-android-example/src/org/oscim/android/test/MapActivity.java +++ b/vtm-android-example/src/org/oscim/android/test/MapActivity.java @@ -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); diff --git a/vtm-gdx/src/org/oscim/gdx/GdxMap.java b/vtm-gdx/src/org/oscim/gdx/GdxMap.java index 810482ba..01560342 100644 --- a/vtm-gdx/src/org/oscim/gdx/GdxMap.java +++ b/vtm-gdx/src/org/oscim/gdx/GdxMap.java @@ -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; diff --git a/vtm/src/org/oscim/layers/tile/vector/MapTileLayer.java b/vtm/src/org/oscim/layers/tile/vector/MapTileLayer.java index 0d9c418b..44d663c4 100644 --- a/vtm/src/org/oscim/layers/tile/vector/MapTileLayer.java +++ b/vtm/src/org/oscim/layers/tile/vector/MapTileLayer.java @@ -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 { 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 { 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 { 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 { 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; - } - } diff --git a/vtm/src/org/oscim/theme/ThemeLoader.java b/vtm/src/org/oscim/theme/ThemeLoader.java new file mode 100644 index 00000000..8e794e8e --- /dev/null +++ b/vtm/src/org/oscim/theme/ThemeLoader.java @@ -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 . + */ + +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; + } + +} diff --git a/vtm/src/org/oscim/view/MapView.java b/vtm/src/org/oscim/view/MapView.java index 9ad45f0d..52a91e99 100644 --- a/vtm/src/org/oscim/view/MapView.java +++ b/vtm/src/org/oscim/view/MapView.java @@ -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(); } + + }