From 825cd05150810519d28d127060e37dc54ed03e44 Mon Sep 17 00:00:00 2001 From: Emux Date: Tue, 22 Feb 2022 14:08:38 +0200 Subject: [PATCH] Mapsforge: improve overlapping map regions (#905) --- docs/Changelog.md | 2 +- vtm-playground/src/org/oscim/test/MapsforgeTest.java | 2 +- .../oscim/layers/tile/vector/VectorTileLoader.java | 2 +- vtm/src/org/oscim/tiling/TileDataSink.java | 1 + .../org/oscim/tiling/source/mapfile/MapDatabase.java | 12 ++++-------- .../tiling/source/mapfile/MultiMapDatabase.java | 5 +++-- 6 files changed, 11 insertions(+), 13 deletions(-) diff --git a/docs/Changelog.md b/docs/Changelog.md index a0a99980..07312877 100644 --- a/docs/Changelog.md +++ b/docs/Changelog.md @@ -3,7 +3,7 @@ ## New since 0.17.0 - Mapsforge: deduplicate maps [#903](https://github.com/mapsforge/vtm/pull/903) -- Fix overlapping map regions [#903](https://github.com/mapsforge/vtm/pull/903) +- Fix overlapping map regions [#903](https://github.com/mapsforge/vtm/pull/903) [#905](https://github.com/mapsforge/vtm/pull/905) - Minor improvements and bug fixes - [Solved issues](https://github.com/mapsforge/vtm/issues?q=is%3Aclosed+milestone%3A0.18.0) diff --git a/vtm-playground/src/org/oscim/test/MapsforgeTest.java b/vtm-playground/src/org/oscim/test/MapsforgeTest.java index ada687cf..7f1eac8a 100644 --- a/vtm-playground/src/org/oscim/test/MapsforgeTest.java +++ b/vtm-playground/src/org/oscim/test/MapsforgeTest.java @@ -67,7 +67,7 @@ public class MapsforgeTest extends GdxMapApp { mapFileTileSource.setMapFile(mapFile.getAbsolutePath()); tileSource.add(mapFileTileSource); } - tileSource.setDeduplicate(true); + //tileSource.setDeduplicate(true); //tileSource.setPreferredLanguage("en"); VectorTileLayer l = mMap.setBaseMap(tileSource); diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java index 1418d909..748df2b5 100644 --- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java +++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java @@ -194,7 +194,7 @@ public class VectorTileLoader extends TileLoader implements RenderStyle.Callback if (element.type == GeometryType.POINT) { renderNode(renderTheme.matchElement(element.type, tags, mTile.zoomLevel)); } else { - mCurBucket = getValidLayer(element.layer - (element.isPoly() ? element.level : 0)) * renderTheme.getLevels(); + mCurBucket = getValidLayer(element.layer) * renderTheme.getLevels() * (element.level > 0 ? element.level : 1); renderWay(renderTheme.matchElement(element.type, tags, mTile.zoomLevel)); } clearState(); diff --git a/vtm/src/org/oscim/tiling/TileDataSink.java b/vtm/src/org/oscim/tiling/TileDataSink.java index 5393da6d..51f6d356 100644 --- a/vtm/src/org/oscim/tiling/TileDataSink.java +++ b/vtm/src/org/oscim/tiling/TileDataSink.java @@ -25,6 +25,7 @@ public class TileDataSink implements ITileDataSink { public final Set hashPois = new HashSet<>(); public final Set hashWays = new HashSet<>(); + public int level, levels; private QueryResult result; private final ITileDataSink sink; diff --git a/vtm/src/org/oscim/tiling/source/mapfile/MapDatabase.java b/vtm/src/org/oscim/tiling/source/mapfile/MapDatabase.java index deba15da..5fdc5cd6 100644 --- a/vtm/src/org/oscim/tiling/source/mapfile/MapDatabase.java +++ b/vtm/src/org/oscim/tiling/source/mapfile/MapDatabase.java @@ -226,7 +226,6 @@ public class MapDatabase implements ITileDataSource { private int zoomLevelMax = Byte.MAX_VALUE; private boolean deduplicate; - private int level; public MapDatabase(MapFileTileSource tileSource) throws IOException { mTileSource = tileSource; @@ -435,10 +434,6 @@ public class MapDatabase implements ITileDataSource { this.deduplicate = deduplicate; } - void setLevel(int level) { - this.level = level; - } - private void setTileClipping(QueryParameters queryParameters, SubFileParameter subFileParameter, long currentRow, long currentCol) { long numRows = queryParameters.toBlockY - queryParameters.fromBlockY; @@ -708,7 +703,6 @@ public class MapDatabase implements ITileDataSource { continue; e.setLayer(layer); - e.level = level; PointOfInterest poi = null; if (pois != null) { @@ -1066,7 +1060,6 @@ public class MapDatabase implements ITileDataSource { e.simplify(1, true); e.setLayer(layer); - e.level = level; Way way = null; if (ways != null) { @@ -1085,8 +1078,11 @@ public class MapDatabase implements ITileDataSource { } if (mapDataSink != null) { - if (!deduplicate || way == null || ((TileDataSink) mapDataSink).hashWays.add(way.hashCode())) + TileDataSink tileDataSink = (TileDataSink) mapDataSink; + if (!deduplicate || way == null || tileDataSink.hashWays.add(way.hashCode())) { + e.level = e.isLine() ? tileDataSink.levels : tileDataSink.level; mapDataSink.process(e); + } } } } diff --git a/vtm/src/org/oscim/tiling/source/mapfile/MultiMapDatabase.java b/vtm/src/org/oscim/tiling/source/mapfile/MultiMapDatabase.java index 960f417f..1bb094fe 100644 --- a/vtm/src/org/oscim/tiling/source/mapfile/MultiMapDatabase.java +++ b/vtm/src/org/oscim/tiling/source/mapfile/MultiMapDatabase.java @@ -60,11 +60,12 @@ public class MultiMapDatabase implements ITileDataSource { } TileDataSink dataSink = new TileDataSink(sink); - for (int i = 0; i < mapDatabases.size(); i++) { + for (int i = 0, n = mapDatabases.size(); i < n; i++) { MapDatabase mapDatabase = mapDatabases.get(i); if (mapDatabase.supportsTile(tile)) { mapDatabase.setDeduplicate(deduplicate); - mapDatabase.setLevel(i); + dataSink.level = i + 1; + dataSink.levels = n; mapDatabase.query(tile, dataSink); } }