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

org.gwtopenmaps.openlayers.client.Map 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;

import com.google.gwt.dom.client.Element;
import java.util.ArrayList;
import java.util.List;
import org.gwtopenmaps.openlayers.client.control.Control;
import org.gwtopenmaps.openlayers.client.event.MapBaseLayerChangedListener.MapBaseLayerChangedEvent;
import org.gwtopenmaps.openlayers.client.event.MapClickListener.MapClickEvent;
import org.gwtopenmaps.openlayers.client.event.MapLayerAddedListener.MapLayerAddedEvent;
import org.gwtopenmaps.openlayers.client.event.MapLayerChangedListener.MapLayerChangedEvent;
import org.gwtopenmaps.openlayers.client.event.MapLayerRemovedListener.MapLayerRemovedEvent;
import org.gwtopenmaps.openlayers.client.event.MapMarkerAddedListener.MapMarkerAddedEvent;
import org.gwtopenmaps.openlayers.client.event.MapMarkerRemovedListener.MapMarkerRemovedEvent;
import org.gwtopenmaps.openlayers.client.event.MapMoveEndListener.MapMoveEndEvent;
import org.gwtopenmaps.openlayers.client.event.MapMoveListener.MapMoveEvent;
import org.gwtopenmaps.openlayers.client.event.MapPopupClosedListener.MapPopupClosedEvent;
import org.gwtopenmaps.openlayers.client.event.MapPopupOpenedListener.MapPopupOpenedEvent;
import org.gwtopenmaps.openlayers.client.event.MapZoomListener.MapZoomEvent;
import org.gwtopenmaps.openlayers.client.event.*;
import org.gwtopenmaps.openlayers.client.layer.Layer;
import org.gwtopenmaps.openlayers.client.popup.Popup;
import org.gwtopenmaps.openlayers.client.util.JObjectArray;
import org.gwtopenmaps.openlayers.client.util.JSObject;

/**
 * 

* The Map class is the hub of OpenLayers. Instances of the Map class are * "interactive maps embedded in a webpage". In GWT-OpenLayers the map is * wrapped in a MapWidget which is a GWT Widget. GWT Widgets can receive events * from the browser and can be added to GWT Panels. *

*
 *    MapWidget mapWidget = new MapWidget("100%", "100%");
 *    Map map = mapWidget.getMap(); //instantiates map
 *    map.setControls(new LayerSwitcher());
 * 
* Or *
 *    MapOptions options = new MapOptions();
 *    options.setControls(new LayerSwitcher());
 *    MapWidget mapWidget = new MapWidget("100%", "100%", options);
 *    Map map = mapWidget.getMap(); //instantiates map
 * 
*

* Adjusted from OL API docs: On their own maps do not provide much * functionality. To extend a map it's necessary to add controls, see * {@link org.gwtopenmaps.openlayers.client.control.Control} and layers, see * {@link org.gwtopenmaps.openlayers.client.layer.Layer} to the map. * *

* * @author Erdem Gunay * @author Amr Alam - Refractions Research * @author Aaron Novstrup - Stottler Henke Associates, Inc. * @author Edwin Commandeur - Atlis Information Systems * @author Curtis Jensen - Integrity Applications Inc. * @author Lukas Johansson * @author Nazzareno Sileno - CNR IMAA geoSDI Group - * @email [email protected] */ public class Map extends OpenLayersEObjectWrapper { Map(Element e) { super(MapImpl.create(e)); } Map(Element e, MapOptions options) { super(MapImpl.create(e, options.getJSObject())); } protected Map(JSObject e) { super(e); } public static Map narrowToMap(JSObject object) { return (object == null) ? null : new Map(object); } /** * @return LonLat - the coordinates of the center */ public LonLat getCenter() { return new LonLat(MapImpl.getCenter(getJSObject())); } public void setCenter(LonLat lonlat) { MapImpl.setCenter(getJSObject(), lonlat.getJSObject()); } public void setCenter(LonLat lonlat, int zoom) { MapImpl.setCenter(getJSObject(), lonlat.getJSObject(), zoom); } public void addControl(Control control) { MapImpl.addControl(getJSObject(), control.getJSObject()); } public void addLayer(Layer layer) { MapImpl.addLayer(getJSObject(), layer.getJSObject()); } public void addLayers(Layer[] layers) { JSObject[] jsObjects = new JSObject[layers.length]; for (int i = 0; i < layers.length; i++) { jsObjects[i] = layers[i].getJSObject(); } JObjectArray array = new JObjectArray(jsObjects); MapImpl.addLayers(getJSObject(), array.getJSObject()); } public void addPopup(Popup popup) { MapImpl.addPopup(getJSObject(), popup.getJSObject()); } /** * Closes all other popups first */ public void addPopupExclusive(Popup popup) { MapImpl.addPopupExclusive(getJSObject(), popup.getJSObject()); } public void removePopup(Popup popup) { MapImpl.removePopup(getJSObject(), popup.getJSObject()); } public int getNumLayers() { return MapImpl.getNumLayers(getJSObject()); } /** * Get a layer based on the id assigned by OpenLayers. A * {@link org.gwtopenmaps.openlayers.client.layer.Layer} can be asked for * it's id. This id can be used to get at the layer within the application. * * @param id - String identifier assigned by OpenLayers * * @return Layer - the layer on the map or null if there is no layer with * the given id */ public Layer getLayer(String id) { JSObject jsObject = MapImpl.getLayer(id, getJSObject()); Layer layer = Layer.narrowToLayer(jsObject); return layer; } public Layer[] getLayers() { JSObject jsObjects = MapImpl.getLayers(getJSObject()); JObjectArray jObjectArray = JObjectArray.narrowToJObjectArray(jsObjects); Layer[] layers = new Layer[jObjectArray.length()]; for (int i = 0; i < jObjectArray.length(); i++) { layers[i] = Layer.narrowToLayer(jObjectArray.get(i)); } return layers; } public Control getControlsByClass(String className) { JSObject jsObject = MapImpl.getControlsByClass(getJSObject(), className); return Control.narrowToControl(jsObject); } /** * APIMethod: getControl * * Parameters: id - {String} ID of the control to return. * * Returns: {} The control from the map's list of * controls which has a matching 'id'. If none found, returns null. */ public Control getControl(String controlID) { JSObject jsObject = MapImpl.getControl(getJSObject(), controlID); return (jsObject != null) ? Control.narrowToControl(jsObject) : null; } public void removeLayer(Layer layer) { MapImpl.removeLayer(getJSObject(), layer.getJSObject()); } /** * * @param layer * @ param setNewBaseLayer - {Boolean} default is true */ public void removeLayer(Layer layer, boolean setNewBaseLayer) { MapImpl.removeLayer(getJSObject(), layer.getJSObject(), setNewBaseLayer); } public void removeControl(Control control) { MapImpl.removeControl(getJSObject(), control.getJSObject()); } public int getLayerIndex(Layer layer) { return MapImpl.getLayerIndex(getJSObject(), layer.getJSObject()); } public void setLayerIndex(Layer layer, int index) { MapImpl.setLayerIndex(getJSObject(), layer.getJSObject(), index); } /** * Method: setLayerZIndex * * Parameters: layer - {} zIdx - {int} */ public void setLayerZIndex(Layer layer, int zIdx) { MapImpl.setLayerZIndex(getJSObject(), layer.getJSObject(), zIdx); } /** * Method: resetLayersZIndex Reset each layer's z-index based on layer's * array index */ public void resetLayersZIndex() { MapImpl.resetLayersZIndex(getJSObject()); } /** * This is not an OpenLayers native function. OpenLayers has getLayersByName * that returns all layers matching the name. * * @param name - the name of a layer or part of it * * @return Layer - the first layer that matches the name (so, if there are * more layers matching the name then only one is returned) or null if no * layer matches */ public Layer getLayerByName(String name) { //FIXME: this function goes wrong if getLayersByName returns null // fix - let getLayersByName return empty array + update javadoc Layer[] layers = this.getLayersByName(name); if (layers != null && layers.length > 0) { return layers[0]; } else { return null; } } /** * * @param name - the name of a layer or part of it * * @return Layer[] - all layers with a name that fully or partially matches * the input name or null if no layer matches */ public Layer[] getLayersByName(String name) { String regex = ".*" + name + ".*"; Layer[] layers = this.getLayers(); List layersFound = new ArrayList(); for (int i = 0, max = layers.length; i < max; i++) { if (layers[i].getName().matches(regex)) { layersFound.add(layers[i]); } } if (layersFound.size() > 0) { int max = layersFound.size(); Layer[] found = new Layer[max]; for (int j = 0; j < max; j++) { found[j] = (Layer) layersFound.get(j); } return found; } else { return null; } } /** * This is not an OpenLayers native function. Will remove all overlays from * the this Map. */ public void removeOverlayLayers() { Layer[] layers = getLayers(); for (int i = 0; i < layers.length; i++) { if (layers[i].isBaseLayer() == false) { removeLayer(layers[i]); } } } public void zoomToExtent(Bounds bounds) { MapImpl.zoomToExtent(getJSObject(), bounds.getJSObject()); } /** * APIMethod: zoomToExtent Zoom to the passed in bounds, recenter. * * @param bounds * @param closest Find the zoom level that most closely fits the specified * bounds. Note that this may result in a zoom that does not exactly contain * the entire extent. Default is false. */ public void zoomToExtent(Bounds bounds, boolean closest) { MapImpl.zoomToExtent(getJSObject(), bounds.getJSObject(), closest); } public int getZoomForExtent(Bounds bounds, boolean closest) { return MapImpl.getZoomForExtent(getJSObject(), bounds.getJSObject(), closest); } /** * Returns current zoom level of map object. * * @return current zoom level */ public int getZoom() { return MapImpl.getZoom(getJSObject()); } public LonLat getLonLatFromPixel(Pixel pixel) { return new LonLat(MapImpl.getLonLatFromPixel(getJSObject(), pixel.getJSObject())); } public Pixel getPixelFromLonLat(LonLat lonlat) { return new Pixel(MapImpl.getPixelFromLonLat(getJSObject(), lonlat.getJSObject())); } /** * APIMethod: getLayerPxFromLonLat * * Parameters: * * @param lonlat {} lonlat * * @return {} An OpenLayers.Pixel which is the passed-in * , translated into layer pixels by the current base * layer */ public Pixel getLayerPxFromLonLat(LonLat lonlat) { return new Pixel(MapImpl.getLayerPxFromLonLat(getJSObject(), lonlat.getJSObject())); } /** * Method: getLonLatFromLayerPx * * Parameters: * * @param px - {} * * @return {} */ public LonLat getLonLatFromLayerPx(Pixel px) { return new LonLat(MapImpl.getLonLatFromLayerPx(getJSObject(), px.getJSObject())); } public String getProjection() { return MapImpl.getProjection(getJSObject()); } /** * See also {@link MapUnits}. * * @return String - the units used by the projection */ public String getUnits() { return MapImpl.getUnits(getJSObject()); } public Bounds getExtent() { return new Bounds(MapImpl.getExtent(getJSObject())); } public Bounds getMaxExtent() { return new Bounds(MapImpl.getMaxExtent(getJSObject())); } public double getResolution() { return MapImpl.getResolution(getJSObject()); } public double getScale() { return MapImpl.getScale(getJSObject()); } public void raiseLayer(Layer layer, int delta) { MapImpl.raiseLayer(getJSObject(), layer.getJSObject(), delta); } public void zoomTo(int zoomLevel) { MapImpl.zoomTo(getJSObject(), zoomLevel); } public void zoomToScale(float scale, boolean closest) { MapImpl.zoomToScale(getJSObject(), scale, closest); } public void zoomToMaxExtent() { MapImpl.zoomToMaxExtent(getJSObject()); } public void setOptions(MapOptions mapOptions) { MapImpl.setOptions(getJSObject(), mapOptions.getJSObject()); } public void panTo(LonLat lonlat) { MapImpl.panTo(getJSObject(), lonlat.getJSObject()); } public void pan(int dx, int dy) { MapImpl.pan(getJSObject(), dx, dy); } public Size getTileSize() { return new Size(MapImpl.getTileSize(getJSObject())); } public Size getSize() { return new Size(MapImpl.getSize(getJSObject())); } public double getMaxResolution() { return MapImpl.getMaxResolution(getJSObject()); } public double getResolutionForZoom() { return getJSObject().getPropertyAsDouble("fractionalZoom"); } public String getCurrentUnits() { return getJSObject().getPropertyAsString("units"); } public Layer getBaseLayer() { return Layer.narrowToLayer(getJSObject().getProperty("baseLayer")); } public double getResolutionForZoom(double zoom) { return this.getBaseLayer().getResolutionForZoom(zoom); } public double getZoomForResolution(double resolution, boolean closest) { return MapImpl.getZoomForResolution(getJSObject(), resolution, closest); } public double getZoomFromScale(double scale, boolean closest) { double resolution = OpenLayers.Util.getResolutionFromScale(scale, getCurrentUnits()); return this.getZoomForResolution((Double) resolution, closest); } public double getScaleForZoom(double zoom, String units) { double resolution = this.getResolutionForZoom(zoom); return OpenLayers.Util.getScaleFromResolution(resolution, units); } /** *

* Somehow this is not an API property in OL, but it seems it would make * sense as an API property and it is well documented: *

*

* For a base layer that supports it, allow the map resolution to be set to * a value between one of the values in the resolutions array. Default is * false. * * When fractionalZoom is set to true, it is possible to zoom to an * arbitrary extent. This requires a base layer from a source that supports * requests for arbitrary extents (i.e. not cached tiles on a regular * lattice). This means that fractionalZoom will not work with commercial * layers (Google, Yahoo, VE), layers using TileCache, or any other * pre-cached data sources. * * If you are using fractionalZoom, then you should also use * getResolutionForZoom instead of layer.resolutions[zoom] as the former * works for non-integer zoom levels. *

* */ public void setFractionalZoom(boolean fractionalZoom) { getJSObject().setProperty("fractionalZoom", fractionalZoom); } public void setMinExtent(Bounds extent) { getJSObject().setProperty("minExtent", extent.getJSObject()); } public void setMaxExtent(Bounds extent) { getJSObject().setProperty("maxExtent", extent.getJSObject()); } public void setRestrictedExtent(Bounds extent) { getJSObject().setProperty("restrictedExtent", extent.getJSObject()); } /* * see MapOptions.setAllOverlays * * @param allOverlays */ public boolean getAllOverlays() { return getJSObject().getPropertyAsBoolean("allOverlays"); } public void setBaseLayer(Layer newBaseLayer) { MapImpl.setBaseLayer(getJSObject(), newBaseLayer.getJSObject()); } /** * This function should be called by any external code which dynamically * changes the size of the map div. It can also be called when experiencing * the problem of the single small tile in the upper left corner (doesn't * work in all situations thought) */ public void updateSize() { MapImpl.updateSize(getJSObject()); } public void destroy() { MapImpl.destroy(getJSObject()); } public void addMapBaseLayerChangedListener( final MapBaseLayerChangedListener listener) { eventListeners.addListener(this, listener, EventType.MAP_BASE_LAYER_CHANGED, new EventHandler() { public void onHandle(EventObject eventObject) { MapBaseLayerChangedEvent e = new MapBaseLayerChangedEvent( eventObject); listener.onBaseLayerChanged(e); } }); } /** * Remove MapBaseLayerChangedListener Defined on the Map * * @param listener */ public void removeMapBaseLayerChangedListener( final MapBaseLayerChangedListener listener) { eventListeners.removeListener(this, listener); } public void addMapLayerAddedListener(final MapLayerAddedListener listener) { eventListeners.addListener(this, listener, EventType.MAP_LAYER_ADDED, new EventHandler() { public void onHandle(EventObject eventObject) { MapLayerAddedEvent e = new MapLayerAddedEvent( eventObject); listener.onLayerAdded(e); } }); } /** * Remove MapBaseLayerAddedListener Defined on the Map * * @param listener */ public void removeMapLayerAddedListener(final MapLayerAddedListener listener) { eventListeners.removeListener(this, listener); } public void addMapLayerChangedListener( final MapLayerChangedListener listener) { eventListeners.addListener(this, listener, EventType.MAP_LAYER_CHANGED, new EventHandler() { public void onHandle(EventObject eventObject) { MapLayerChangedEvent e = new MapLayerChangedEvent( eventObject); listener.onLayerChanged(e); } }); } /** * Remove MapLayerChangedListener Defined on the Map * * @param listener */ public void removeMapLayerChangedListener( final MapLayerChangedListener listener) { eventListeners.removeListener(this, listener); } public void addMapLayerRemovedListener( final MapLayerRemovedListener listener) { eventListeners.addListener(this, listener, EventType.MAP_LAYER_REMOVED, new EventHandler() { public void onHandle(EventObject eventObject) { MapLayerRemovedEvent e = new MapLayerRemovedEvent( eventObject); listener.onLayerRemoved(e); } }); } /** * Remove MapLayerRemovedListener Defined on the Map * * @param listener */ public void removeMapLayerRemovedListener( final MapLayerRemovedListener listener) { eventListeners.removeListener(this, listener); } public void addMapMoveListener(final MapMoveListener listener) { eventListeners.addListener(this, listener, EventType.MAP_MOVE, new EventHandler() { public void onHandle(EventObject eventObject) { MapMoveEvent e = new MapMoveEvent(eventObject); listener.onMapMove(e); } }); } /** * Remove MapMoveListener Defined on the Map * * @param listener */ public void removeMapMoveListener(final MapMoveListener listener) { eventListeners.removeListener(this, listener); } public void addMapMoveEndListener(final MapMoveEndListener listener) { eventListeners.addListener(this, listener, EventType.MAP_MOVEEND, new EventHandler() { public void onHandle(EventObject eventObject) { MapMoveEndEvent e = new MapMoveEndEvent(eventObject); listener.onMapMoveEnd(e); } }); } /** * Remove MapMoveEndListener Defined on the Map * * @param listener */ public void removeMapMoveEndListener(final MapMoveEndListener listener) { eventListeners.removeListener(this, listener); } public void addMapZoomListener(final MapZoomListener listener) { eventListeners.addListener(this, listener, EventType.MAP_ZOOMEND, new EventHandler() { public void onHandle(EventObject eventObject) { MapZoomEvent e = new MapZoomEvent(eventObject); listener.onMapZoom(e); } }); } /** * Remove MapZoomListener Defined on the Map * * @param listener */ public void removeMapZoomListener(final MapZoomListener listener) { eventListeners.removeListener(this, listener); } public void addMapMarkerAddedListener(final MapMarkerAddedListener listener) { eventListeners.addListener(this, listener, EventType.MAP_MARKER_ADDED, new EventHandler() { public void onHandle(EventObject eventObject) { MapMarkerAddedEvent e = new MapMarkerAddedEvent( eventObject); listener.onMarkerAdded(e); } }); } /** * Remove MapMarkerAddedListener Defined on the Map * * @param listener */ public void removeMapMarkerAddedListener( final MapMarkerAddedListener listener) { eventListeners.removeListener(this, listener); } public void addMapMarkerRemovedListener( final MapMarkerRemovedListener listener) { eventListeners.addListener(this, listener, EventType.MAP_MARKER_REMOVED, new EventHandler() { public void onHandle(EventObject eventObject) { MapMarkerRemovedEvent e = new MapMarkerRemovedEvent( eventObject); listener.onMarkerRemoved(e); } }); } /** * Remove MapMarkerRemovedListener Defined on the Map * * @param listener */ public void removeMapMarkerRemovedListener( final MapMarkerRemovedListener listener) { eventListeners.removeListener(this, listener); } public void addMapPopupOpenedListener(final MapPopupOpenedListener listener) { eventListeners.addListener(this, listener, EventType.MAP_POPUP_OPEN, new EventHandler() { public void onHandle(EventObject eventObject) { MapPopupOpenedEvent e = new MapPopupOpenedEvent( eventObject); listener.onPopupOpened(e); } }); } /** * Remove MapPopupOpenedListener Defined on the Map * * @param listener */ public void removeMapPopupOpenedListener( final MapPopupOpenedListener listener) { eventListeners.removeListener(this, listener); } public void addMapPopupClosedListener(final MapPopupClosedListener listener) { eventListeners.addListener(this, listener, EventType.MAP_POPUP_CLOSE, new EventHandler() { public void onHandle(EventObject eventObject) { MapPopupClosedEvent e = new MapPopupClosedEvent( eventObject); listener.onPopupClosed(e); } }); } /** * Remove MapPopupClosedListener Defined on the Map * * @param listener */ public void removeMapPopupClosedListener( final MapPopupClosedListener listener) { eventListeners.removeListener(this, listener); } public void addMapClickListener(final MapClickListener listener) { eventListeners.addListener(this, listener, EventType.MAP_CLICK, new EventHandler() { public void onHandle(EventObject eventObject) { MapClickEvent e = new MapClickEvent(eventObject); listener.onClick(e); } }); } /** * Remove MapClickListener Defined on the Map * * @param listener */ public void removeMapClickListener(final MapClickListener listener) { eventListeners.removeListener(this, listener); } public void disableBrowserContextMenu(BrowserMenuListener listener) { MapImpl.disableBrowserContextMenu(getJSObject(), listener); } /** * * @author Giuseppe La Scaleia - CNR IMAA geoSDI Group * @email [email protected] * */ public interface BrowserMenuListener { void onMouseClick(MouseEvent e); } /** * returns the DOM node of the viewport. * * @return */ public Element getViewport() { return MapImpl.getViewport(getJSObject()); } /** * zoom in with one step. */ public void zoomIn() { MapImpl.zoomIn(getJSObject()); } /** * zoom out with one step. */ public void zoomOut() { MapImpl.zoomOut(getJSObject()); } /** * Set the min and max zoomlevel of the map. This blocks zooming further out * or in than the given levels. * * @param minZoomLevel The minlevel to zoom * @param maxZoomLevel The maxlevel to zoom */ public void setMinMaxZoomLevel(int minZoomLevel, int maxZoomLevel) { MapImpl.setMinMaxZoomLevel(getJSObject(), minZoomLevel, maxZoomLevel); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy