All Downloads are FREE. Search and download functionalities are using the official Maven repository.

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);
            }
        };
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy