org.gwtopenmaps.openlayers.client.layer.XYZ Maven / Gradle / Ivy
/**
*
* Copyright 2015 sourceforge.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.gwtopenmaps.openlayers.client.layer;
import org.gwtopenmaps.openlayers.client.util.JSObject;
import org.gwtopenmaps.openlayers.client.util.JStringArray;
/**
* Wrapper for OpenLayers.Layer.XYZ which is typically used to add an ESRI
* Cached Map Service.
*
* @see XYZOptions
* @author Andrew Hughes
*
* @author Giuseppe La Scaleia - CNR IMAA geoSDI Group
* @email [email protected]
*/
public class XYZ extends GridLayer {
private static final double dEarthRadius = 6378137;
protected XYZ(JSObject xyzLayer) {
super(xyzLayer);
}
/**
* Constructor with specified options.
*
* @param name the layer name
* @param url example
* http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Portland/ESRI_LandBase_WebMercator/MapServer/tile/${z}/${y}/${x}
* @param options constructor options
*/
public XYZ(String name, String url, XYZOptions options) {
this(XYZImpl.create(name, url, options.getJSObject()));
}
/**
* Constructor with specified options.
*
* @param name the layer name
* @param urls urls in the form
* http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Portland/ESRI_LandBase_WebMercator/MapServer/tile/${z}/${y}/${x}
* @param options constructor options
*/
public XYZ(String name, String[] urls, XYZOptions options) {
this(XYZImpl.create(name, new JStringArray(urls).getJSObject(),
options.getJSObject()));
}
/**
* Determines the ground resolution (in meters per pixel) at a specified
* latitude and level of detail.
*
* @param latitude latitude
* @param zoomLevel zoomlevel
* @return ground resolution
*/
public static double getGroundResolutionInMeters(double latitude,
int zoomLevel) {
return Math.cos(latitude * Math.PI / 180) * 2 * Math.PI * dEarthRadius / getMapSizeInPixels(
zoomLevel);
}
/**
* Determines the map width and height (in pixels) at a specified level of
* detail.
*
* @param zoomLevel Level of detail, from 1 (lowest detail) to 23 (highest
* detail).
* @return The map width and height in pixels.
*/
public static double getMapSizeInPixels(int zoomLevel) {
return ((double) (1 << zoomLevel)) * 256;
}
/**
* Sets a range of zoomlevels.
*
* @param minZoomLevel minimum zoomlevel
* @param maxZoomLevel maximum zoomlevel
*/
public void setZoomLevelRange(int minZoomLevel, int maxZoomLevel) {
setZoomOffset(minZoomLevel);
int len = maxZoomLevel - minZoomLevel + 1;
double[] resolutions = new double[len];
double curRes = getGroundResolutionInMeters(0, minZoomLevel);
for (int i = 0; i < len; i++) {
resolutions[i] = curRes;
curRes = curRes / 2;
}
// resolution setting seems to work only via options
XYZOptions options = new XYZOptions();
options.setResolutions(resolutions);
this.addOptions(options);
}
/**
* If your cache has more zoom levels than you want to provide access to
* with this layer, supply a zoomOffset. This zoom offset is added to the
* current map zoom level to determine the level for a requested tile. For
* example, if you supply a zoomOffset of 3, when the map is at the zoom 0,
* tiles will be requested from level 3 of your cache. Default is 0 (assumes
* cache level and map zoom are equivalent). Using zoomOffset is an
* alternative to setting serverResolutions if you only want to expose a
* subset of the server resolutions.
*
* @param zoomOffset zoom offset
*/
public void setZoomOffset(int zoomOffset) {
XYZImpl.setZoomOffset(this.getJSObject(), zoomOffset);
}
@Override
protected LayerCreator getLayerCreator() {
return new LayerCreator() {
public L createLayer(JSObject jsObject) {
return (L) new XYZ(jsObject);
}
};
}
}