// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.gui.layer;
import java.io.IOException;
import java.util.Collection;
import org.apache.commons.jcs.access.CacheAccess;
import org.openstreetmap.gui.jmapviewer.interfaces.TileLoader;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.cache.BufferedImageCacheEntry;
import org.openstreetmap.josm.data.imagery.ImageryInfo;
import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType;
import org.openstreetmap.josm.data.imagery.WMSCachedTileLoader;
import org.openstreetmap.josm.data.imagery.WMTSTileSource;
import org.openstreetmap.josm.data.projection.Projection;
import org.openstreetmap.josm.gui.layer.imagery.TileSourceDisplaySettings;
import org.openstreetmap.josm.tools.Utils;
/**
* WMTS layer based on AbstractTileSourceLayer. Overrides few methods to align WMTS to Tile based computations
* but most magic is done within WMTSTileSource class.
*
* Full specification of the protocol available at:
* http://www.opengeospatial.org/standards/wmts
*
* @author Wiktor Niesiobędzki
*
*/
public class WMTSLayer extends AbstractCachedTileSourceLayer<WMTSTileSource> implements NativeScaleLayer {
private static final String PREFERENCE_PREFIX = "imagery.wmts";
/**
* Registers all setting properties
*/
static {
new TileSourceDisplaySettings(PREFERENCE_PREFIX);
}
private static final String CACHE_REGION_NAME = "WMTS";
/**
* Creates WMTS layer from ImageryInfo
* @param info Imagery Info describing the layer
*/
public WMTSLayer(ImageryInfo info) {
super(info);
}
@Override
protected TileSourceDisplaySettings createDisplaySettings() {
return new TileSourceDisplaySettings(PREFERENCE_PREFIX);
}
@Override
protected WMTSTileSource getTileSource() {
try {
if (info.getImageryType() == ImageryType.WMTS && info.getUrl() != null) {
WMTSTileSource.checkUrl(info.getUrl());
WMTSTileSource tileSource = new WMTSTileSource(info);
info.setAttribution(tileSource);
return tileSource;
}
return null;
} catch (IOException e) {
Main.warn(e);
throw new IllegalArgumentException(e);
}
}
@Override
protected int getBestZoom() {
if (!Main.isDisplayingMapView())
return 0;
ScaleList scaleList = getNativeScales();
if (scaleList == null) {
return getMaxZoomLvl();
}
double displayScale = Main.map.mapView.getScale();
if (coordinateConverter.requiresReprojection()) {
displayScale *= Main.getProjection().getMetersPerUnit();
}
Scale snap = scaleList.getSnapScale(displayScale, false);
return Utils.clamp(snap != null ? snap.getIndex() : getMaxZoomLvl(),
getMinZoomLvl(), getMaxZoomLvl());
}
@Override
protected int getMinZoomLvl() {
return 0;
}
@Override
public Collection<String> getNativeProjections() {
return tileSource.getSupportedProjections();
}
@Override
public void projectionChanged(Projection oldValue, Projection newValue) {
super.projectionChanged(oldValue, newValue);
tileSource.initProjection(newValue);
}
@Override
protected Class<? extends TileLoader> getTileLoaderClass() {
return WMSCachedTileLoader.class;
}
@Override
protected String getCacheName() {
return CACHE_REGION_NAME;
}
/**
* @return cache region for WMTS layer
*/
public static CacheAccess<String, BufferedImageCacheEntry> getCache() {
return AbstractCachedTileSourceLayer.getCache(CACHE_REGION_NAME);
}
@Override
public ScaleList getNativeScales() {
return tileSource.getNativeScales();
}
}