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);
}
public MapFileTileSource getTileSource() {
return mTileSource;
}
@Override
public void query(MapTile tile, ITileDataSink sink) {

View File

@ -24,6 +24,11 @@ import java.util.List;
public class MultiMapDatabase implements ITileDataSource {
private final List<MapDatabase> 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());
}

View File

@ -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<MapFileTileSource> mapFileTileSources = new ArrayList<>();
private final Map<MapFileTileSource, int[]> 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<MapFileTileSource, int[]> 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));