Ignore:
Timestamp:
2016-02-17T23:27:47+01:00 (8 years ago)
Author:
wiktorn
Message:

Snap scale to mercator zoom levels.

See #12350

Patch submitted by: kolesar

Location:
trunk/src/org/openstreetmap/josm/gui/layer
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/layer/TMSLayer.java

    r9731 r9818  
    55
    66import org.apache.commons.jcs.access.CacheAccess;
     7import org.openstreetmap.gui.jmapviewer.OsmMercator;
    78import org.openstreetmap.gui.jmapviewer.interfaces.TileLoader;
    89import org.openstreetmap.gui.jmapviewer.tilesources.AbstractTMSTileSource;
     
    2930 *
    3031 */
    31 public class TMSLayer extends AbstractCachedTileSourceLayer {
     32public class TMSLayer extends AbstractCachedTileSourceLayer implements NativeScaleLayer {
    3233    private static final String CACHE_REGION_NAME = "TMS";
    3334
     
    145146        return AbstractCachedTileSourceLayer.getCache(CACHE_REGION_NAME);
    146147    }
     148
     149    @Override
     150    public ScaleList getNativeScales() {
     151        ScaleList scales = new ScaleList();
     152        for (int zoom = info.getMinZoom(); zoom <= info.getMaxZoom(); zoom++) {
     153            double scale = OsmMercator.EARTH_RADIUS * Math.PI * 2 / Math.pow(2, zoom) / OsmMercator.DEFAUL_TILE_SIZE;
     154            scales.add(new Scale(scale));
     155        }
     156        return scales;
     157    }
    147158}
  • trunk/src/org/openstreetmap/josm/gui/layer/WMTSLayer.java

    r9430 r9818  
    66
    77import org.apache.commons.jcs.access.CacheAccess;
    8 import org.openstreetmap.gui.jmapviewer.TileXY;
    9 import org.openstreetmap.gui.jmapviewer.interfaces.ICoordinate;
    108import org.openstreetmap.gui.jmapviewer.interfaces.TileLoader;
    119import org.openstreetmap.gui.jmapviewer.tilesources.AbstractTMSTileSource;
    1210import org.openstreetmap.josm.Main;
    1311import org.openstreetmap.josm.data.cache.BufferedImageCacheEntry;
    14 import org.openstreetmap.josm.data.coor.LatLon;
    1512import org.openstreetmap.josm.data.imagery.ImageryInfo;
    1613import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType;
     
    1916import org.openstreetmap.josm.data.preferences.BooleanProperty;
    2017import org.openstreetmap.josm.data.projection.Projection;
    21 import org.openstreetmap.josm.gui.MapView;
    2218
    2319/**
     
    2824 * http://www.opengeospatial.org/standards/wmts
    2925 *
    30  * @author Wiktor Niesiobędzki
     26 * @author Wiktor NiesiobÄ™dzki
    3127 *
    3228 */
    33 public class WMTSLayer extends AbstractCachedTileSourceLayer {
     29public class WMTSLayer extends AbstractCachedTileSourceLayer implements NativeScaleLayer {
    3430    /**
    3531     * default setting of autozoom per layer
     
    6359    }
    6460
    65     /**
    66      * @param zoom level of the tile
    67      * @return how many pixels of the screen occupies one pixel of the tile
    68      */
    69     private double getTileToScreenRatio(int zoom) {
    70          MapView mv = Main.map.mapView;
    71          LatLon topLeft = mv.getLatLon(0, 0);
    72          LatLon botLeft = mv.getLatLon(0, tileSource.getTileSize());
    73 
    74          TileXY topLeftTile = tileSource.latLonToTileXY(topLeft.toCoordinate(), zoom);
    75 
    76          ICoordinate north = tileSource.tileXYToLatLon(topLeftTile.getXIndex(), topLeftTile.getYIndex(), zoom);
    77          ICoordinate south = tileSource.tileXYToLatLon(topLeftTile.getXIndex(), topLeftTile.getYIndex() + 1, zoom);
    78 
    79          return Math.abs((north.getLat() - south.getLat()) / (topLeft.lat() - botLeft.lat()));
     61    @Override
     62    protected int getBestZoom() {
     63        if (!Main.isDisplayingMapView()) return 0;
     64        ScaleList scaleList = getNativeScales();
     65        for (int i = scaleList.size()-1; i >= 0; i--) {
     66            Scale scale = scaleList.get(i);
     67            if (scale.scale >= Main.map.mapView.getScale()) {
     68                return i;
     69            }
     70        }
     71        return 0;
    8072    }
    8173
    8274    @Override
    83     protected int getBestZoom() {
    84         if (!Main.isDisplayingMapView()) return 1;
     75    protected int getMaxZoomLvl() {
     76        return getNativeScales().size()-1;
     77    }
    8578
    86         for (int i = getMinZoomLvl() + 1; i <= getMaxZoomLvl(); i++) {
    87             double ret = getTileToScreenRatio(i);
    88             if (ret < 1) {
    89                 return i - 1;
    90             }
    91         }
    92         return getMaxZoomLvl();
     79    @Override
     80    protected int getMinZoomLvl() {
     81        return 0;
    9382    }
    9483
     
    130119        return AbstractCachedTileSourceLayer.getCache(CACHE_REGION_NAME);
    131120    }
     121
     122    @Override
     123    public ScaleList getNativeScales() {
     124        return ((WMTSTileSource) tileSource).getNativeScales();
     125    }
    132126}
Note: See TracChangeset for help on using the changeset viewer.