From e10a223ea6b93ad88781f9707c8baa5131b05a9e Mon Sep 17 00:00:00 2001 From: Emux Date: Wed, 2 Nov 2016 11:57:20 +0200 Subject: [PATCH] Mapsforge: multiple map files with zoom levels, #208 --- .../oscim/tiling/source/mapfile/MapDatabase.java | 4 ++++ .../tiling/source/mapfile/MultiMapDatabase.java | 9 ++++++++- .../source/mapfile/MultiMapFileTileSource.java | 16 +++++++++++++++- 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/vtm/src/org/oscim/tiling/source/mapfile/MapDatabase.java b/vtm/src/org/oscim/tiling/source/mapfile/MapDatabase.java index b2529a12..2f004a26 100644 --- a/vtm/src/org/oscim/tiling/source/mapfile/MapDatabase.java +++ b/vtm/src/org/oscim/tiling/source/mapfile/MapDatabase.java @@ -217,6 +217,10 @@ public class MapDatabase implements ITileDataSource { mTileClipper = new TileClipper(0, 0, 0, 0); } + public MapFileTileSource getTileSource() { + return mTileSource; + } + @Override public void query(MapTile tile, ITileDataSink sink) { diff --git a/vtm/src/org/oscim/tiling/source/mapfile/MultiMapDatabase.java b/vtm/src/org/oscim/tiling/source/mapfile/MultiMapDatabase.java index 5cd4b4de..b65ffb17 100644 --- a/vtm/src/org/oscim/tiling/source/mapfile/MultiMapDatabase.java +++ b/vtm/src/org/oscim/tiling/source/mapfile/MultiMapDatabase.java @@ -24,6 +24,11 @@ import java.util.List; public class MultiMapDatabase implements ITileDataSource { private final List mapDatabases = new ArrayList<>(); + private final MultiMapFileTileSource tileSource; + + public MultiMapDatabase(MultiMapFileTileSource tileSource) { + this.tileSource = tileSource; + } public boolean add(MapDatabase mapDatabase) { if (mapDatabases.contains(mapDatabase)) { @@ -36,7 +41,9 @@ public class MultiMapDatabase implements ITileDataSource { public void query(MapTile tile, ITileDataSink mapDataSink) { MultiMapDataSink multiMapDataSink = new MultiMapDataSink(mapDataSink); for (MapDatabase mapDatabase : mapDatabases) { - mapDatabase.query(tile, multiMapDataSink); + int[] zoomLevels = tileSource.getZoomsByTileSource().get(mapDatabase.getTileSource()); + if (zoomLevels == null || (zoomLevels[0] <= tile.zoomLevel && tile.zoomLevel <= zoomLevels[1])) + mapDatabase.query(tile, multiMapDataSink); } mapDataSink.completed(multiMapDataSink.getResult()); } diff --git a/vtm/src/org/oscim/tiling/source/mapfile/MultiMapFileTileSource.java b/vtm/src/org/oscim/tiling/source/mapfile/MultiMapFileTileSource.java index 4f7eb1ff..93bed95f 100644 --- a/vtm/src/org/oscim/tiling/source/mapfile/MultiMapFileTileSource.java +++ b/vtm/src/org/oscim/tiling/source/mapfile/MultiMapFileTileSource.java @@ -22,13 +22,16 @@ import org.slf4j.LoggerFactory; import java.io.IOException; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class MultiMapFileTileSource extends TileSource implements IMapFileTileSource { private static final Logger log = LoggerFactory.getLogger(MultiMapFileTileSource.class); private final List mapFileTileSources = new ArrayList<>(); + private final Map zoomsByTileSource = new HashMap<>(); public MultiMapFileTileSource() { this(0, 17); @@ -45,6 +48,13 @@ public class MultiMapFileTileSource extends TileSource implements IMapFileTileSo return mapFileTileSources.add(mapFileTileSource); } + public boolean add(MapFileTileSource mapFileTileSource, int zoomMin, int zoomMax) { + boolean result = add(mapFileTileSource); + if (result) + zoomsByTileSource.put(mapFileTileSource, new int[]{zoomMin, zoomMax}); + return result; + } + public BoundingBox getBoundingBox() { BoundingBox boundingBox = null; for (MapFileTileSource mapFileTileSource : mapFileTileSources) { @@ -53,9 +63,13 @@ public class MultiMapFileTileSource extends TileSource implements IMapFileTileSo return boundingBox; } + Map getZoomsByTileSource() { + return zoomsByTileSource; + } + @Override public ITileDataSource getDataSource() { - MultiMapDatabase multiMapDatabase = new MultiMapDatabase(); + MultiMapDatabase multiMapDatabase = new MultiMapDatabase(this); for (MapFileTileSource mapFileTileSource : mapFileTileSources) { try { multiMapDatabase.add(new MapDatabase(mapFileTileSource));