Mapsforge: multiple map files with zoom levels, #208

This commit is contained in:
Emux 2016-11-02 11:57:20 +02:00
parent f85453e60c
commit e10a223ea6
3 changed files with 27 additions and 2 deletions

View File

@ -217,6 +217,10 @@ public class MapDatabase implements ITileDataSource {
mTileClipper = new TileClipper(0, 0, 0, 0); mTileClipper = new TileClipper(0, 0, 0, 0);
} }
public MapFileTileSource getTileSource() {
return mTileSource;
}
@Override @Override
public void query(MapTile tile, ITileDataSink sink) { public void query(MapTile tile, ITileDataSink sink) {

View File

@ -24,6 +24,11 @@ import java.util.List;
public class MultiMapDatabase implements ITileDataSource { public class MultiMapDatabase implements ITileDataSource {
private final List<MapDatabase> mapDatabases = new ArrayList<>(); private final List<MapDatabase> mapDatabases = new ArrayList<>();
private final MultiMapFileTileSource tileSource;
public MultiMapDatabase(MultiMapFileTileSource tileSource) {
this.tileSource = tileSource;
}
public boolean add(MapDatabase mapDatabase) { public boolean add(MapDatabase mapDatabase) {
if (mapDatabases.contains(mapDatabase)) { if (mapDatabases.contains(mapDatabase)) {
@ -36,7 +41,9 @@ public class MultiMapDatabase implements ITileDataSource {
public void query(MapTile tile, ITileDataSink mapDataSink) { public void query(MapTile tile, ITileDataSink mapDataSink) {
MultiMapDataSink multiMapDataSink = new MultiMapDataSink(mapDataSink); MultiMapDataSink multiMapDataSink = new MultiMapDataSink(mapDataSink);
for (MapDatabase mapDatabase : mapDatabases) { 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()); mapDataSink.completed(multiMapDataSink.getResult());
} }

View File

@ -22,13 +22,16 @@ import org.slf4j.LoggerFactory;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
public class MultiMapFileTileSource extends TileSource implements IMapFileTileSource { public class MultiMapFileTileSource extends TileSource implements IMapFileTileSource {
private static final Logger log = LoggerFactory.getLogger(MultiMapFileTileSource.class); private static final Logger log = LoggerFactory.getLogger(MultiMapFileTileSource.class);
private final List<MapFileTileSource> mapFileTileSources = new ArrayList<>(); private final List<MapFileTileSource> mapFileTileSources = new ArrayList<>();
private final Map<MapFileTileSource, int[]> zoomsByTileSource = new HashMap<>();
public MultiMapFileTileSource() { public MultiMapFileTileSource() {
this(0, 17); this(0, 17);
@ -45,6 +48,13 @@ public class MultiMapFileTileSource extends TileSource implements IMapFileTileSo
return mapFileTileSources.add(mapFileTileSource); 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() { public BoundingBox getBoundingBox() {
BoundingBox boundingBox = null; BoundingBox boundingBox = null;
for (MapFileTileSource mapFileTileSource : mapFileTileSources) { for (MapFileTileSource mapFileTileSource : mapFileTileSources) {
@ -53,9 +63,13 @@ public class MultiMapFileTileSource extends TileSource implements IMapFileTileSo
return boundingBox; return boundingBox;
} }
Map<MapFileTileSource, int[]> getZoomsByTileSource() {
return zoomsByTileSource;
}
@Override @Override
public ITileDataSource getDataSource() { public ITileDataSource getDataSource() {
MultiMapDatabase multiMapDatabase = new MultiMapDatabase(); MultiMapDatabase multiMapDatabase = new MultiMapDatabase(this);
for (MapFileTileSource mapFileTileSource : mapFileTileSources) { for (MapFileTileSource mapFileTileSource : mapFileTileSources) {
try { try {
multiMapDatabase.add(new MapDatabase(mapFileTileSource)); multiMapDatabase.add(new MapDatabase(mapFileTileSource));