Merge pull request #502 from devemux86/overzoom

Map overzoom implementation
This commit is contained in:
Emux 2018-02-11 19:46:11 +02:00 committed by GitHub
commit bbc6e2cc65
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
25 changed files with 320 additions and 97 deletions

View File

@ -2,6 +2,7 @@
## New since 0.9.2 ## New since 0.9.2
- Map overzoom [#393](https://github.com/mapsforge/vtm/issues/393)
- S3DB layer [#475](https://github.com/mapsforge/vtm/pull/475) - S3DB layer [#475](https://github.com/mapsforge/vtm/pull/475)
- vtm-mvt module with MVT tile decoder [#481](https://github.com/mapsforge/vtm/pull/481) - vtm-mvt module with MVT tile decoder [#481](https://github.com/mapsforge/vtm/pull/481)
- Nextzen MVT / GeoJSON vector tiles [#498](https://github.com/mapsforge/vtm/issues/498) - Nextzen MVT / GeoJSON vector tiles [#498](https://github.com/mapsforge/vtm/issues/498)

View File

@ -90,6 +90,7 @@
<xs:enumeration value="ele" /> <xs:enumeration value="ele" />
<xs:enumeration value="addr:housenumber" /> <xs:enumeration value="addr:housenumber" />
<xs:enumeration value="addr_housenumber" /> <!-- Mapzen --> <xs:enumeration value="addr_housenumber" /> <!-- Mapzen -->
<xs:enumeration value="housenumber" /> <!-- OpenMapTiles -->
<xs:enumeration value="name" /> <xs:enumeration value="name" />
<xs:enumeration value="ref" /> <xs:enumeration value="ref" />
</xs:restriction> </xs:restriction>

View File

@ -1,6 +1,6 @@
/* /*
* Copyright 2014 Hannes Janetzek * Copyright 2014 Hannes Janetzek
* Copyright 2017 devemux86 * Copyright 2017-2018 devemux86
* *
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org). * This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
* *
@ -20,6 +20,7 @@ package org.oscim.tiling.source.geojson;
import org.oscim.core.MapElement; import org.oscim.core.MapElement;
import org.oscim.core.Tag; import org.oscim.core.Tag;
import org.oscim.tiling.ITileDataSource; import org.oscim.tiling.ITileDataSource;
import org.oscim.tiling.OverzoomTileDataSource;
import org.oscim.tiling.source.UrlTileDataSource; import org.oscim.tiling.source.UrlTileDataSource;
import org.oscim.tiling.source.UrlTileSource; import org.oscim.tiling.source.UrlTileSource;
@ -41,7 +42,7 @@ public abstract class GeojsonTileSource extends UrlTileSource {
@Override @Override
public ITileDataSource getDataSource() { public ITileDataSource getDataSource() {
return new UrlTileDataSource(this, new TileDecoder(this), getHttpEngine()); return new OverzoomTileDataSource(new UrlTileDataSource(this, new TileDecoder(this), getHttpEngine()), mOverZoom);
} }
public Tag getFeatureTag() { public Tag getFeatureTag() {

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2017 devemux86 * Copyright 2017-2018 devemux86
* Copyright 2017 Gustl22 * Copyright 2017 Gustl22
* *
* This program is free software: you can redistribute it and/or modify it under the * This program is free software: you can redistribute it and/or modify it under the
@ -17,6 +17,8 @@ package org.oscim.tiling.source.geojson;
import org.oscim.core.MapElement; import org.oscim.core.MapElement;
import org.oscim.core.Tag; import org.oscim.core.Tag;
import org.oscim.map.Viewport;
import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.UrlTileSource; import org.oscim.tiling.source.UrlTileSource;
import org.oscim.utils.FastMath; import org.oscim.utils.FastMath;
@ -32,8 +34,9 @@ public class MapzenGeojsonTileSource extends GeojsonTileSource {
private String locale = ""; private String locale = "";
public Builder() { public Builder() {
super(DEFAULT_URL, DEFAULT_PATH, 1, 17); super(DEFAULT_URL, DEFAULT_PATH, Viewport.MIN_ZOOM_LEVEL, TileSource.MAX_ZOOM);
keyName("api_key"); keyName("api_key");
overZoom(16);
} }
public T locale(String locale) { public T locale(String locale) {

View File

@ -16,6 +16,8 @@ package org.oscim.tiling.source.geojson;
import org.oscim.core.MapElement; import org.oscim.core.MapElement;
import org.oscim.core.Tag; import org.oscim.core.Tag;
import org.oscim.map.Viewport;
import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.UrlTileSource; import org.oscim.tiling.source.UrlTileSource;
import org.oscim.utils.FastMath; import org.oscim.utils.FastMath;
@ -31,8 +33,9 @@ public class NextzenGeojsonTileSource extends GeojsonTileSource {
private String locale = ""; private String locale = "";
public Builder() { public Builder() {
super(DEFAULT_URL, DEFAULT_PATH, 1, 17); super(DEFAULT_URL, DEFAULT_PATH, Viewport.MIN_ZOOM_LEVEL, TileSource.MAX_ZOOM);
keyName("api_key"); keyName("api_key");
overZoom(16);
} }
public T locale(String locale) { public T locale(String locale) {

View File

@ -1,6 +1,6 @@
/* /*
* Copyright 2013 Hannes Janetzek * Copyright 2013 Hannes Janetzek
* Copyright 2016-2017 devemux86 * Copyright 2016-2018 devemux86
* *
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org). * This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
* *
@ -17,7 +17,10 @@
*/ */
package org.oscim.tiling.source.mvt; package org.oscim.tiling.source.mvt;
import org.oscim.map.Viewport;
import org.oscim.tiling.ITileDataSource; import org.oscim.tiling.ITileDataSource;
import org.oscim.tiling.OverzoomTileDataSource;
import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.UrlTileDataSource; import org.oscim.tiling.source.UrlTileDataSource;
import org.oscim.tiling.source.UrlTileSource; import org.oscim.tiling.source.UrlTileSource;
@ -30,8 +33,9 @@ public class MapzenMvtTileSource extends UrlTileSource {
private String locale = ""; private String locale = "";
public Builder() { public Builder() {
super(DEFAULT_URL, DEFAULT_PATH, 1, 17); super(DEFAULT_URL, DEFAULT_PATH, Viewport.MIN_ZOOM_LEVEL, TileSource.MAX_ZOOM);
keyName("api_key"); keyName("api_key");
overZoom(16);
} }
public T locale(String locale) { public T locale(String locale) {
@ -66,6 +70,6 @@ public class MapzenMvtTileSource extends UrlTileSource {
@Override @Override
public ITileDataSource getDataSource() { public ITileDataSource getDataSource() {
return new UrlTileDataSource(this, new MvtTileDecoder(locale), getHttpEngine()); return new OverzoomTileDataSource(new UrlTileDataSource(this, new MvtTileDecoder(locale), getHttpEngine()), mOverZoom);
} }
} }

View File

@ -14,7 +14,10 @@
*/ */
package org.oscim.tiling.source.mvt; package org.oscim.tiling.source.mvt;
import org.oscim.map.Viewport;
import org.oscim.tiling.ITileDataSource; import org.oscim.tiling.ITileDataSource;
import org.oscim.tiling.OverzoomTileDataSource;
import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.UrlTileDataSource; import org.oscim.tiling.source.UrlTileDataSource;
import org.oscim.tiling.source.UrlTileSource; import org.oscim.tiling.source.UrlTileSource;
@ -27,8 +30,9 @@ public class NextzenMvtTileSource extends UrlTileSource {
private String locale = ""; private String locale = "";
public Builder() { public Builder() {
super(DEFAULT_URL, DEFAULT_PATH, 1, 17); super(DEFAULT_URL, DEFAULT_PATH, Viewport.MIN_ZOOM_LEVEL, TileSource.MAX_ZOOM);
keyName("api_key"); keyName("api_key");
overZoom(16);
} }
public T locale(String locale) { public T locale(String locale) {
@ -63,6 +67,6 @@ public class NextzenMvtTileSource extends UrlTileSource {
@Override @Override
public ITileDataSource getDataSource() { public ITileDataSource getDataSource() {
return new UrlTileDataSource(this, new MvtTileDecoder(locale), getHttpEngine()); return new OverzoomTileDataSource(new UrlTileDataSource(this, new MvtTileDecoder(locale), getHttpEngine()), mOverZoom);
} }
} }

View File

@ -1,6 +1,6 @@
/* /*
* Copyright 2013 Hannes Janetzek * Copyright 2013 Hannes Janetzek
* Copyright 2016-2017 devemux86 * Copyright 2016-2018 devemux86
* Copyright 2018 boldtrn * Copyright 2018 boldtrn
* *
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org). * This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
@ -18,7 +18,10 @@
*/ */
package org.oscim.tiling.source.mvt; package org.oscim.tiling.source.mvt;
import org.oscim.map.Viewport;
import org.oscim.tiling.ITileDataSource; import org.oscim.tiling.ITileDataSource;
import org.oscim.tiling.OverzoomTileDataSource;
import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.UrlTileDataSource; import org.oscim.tiling.source.UrlTileDataSource;
import org.oscim.tiling.source.UrlTileSource; import org.oscim.tiling.source.UrlTileSource;
@ -31,7 +34,8 @@ public class OpenMapTilesMvtTileSource extends UrlTileSource {
private String locale = ""; private String locale = "";
public Builder() { public Builder() {
super(DEFAULT_URL, DEFAULT_PATH, 1, 14); super(DEFAULT_URL, DEFAULT_PATH, Viewport.MIN_ZOOM_LEVEL, TileSource.MAX_ZOOM);
overZoom(14);
} }
public T locale(String locale) { public T locale(String locale) {
@ -66,6 +70,6 @@ public class OpenMapTilesMvtTileSource extends UrlTileSource {
@Override @Override
public ITileDataSource getDataSource() { public ITileDataSource getDataSource() {
return new UrlTileDataSource(this, new MvtTileDecoder(locale), getHttpEngine()); return new OverzoomTileDataSource(new UrlTileDataSource(this, new MvtTileDecoder(locale), getHttpEngine()), mOverZoom);
} }
} }

View File

@ -376,22 +376,39 @@
</m> </m>
<!-- building --> <!-- building -->
<m k="layer" v="building"> <m k="layer" v="building|building:part">
<m zoom-min="14"> <m v="building">
<m closed="yes"> <m zoom-min="14">
<area fade="14" use="building" /> <m closed="yes">
<area fade="14" use="building" />
</m>
<m closed="no">
<line fade="14" use="building" />
</m>
</m> </m>
</m> </m>
<m v="building:part">
<m zoom-min="16">
<m closed="yes">
<area fade="16" use="building" />
</m>
<m closed="no">
<line fade="16" use="building" />
</m>
</m>
</m>
<m zoom-min="17">
<extrusion line-color="#ffd9d8d6" side-color="#eaecebe9" top-color="#eaf9f8f6" />
</m>
</m> </m>
<!-- housenumber --> <!-- housenumber -->
<!-- TODO it's weird that not all housenumbers are shown... also needed to put zoom-min to 14 --> <m k="layer" v="housenumber" zoom-min="17">
<!--<m k="layer" v="housenumber" zoom-min="14"> <caption style="bold" fill="#606060" font-family="condensed" k="housenumber" priority="10"
<caption style="bold" fill="#606060" k="housenumber" size="12" stroke="#ffffff" size="12" stroke="#ffffff" stroke-width="2.0" />
stroke-width="2.0" /> </m>
</m>-->
<m k="layer" v="poi" zoom-min="14">
<m k="subclass">
<m k="layer" v="poi">
<m k="subclass">
<!-- Shop --> <!-- Shop -->
<m select="first" zoom-min="15"> <m select="first" zoom-min="15">
@ -401,7 +418,7 @@
<!--<m v="florist"> <!--<m v="florist">
<symbol src="assets:symbols/shopping/florist.svg" /> <symbol src="assets:symbols/shopping/florist.svg" />
</m>--> </m>-->
<!--<m v="hairdresser" zoom-min="16"> <!--<m v="hairdresser">
<symbol src="assets:symbols/shopping/hairdresser.svg" /> <symbol src="assets:symbols/shopping/hairdresser.svg" />
</m>--> </m>-->
<m v="supermarket|organic"> <m v="supermarket|organic">
@ -418,7 +435,7 @@
</m> </m>
<!-- Tourism --> <!-- Tourism -->
<m select="first" zoom-min="14"> <m select="first" zoom-min="15">
<m v="alpine_hut"> <m v="alpine_hut">
<symbol src="assets:symbols/accommodation/alpinehut.svg" /> <symbol src="assets:symbols/accommodation/alpinehut.svg" />
</m> </m>
@ -437,15 +454,17 @@
</m> </m>
</m> </m>
<m v="viewpoint"> <m select="first" zoom-min="15">
<symbol src="assets:symbols/custom/tourist/view_point.svg" /> <m v="viewpoint">
</m> <symbol src="assets:symbols/custom/tourist/view_point.svg" />
<m v="museum"> </m>
<symbol src="assets:symbols/custom/tourist/museum.svg" /> <m v="museum">
</m> <symbol src="assets:symbols/custom/tourist/museum.svg" />
</m>
<m zoom-min="14"> <m select="when-matched">
<text use="caption-small-blue" /> <text use="caption-small-blue" />
</m>
</m> </m>
</m> </m>
</m> </m>

View File

@ -1,3 +1,20 @@
/*
* Copyright 2013 Hannes Janetzek
* Copyright 2018 devemux86
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.oscim.tiling.source.bitmap; package org.oscim.tiling.source.bitmap;
import com.google.gwt.event.dom.client.ErrorEvent; import com.google.gwt.event.dom.client.ErrorEvent;
@ -13,9 +30,11 @@ import org.oscim.gdx.client.GwtBitmap;
import org.oscim.layers.tile.LoadDelayTask; import org.oscim.layers.tile.LoadDelayTask;
import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.MapTile;
import org.oscim.layers.tile.TileLoader; import org.oscim.layers.tile.TileLoader;
import org.oscim.map.Viewport;
import org.oscim.tiling.ITileDataSink; import org.oscim.tiling.ITileDataSink;
import org.oscim.tiling.ITileDataSource; import org.oscim.tiling.ITileDataSource;
import org.oscim.tiling.QueryResult; import org.oscim.tiling.QueryResult;
import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.LwHttp; import org.oscim.tiling.source.LwHttp;
import org.oscim.tiling.source.UrlTileSource; import org.oscim.tiling.source.UrlTileSource;
import org.slf4j.Logger; import org.slf4j.Logger;
@ -27,7 +46,7 @@ public class BitmapTileSource extends UrlTileSource {
public static class Builder<T extends Builder<T>> extends UrlTileSource.Builder<T> { public static class Builder<T extends Builder<T>> extends UrlTileSource.Builder<T> {
public Builder() { public Builder() {
super(null, "/{Z}/{X}/{Y}.png", 0, 17); super(null, "/{Z}/{X}/{Y}.png", Viewport.MIN_ZOOM_LEVEL, TileSource.MAX_ZOOM);
} }
public BitmapTileSource build() { public BitmapTileSource build() {

View File

@ -1,5 +1,6 @@
/* /*
* Copyright 2013 Hannes Janetzek * Copyright 2013 Hannes Janetzek
* Copyright 2018 devemux86
* *
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org). * This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
* *
@ -14,7 +15,6 @@
* You should have received a copy of the GNU Lesser General Public License along with * You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>. * this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.oscim.layers.tile; package org.oscim.layers.tile;
import org.oscim.core.MapPosition; import org.oscim.core.MapPosition;
@ -153,12 +153,10 @@ public class TileManager {
void onTileManagerEvent(Event event, MapTile tile); void onTileManagerEvent(Event event, MapTile tile);
} }
;
public TileManager(Map map, int cacheLimit) { public TileManager(Map map, int cacheLimit) {
mMap = map; mMap = map;
mMaxZoom = 20; mMaxZoom = map.viewport().getMaxZoomLevel();
mMinZoom = 0; mMinZoom = map.viewport().getMinZoomLevel();
mCacheLimit = cacheLimit; mCacheLimit = cacheLimit;
mCacheReduce = 0; mCacheReduce = 0;

View File

@ -1,6 +1,6 @@
/* /*
* Copyright 2013 Hannes Janetzek * Copyright 2013 Hannes Janetzek
* Copyright 2016 devemux86 * Copyright 2016-2018 devemux86
* *
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org). * This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
* *
@ -21,16 +21,15 @@ import org.oscim.core.Tag;
import org.oscim.core.TagSet; import org.oscim.core.TagSet;
import org.oscim.layers.tile.TileLoader; import org.oscim.layers.tile.TileLoader;
import org.oscim.map.Map; import org.oscim.map.Map;
import org.oscim.tiling.TileSource;
import org.oscim.utils.Utils; import org.oscim.utils.Utils;
public class OsmTileLayer extends VectorTileLayer { public class OsmTileLayer extends VectorTileLayer {
private static final int MAX_ZOOMLEVEL = 17;
private static final int MIN_ZOOMLEVEL = 2;
private static final int CACHE_LIMIT = 150; private static final int CACHE_LIMIT = 150;
public OsmTileLayer(Map map) { public OsmTileLayer(Map map) {
this(map, MIN_ZOOMLEVEL, MAX_ZOOMLEVEL); this(map, map.viewport().getMinZoomLevel(), TileSource.MAX_ZOOM);
} }
public OsmTileLayer(Map map, int zoomMin, int zoomMax) { public OsmTileLayer(Map map, int zoomMin, int zoomMax) {

View File

@ -55,7 +55,6 @@ public class VectorTileLoader extends TileLoader implements RenderStyle.Callback
protected static final byte LAYERS = 11; protected static final byte LAYERS = 11;
public static final byte STROKE_MIN_ZOOM = 12; public static final byte STROKE_MIN_ZOOM = 12;
public static final byte STROKE_MAX_ZOOM = 17;
protected IRenderTheme renderTheme; protected IRenderTheme renderTheme;

View File

@ -39,13 +39,13 @@ import org.oscim.utils.FastMath;
*/ */
public class Viewport { public class Viewport {
public final static int MAX_ZOOMLEVEL = 20; public final static int MAX_ZOOM_LEVEL = 20;
public final static int MIN_ZOOMLEVEL = 2; public final static int MIN_ZOOM_LEVEL = 2;
public final static float MIN_TILT = 0; public final static float MIN_TILT = 0;
public final static float MAX_TILT = 65; public final static float MAX_TILT = 65;
protected double mMaxScale = (1 << MAX_ZOOMLEVEL); protected double mMaxScale = (1 << MAX_ZOOM_LEVEL);
protected double mMinScale = (1 << MIN_ZOOMLEVEL); protected double mMinScale = (1 << MIN_ZOOM_LEVEL);
protected float mMinTilt = MIN_TILT; protected float mMinTilt = MIN_TILT;
protected float mMaxTilt = MAX_TILT; protected float mMaxTilt = MAX_TILT;
@ -92,7 +92,7 @@ public class Viewport {
mPos.scale = mMinScale; mPos.scale = mMinScale;
mPos.x = 0.5; mPos.x = 0.5;
mPos.y = 0.5; mPos.y = 0.5;
mPos.zoomLevel = MIN_ZOOMLEVEL; mPos.zoomLevel = MIN_ZOOM_LEVEL;
mPos.bearing = 0; mPos.bearing = 0;
mPos.tilt = 0; mPos.tilt = 0;
mPos.roll = 0; mPos.roll = 0;

View File

@ -0,0 +1,60 @@
/*
* Copyright 2018 devemux86
*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.oscim.tiling;
import org.oscim.backend.CanvasAdapter;
import org.oscim.backend.canvas.Bitmap;
import org.oscim.core.MapElement;
import org.oscim.core.Tile;
import org.oscim.utils.geom.TileClipper;
class OverzoomDataSink implements ITileDataSink {
private final ITileDataSink sink;
private final TileClipper clipper;
private final float dx, dy, scale;
OverzoomDataSink(ITileDataSink sink, Tile overzoomTile, Tile tile) {
this.sink = sink;
int diff = tile.zoomLevel - overzoomTile.zoomLevel;
dx = (tile.tileX - (overzoomTile.tileX << diff)) * Tile.SIZE;
dy = (tile.tileY - (overzoomTile.tileY << diff)) * Tile.SIZE;
scale = 1 << diff;
float buffer = 32 * CanvasAdapter.getScale();
clipper = new TileClipper((dx - buffer) / scale, (dy - buffer) / scale,
(dx + Tile.SIZE + buffer) / scale, (dy + Tile.SIZE + buffer) / scale);
}
@Override
public void process(MapElement element) {
if (!clipper.clip(element))
return;
element.scale(scale, scale);
element.translate(-dx, -dy);
sink.process(element);
}
@Override
public void setTileImage(Bitmap bitmap) {
sink.setTileImage(bitmap);
}
@Override
public void completed(QueryResult result) {
sink.completed(result);
}
}

View File

@ -0,0 +1,50 @@
/*
* Copyright 2018 devemux86
*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.oscim.tiling;
import org.oscim.layers.tile.MapTile;
public class OverzoomTileDataSource implements ITileDataSource {
private final ITileDataSource tileDataSource;
private final int overZoom;
public OverzoomTileDataSource(ITileDataSource tileDataSource, int overZoom) {
this.tileDataSource = tileDataSource;
this.overZoom = overZoom;
}
@Override
public void query(MapTile tile, ITileDataSink sink) {
MapTile mapTile = tile;
ITileDataSink dataSink = sink;
int diff = tile.zoomLevel - overZoom;
if (diff > 0) {
mapTile = new MapTile(tile.node, tile.tileX >> diff, tile.tileY >> diff, overZoom);
dataSink = new OverzoomDataSink(sink, mapTile, tile);
}
tileDataSource.query(mapTile, dataSink);
}
@Override
public void dispose() {
tileDataSource.dispose();
}
@Override
public void cancel() {
tileDataSource.cancel();
}
}

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2016 devemux86 * Copyright 2016-2018 devemux86
* *
* This program is free software: you can redistribute it and/or modify it under the * 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 * terms of the GNU Lesser General Public License as published by the Free Software
@ -12,34 +12,32 @@
* You should have received a copy of the GNU Lesser General Public License along with * You should have received a copy of the GNU Lesser General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>. * this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package org.oscim.tiling.source.mapfile; package org.oscim.tiling;
import org.oscim.backend.canvas.Bitmap; import org.oscim.backend.canvas.Bitmap;
import org.oscim.core.MapElement; import org.oscim.core.MapElement;
import org.oscim.tiling.ITileDataSink;
import org.oscim.tiling.QueryResult;
class MultiMapDataSink implements ITileDataSink { public class TileDataSink implements ITileDataSink {
private QueryResult result; private QueryResult result;
private final ITileDataSink tileDataSink; private final ITileDataSink sink;
MultiMapDataSink(ITileDataSink tileDataSink) { public TileDataSink(ITileDataSink sink) {
this.tileDataSink = tileDataSink; this.sink = sink;
} }
QueryResult getResult() { public QueryResult getResult() {
return result; return result;
} }
@Override @Override
public void process(MapElement element) { public void process(MapElement element) {
tileDataSink.process(element); sink.process(element);
} }
@Override @Override
public void setTileImage(Bitmap bitmap) { public void setTileImage(Bitmap bitmap) {
tileDataSink.setTileImage(bitmap); sink.setTileImage(bitmap);
} }
@Override @Override

View File

@ -19,6 +19,7 @@
package org.oscim.tiling; package org.oscim.tiling;
import org.oscim.layers.tile.bitmap.BitmapTileLayer.FadeStep; import org.oscim.layers.tile.bitmap.BitmapTileLayer.FadeStep;
import org.oscim.map.Viewport;
import java.util.HashMap; import java.util.HashMap;
@ -26,7 +27,9 @@ public abstract class TileSource {
public abstract static class Builder<T extends Builder<T>> { public abstract static class Builder<T extends Builder<T>> {
protected float alpha = 1; protected float alpha = 1;
protected int zoomMin, zoomMax; protected int zoomMin = Viewport.MIN_ZOOM_LEVEL;
protected int zoomMax = TileSource.MAX_ZOOM;
protected int overZoom = TileSource.MAX_ZOOM;
protected FadeStep[] fadeSteps; protected FadeStep[] fadeSteps;
protected String name; protected String name;
protected int tileSize = 256; protected int tileSize = 256;
@ -46,6 +49,11 @@ public abstract class TileSource {
return self(); return self();
} }
public T overZoom(int zoom) {
overZoom = zoom;
return self();
}
public T fadeSteps(FadeStep[] fadeSteps) { public T fadeSteps(FadeStep[] fadeSteps) {
this.fadeSteps = fadeSteps; this.fadeSteps = fadeSteps;
return self(); return self();
@ -69,24 +77,38 @@ public abstract class TileSource {
public abstract TileSource build(); public abstract TileSource build();
} }
// FIXME Same as BuildingLayer.MAX_ZOOM
public static final int MAX_ZOOM = 17;
protected float mAlpha = 1; protected float mAlpha = 1;
protected int mZoomMin = 0; protected int mZoomMin = Viewport.MIN_ZOOM_LEVEL;
protected int mZoomMax = 20; protected int mZoomMax = TileSource.MAX_ZOOM;
protected int mOverZoom = TileSource.MAX_ZOOM;
protected FadeStep[] mFadeSteps;
protected String mName; protected String mName;
protected int mTileSize = 256; protected int mTileSize = 256;
protected final Options options = new Options();
public ITileCache tileCache;
protected TileSource() { protected TileSource() {
} }
protected TileSource(int zoomMin, int zoomMax) { protected TileSource(int zoomMin, int zoomMax) {
this(zoomMin, zoomMax, zoomMax);
}
protected TileSource(int zoomMin, int zoomMax, int overZoom) {
mZoomMin = zoomMin; mZoomMin = zoomMin;
mZoomMax = zoomMax; mZoomMax = zoomMax;
mOverZoom = overZoom;
} }
public TileSource(Builder<?> builder) { public TileSource(Builder<?> builder) {
mAlpha = builder.alpha; mAlpha = builder.alpha;
mZoomMin = builder.zoomMin; mZoomMin = builder.zoomMin;
mZoomMax = builder.zoomMax; mZoomMax = builder.zoomMax;
mOverZoom = builder.overZoom;
mFadeSteps = builder.fadeSteps; mFadeSteps = builder.fadeSteps;
mName = builder.name; mName = builder.name;
mTileSize = builder.tileSize; mTileSize = builder.tileSize;
@ -98,12 +120,6 @@ public abstract class TileSource {
public abstract void close(); public abstract void close();
protected final Options options = new Options();
public ITileCache tileCache;
private FadeStep[] mFadeSteps;
public float getAlpha() { public float getAlpha() {
return mAlpha; return mAlpha;
} }
@ -123,6 +139,10 @@ public abstract class TileSource {
return mZoomMin; return mZoomMin;
} }
public int getOverZoom() {
return mOverZoom;
}
public void setFadeSteps(FadeStep[] fadeSteps) { public void setFadeSteps(FadeStep[] fadeSteps) {
mFadeSteps = fadeSteps; mFadeSteps = fadeSteps;
} }

View File

@ -1,6 +1,6 @@
/* /*
* Copyright 2013 Hannes Janetzek * Copyright 2013 Hannes Janetzek
* Copyright 2016-2017 devemux86 * Copyright 2016-2018 devemux86
* Copyright 2016 Izumi Kawashima * Copyright 2016 Izumi Kawashima
* *
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org). * This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
@ -19,6 +19,7 @@
package org.oscim.tiling.source; package org.oscim.tiling.source;
import org.oscim.core.Tile; import org.oscim.core.Tile;
import org.oscim.map.Viewport;
import org.oscim.tiling.TileSource; import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.LwHttp.LwHttpFactory; import org.oscim.tiling.source.LwHttp.LwHttpFactory;
@ -39,9 +40,13 @@ public abstract class UrlTileSource extends TileSource {
protected Builder() { protected Builder() {
} }
protected Builder(String url, String tilePath, int zoomMin, int zoomMax) { protected Builder(String url, String tilePath) {
this.url = url; this.url = url;
this.tilePath = tilePath; this.tilePath = tilePath;
}
protected Builder(String url, String tilePath, int zoomMin, int zoomMax) {
this(url, tilePath);
this.zoomMin = zoomMin; this.zoomMin = zoomMin;
this.zoomMax = zoomMax; this.zoomMax = zoomMax;
} }
@ -97,7 +102,7 @@ public abstract class UrlTileSource extends TileSource {
} }
protected UrlTileSource(String urlString, String tilePath) { protected UrlTileSource(String urlString, String tilePath) {
this(urlString, tilePath, 0, 17); this(urlString, tilePath, Viewport.MIN_ZOOM_LEVEL, TileSource.MAX_ZOOM);
} }
protected UrlTileSource(String urlString, String tilePath, int zoomMin, int zoomMax) { protected UrlTileSource(String urlString, String tilePath, int zoomMin, int zoomMax) {

View File

@ -1,10 +1,29 @@
/*
* Copyright 2013 Hannes Janetzek
* Copyright 2018 devemux86
*
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
*
* 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 <http://www.gnu.org/licenses/>.
*/
package org.oscim.tiling.source.bitmap; package org.oscim.tiling.source.bitmap;
import org.oscim.backend.CanvasAdapter; import org.oscim.backend.CanvasAdapter;
import org.oscim.backend.canvas.Bitmap; import org.oscim.backend.canvas.Bitmap;
import org.oscim.core.Tile; import org.oscim.core.Tile;
import org.oscim.map.Viewport;
import org.oscim.tiling.ITileDataSink; import org.oscim.tiling.ITileDataSink;
import org.oscim.tiling.ITileDataSource; import org.oscim.tiling.ITileDataSource;
import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.ITileDecoder; import org.oscim.tiling.source.ITileDecoder;
import org.oscim.tiling.source.LwHttp; import org.oscim.tiling.source.LwHttp;
import org.oscim.tiling.source.UrlTileDataSource; import org.oscim.tiling.source.UrlTileDataSource;
@ -21,7 +40,7 @@ public class BitmapTileSource extends UrlTileSource {
public static class Builder<T extends Builder<T>> extends UrlTileSource.Builder<T> { public static class Builder<T extends Builder<T>> extends UrlTileSource.Builder<T> {
public Builder() { public Builder() {
super(null, "/{Z}/{X}/{Y}.png", 0, 17); super(null, "/{Z}/{X}/{Y}.png", Viewport.MIN_ZOOM_LEVEL, TileSource.MAX_ZOOM);
} }
public BitmapTileSource build() { public BitmapTileSource build() {

View File

@ -2,7 +2,7 @@
* Copyright 2010, 2011, 2012 mapsforge.org * Copyright 2010, 2011, 2012 mapsforge.org
* Copyright 2013, 2014 Hannes Janetzek * Copyright 2013, 2014 Hannes Janetzek
* Copyright 2014-2015 Ludwig M Brinckmann * Copyright 2014-2015 Ludwig M Brinckmann
* Copyright 2016-2017 devemux86 * Copyright 2016-2018 devemux86
* Copyright 2016 Andrey Novikov * Copyright 2016 Andrey Novikov
* Copyright 2017 Gustl22 * Copyright 2017 Gustl22
* *
@ -32,6 +32,7 @@ import org.oscim.core.Tile;
import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.MapTile;
import org.oscim.tiling.ITileDataSink; import org.oscim.tiling.ITileDataSink;
import org.oscim.tiling.ITileDataSource; import org.oscim.tiling.ITileDataSource;
import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.mapfile.header.SubFileParameter; import org.oscim.tiling.source.mapfile.header.SubFileParameter;
import org.oscim.utils.Parameters; import org.oscim.utils.Parameters;
import org.oscim.utils.geom.TileClipper; import org.oscim.utils.geom.TileClipper;
@ -414,7 +415,7 @@ public class MapDatabase implements ITileDataSource {
// At large query zoom levels use enlarged buffer // At large query zoom levels use enlarged buffer
int buffer; int buffer;
if (queryParameters.queryZoomLevel > MapFileTileSource.MAX_ZOOM_LEVEL) if (queryParameters.queryZoomLevel > TileSource.MAX_ZOOM)
buffer = Tile.SIZE / 2; buffer = Tile.SIZE / 2;
else else
buffer = (int) (16 * CanvasAdapter.getScale() + 0.5f); buffer = (int) (16 * CanvasAdapter.getScale() + 0.5f);
@ -956,7 +957,7 @@ public class MapDatabase implements ITileDataSource {
// At large query zoom levels clip everything // At large query zoom levels clip everything
if ((!e.tags.containsKey(Tag.KEY_BUILDING) if ((!e.tags.containsKey(Tag.KEY_BUILDING)
&& !e.tags.containsKey(Tag.KEY_BUILDING_PART)) && !e.tags.containsKey(Tag.KEY_BUILDING_PART))
|| queryParameters.queryZoomLevel > MapFileTileSource.MAX_ZOOM_LEVEL) { || queryParameters.queryZoomLevel > TileSource.MAX_ZOOM) {
if (!mTileClipper.clip(e)) { if (!mTileClipper.clip(e)) {
continue; continue;
} }

View File

@ -1,7 +1,7 @@
/* /*
* Copyright 2013 mapsforge.org * Copyright 2013 mapsforge.org
* Copyright 2013 Hannes Janetzek * Copyright 2013 Hannes Janetzek
* Copyright 2016-2017 devemux86 * Copyright 2016-2018 devemux86
* *
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org). * This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
* *
@ -18,7 +18,9 @@
*/ */
package org.oscim.tiling.source.mapfile; package org.oscim.tiling.source.mapfile;
import org.oscim.map.Viewport;
import org.oscim.tiling.ITileDataSource; import org.oscim.tiling.ITileDataSource;
import org.oscim.tiling.OverzoomTileDataSource;
import org.oscim.tiling.TileSource; import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.mapfile.header.MapFileHeader; import org.oscim.tiling.source.mapfile.header.MapFileHeader;
import org.oscim.tiling.source.mapfile.header.MapFileInfo; import org.oscim.tiling.source.mapfile.header.MapFileInfo;
@ -37,7 +39,6 @@ public class MapFileTileSource extends TileSource implements IMapFileTileSource
* Amount of cache blocks that the index cache should store. * Amount of cache blocks that the index cache should store.
*/ */
private static final int INDEX_CACHE_SIZE = 64; private static final int INDEX_CACHE_SIZE = 64;
static final int MAX_ZOOM_LEVEL = 17;
private static final String READ_ONLY_MODE = "r"; private static final String READ_ONLY_MODE = "r";
MapFileHeader fileHeader; MapFileHeader fileHeader;
@ -54,11 +55,15 @@ public class MapFileTileSource extends TileSource implements IMapFileTileSource
private Callback callback; private Callback callback;
public MapFileTileSource() { public MapFileTileSource() {
this(0, MAX_ZOOM_LEVEL); this(Viewport.MIN_ZOOM_LEVEL, TileSource.MAX_ZOOM);
} }
public MapFileTileSource(int zoomMin, int zoomMax) { public MapFileTileSource(int zoomMin, int zoomMax) {
super(zoomMin, zoomMax); this(zoomMin, zoomMax, zoomMax);
}
public MapFileTileSource(int zoomMin, int zoomMax, int overZoom) {
super(zoomMin, zoomMax, overZoom);
} }
/** /**
@ -149,7 +154,7 @@ public class MapFileTileSource extends TileSource implements IMapFileTileSource
@Override @Override
public ITileDataSource getDataSource() { public ITileDataSource getDataSource() {
try { try {
return new MapDatabase(this); return new OverzoomTileDataSource(new MapDatabase(this), mOverZoom);
} catch (IOException e) { } catch (IOException e) {
log.debug(e.getMessage()); log.debug(e.getMessage());
} }

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2016-2017 devemux86 * Copyright 2016-2018 devemux86
* *
* This program is free software: you can redistribute it and/or modify it under the * 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 * terms of the GNU Lesser General Public License as published by the Free Software
@ -18,6 +18,7 @@ import org.oscim.core.Tile;
import org.oscim.layers.tile.MapTile; import org.oscim.layers.tile.MapTile;
import org.oscim.tiling.ITileDataSink; import org.oscim.tiling.ITileDataSink;
import org.oscim.tiling.ITileDataSource; import org.oscim.tiling.ITileDataSource;
import org.oscim.tiling.TileDataSink;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -25,10 +26,8 @@ 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) { public MultiMapDatabase() {
this.tileSource = tileSource;
} }
public boolean add(MapDatabase mapDatabase) { public boolean add(MapDatabase mapDatabase) {
@ -39,13 +38,13 @@ public class MultiMapDatabase implements ITileDataSource {
} }
@Override @Override
public void query(MapTile tile, ITileDataSink mapDataSink) { public void query(MapTile tile, ITileDataSink sink) {
MultiMapDataSink multiMapDataSink = new MultiMapDataSink(mapDataSink); TileDataSink dataSink = new TileDataSink(sink);
for (MapDatabase mapDatabase : mapDatabases) { for (MapDatabase mapDatabase : mapDatabases) {
if (mapDatabase.supportsTile(tile)) if (mapDatabase.supportsTile(tile))
mapDatabase.query(tile, multiMapDataSink); mapDatabase.query(tile, dataSink);
} }
mapDataSink.completed(multiMapDataSink.getResult()); sink.completed(dataSink.getResult());
} }
@Override @Override

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2016-2017 devemux86 * Copyright 2016-2018 devemux86
* *
* This program is free software: you can redistribute it and/or modify it under the * 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 * terms of the GNU Lesser General Public License as published by the Free Software
@ -15,7 +15,9 @@
package org.oscim.tiling.source.mapfile; package org.oscim.tiling.source.mapfile;
import org.oscim.core.BoundingBox; import org.oscim.core.BoundingBox;
import org.oscim.map.Viewport;
import org.oscim.tiling.ITileDataSource; import org.oscim.tiling.ITileDataSource;
import org.oscim.tiling.OverzoomTileDataSource;
import org.oscim.tiling.TileSource; import org.oscim.tiling.TileSource;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -34,11 +36,15 @@ public class MultiMapFileTileSource extends TileSource implements IMapFileTileSo
private final Map<MapFileTileSource, int[]> zoomsByTileSource = new HashMap<>(); private final Map<MapFileTileSource, int[]> zoomsByTileSource = new HashMap<>();
public MultiMapFileTileSource() { public MultiMapFileTileSource() {
this(0, 17); this(Viewport.MIN_ZOOM_LEVEL, TileSource.MAX_ZOOM);
} }
public MultiMapFileTileSource(int zoomMin, int zoomMax) { public MultiMapFileTileSource(int zoomMin, int zoomMax) {
super(zoomMin, zoomMax); this(zoomMin, zoomMax, zoomMax);
}
public MultiMapFileTileSource(int zoomMin, int zoomMax, int overZoom) {
super(zoomMin, zoomMax, overZoom);
} }
public boolean add(MapFileTileSource mapFileTileSource) { public boolean add(MapFileTileSource mapFileTileSource) {
@ -65,7 +71,7 @@ public class MultiMapFileTileSource extends TileSource implements IMapFileTileSo
@Override @Override
public ITileDataSource getDataSource() { public ITileDataSource getDataSource() {
MultiMapDatabase multiMapDatabase = new MultiMapDatabase(this); MultiMapDatabase multiMapDatabase = new MultiMapDatabase();
for (MapFileTileSource mapFileTileSource : mapFileTileSources) { for (MapFileTileSource mapFileTileSource : mapFileTileSources) {
try { try {
MapDatabase mapDatabase = new MapDatabase(mapFileTileSource); MapDatabase mapDatabase = new MapDatabase(mapFileTileSource);
@ -77,7 +83,7 @@ public class MultiMapFileTileSource extends TileSource implements IMapFileTileSo
log.debug(e.getMessage()); log.debug(e.getMessage());
} }
} }
return multiMapDatabase; return new OverzoomTileDataSource(multiMapDatabase, mOverZoom);
} }
@Override @Override

View File

@ -1,5 +1,6 @@
/* /*
* Copyright 2013 Hannes Janetzek * Copyright 2013 Hannes Janetzek
* Copyright 2018 devemux86
* *
* This file is part of the OpenScienceMap project (http://www.opensciencemap.org). * This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
* *
@ -16,7 +17,10 @@
*/ */
package org.oscim.tiling.source.oscimap4; package org.oscim.tiling.source.oscimap4;
import org.oscim.map.Viewport;
import org.oscim.tiling.ITileDataSource; import org.oscim.tiling.ITileDataSource;
import org.oscim.tiling.OverzoomTileDataSource;
import org.oscim.tiling.TileSource;
import org.oscim.tiling.source.UrlTileDataSource; import org.oscim.tiling.source.UrlTileDataSource;
import org.oscim.tiling.source.UrlTileSource; import org.oscim.tiling.source.UrlTileSource;
@ -28,7 +32,8 @@ public class OSciMap4TileSource extends UrlTileSource {
public static class Builder<T extends Builder<T>> extends UrlTileSource.Builder<T> { public static class Builder<T extends Builder<T>> extends UrlTileSource.Builder<T> {
public Builder() { public Builder() {
super(DEFAULT_URL, DEFAULT_PATH, 1, 17); super(DEFAULT_URL, DEFAULT_PATH, Viewport.MIN_ZOOM_LEVEL, TileSource.MAX_ZOOM);
overZoom(17);
} }
public OSciMap4TileSource build() { public OSciMap4TileSource build() {
@ -55,6 +60,6 @@ public class OSciMap4TileSource extends UrlTileSource {
@Override @Override
public ITileDataSource getDataSource() { public ITileDataSource getDataSource() {
return new UrlTileDataSource(this, new TileDecoder(), getHttpEngine()); return new OverzoomTileDataSource(new UrlTileDataSource(this, new TileDecoder(), getHttpEngine()), mOverZoom);
} }
} }