📄 overviewmap.js
字号:
/* Copyright (c) 2006-2007 MetaCarta, Inc., published under the BSD license. * See http://svn.openlayers.org/trunk/openlayers/release-license.txt * for the full text of the license. *//** * @requires OpenLayers/Control.js * @requires OpenLayers/BaseTypes.js * @requires OpenLayers/Events.js * * Class: OpenLayers.Control.OverviewMap * Create an overview map to display the extent of your main map and provide * additional navigation control. Create a new overview map with the * <OpenLayers.Control.OverviewMap> constructor. * * Inerits from: * - <OpenLayers.Control> */OpenLayers.Control.OverviewMap = OpenLayers.Class(OpenLayers.Control, { /** * Property: id * {String} For div.id */ id: "OverviewMap", /** * Property: element * {DOMElement} The DOM element that contains the overview map */ element: null, /** * APIProperty: ovmap * {<OpenLayers.Map>} A reference to the overvew map itself. */ ovmap: null, /** * APIProperty: size * {<OpenLayers.Size>} The overvew map size in pixels. Note that this is * the size of the map itself - the element that contains the map (default * class name olControlOverviewMapElement) may have padding or other style * attributes added via CSS. */ size: new OpenLayers.Size(180, 90), /** * APIProperty: layers * {Array(<OpenLayers.Layer>)} Ordered list of layers in the overview map. * If none are sent at construction, the base layer for the main map is used. */ layers: null, /** * APIProperty: minRatio * {Float} The ratio of the overview map resolution to the main map * resolution at which to zoom farther out on the overview map. */ minRatio: 8, /** * APIProperty: maxRatio * {Float} The ratio of the overview map resolution to the main map * resolution at which to zoom farther in on the overview map. */ maxRatio: 32, /** * APIProperty: mapOptions * {Object} An object containing any non-default properties to be sent to * the overview map's map constructor. These should include any non-default * options that the main map was constructed with. */ mapOptions: null, /** * Constructor: OpenLayers.Control.OverviewMap * Create a new overview map * * Parameters: * object - {Object} Properties of this object will be set on the overview * map object. Note, to set options on the map object contained in this * control, set <mapOptions> as one of the options properties. */ initialize: function(options) { this.layers = []; OpenLayers.Control.prototype.initialize.apply(this, [options]); }, /** * APIMethod: destroy * Deconstruct the control */ destroy: function() { if (!this.mapDiv) { // we've already been destroyed return; } this.mapDiv.removeChild(this.extentRectangle); this.extentRectangle = null; this.rectEvents.destroy(); this.rectEvents = null; this.ovmap.destroy(); this.ovmap = null; this.element.removeChild(this.mapDiv); this.mapDiv = null; this.mapDivEvents.destroy(); this.mapDivEvents = null; this.div.removeChild(this.element); this.element = null; this.elementEvents.destroy(); this.elementEvents = null; if (this.maximizeDiv) { OpenLayers.Event.stopObservingElement(this.maximizeDiv); this.div.removeChild(this.maximizeDiv); this.maximizeDiv = null; } if (this.minimizeDiv) { OpenLayers.Event.stopObservingElement(this.minimizeDiv); this.div.removeChild(this.minimizeDiv); this.minimizeDiv = null; } this.map.events.unregister('moveend', this, this.update); this.map.events.unregister("changebaselayer", this, this.baseLayerDraw); OpenLayers.Control.prototype.destroy.apply(this, arguments); }, /** * Method: draw * Render the control in the browser. */ draw: function() { OpenLayers.Control.prototype.draw.apply(this, arguments); if(!(this.layers.length > 0)) { if (this.map.baseLayer) { var layer = this.map.baseLayer.clone(); this.layers = [layer]; } else { this.map.events.register("changebaselayer", this, this.baseLayerDraw); return this.div; } } // create overview map DOM elements this.element = document.createElement('div'); this.element.className = this.displayClass + 'Element'; this.element.style.display = 'none'; this.mapDiv = document.createElement('div'); this.mapDiv.style.width = this.size.w + 'px'; this.mapDiv.style.height = this.size.h + 'px'; this.mapDiv.style.position = 'relative'; this.mapDiv.style.overflow = 'hidden'; this.mapDiv.id = OpenLayers.Util.createUniqueID('overviewMap'); this.extentRectangle = document.createElement('div'); this.extentRectangle.style.position = 'absolute'; this.extentRectangle.style.zIndex = 1000; //HACK this.extentRectangle.style.overflow = 'hidden'; this.extentRectangle.style.backgroundImage = 'url(' + OpenLayers.Util.getImagesLocation() + 'blank.gif)'; this.extentRectangle.className = this.displayClass+'ExtentRectangle'; this.mapDiv.appendChild(this.extentRectangle); this.element.appendChild(this.mapDiv); this.div.appendChild(this.element); this.map.events.register('moveend', this, this.update); // Set up events. The image div recenters the map on click. // The extent rectangle can be dragged to recenter the map. // If the mousedown happened elsewhere, then mousemove and mouseup // should slip through. this.elementEvents = new OpenLayers.Events(this, this.element); this.elementEvents.register('mousedown', this, function(e) { OpenLayers.Event.stop(e); }); this.elementEvents.register('click', this, function(e) { OpenLayers.Event.stop(e); }); this.elementEvents.register('dblclick', this, function(e) { OpenLayers.Event.stop(e); }); this.rectEvents = new OpenLayers.Events(this, this.extentRectangle, null, true); this.rectEvents.register('mouseout', this, this.rectMouseOut); this.rectEvents.register('mousedown', this, this.rectMouseDown); this.rectEvents.register('mousemove', this, this.rectMouseMove); this.rectEvents.register('mouseup', this, this.rectMouseUp); this.rectEvents.register('click', this, function(e) { OpenLayers.Event.stop(e); }); this.rectEvents.register('dblclick', this, this.rectDblClick ); this.mapDivEvents = new OpenLayers.Events(this, this.mapDiv); this.mapDivEvents.register('click', this, this.mapDivClick); // Optionally add min/max buttons if the control will go in the // map viewport. if(!this.outsideViewport) { this.div.className = this.displayClass + 'Container'; var imgLocation = OpenLayers.Util.getImagesLocation(); // maximize button div var img = imgLocation + 'layer-switcher-maximize.png'; this.maximizeDiv = OpenLayers.Util.createAlphaImageDiv( this.displayClass + 'MaximizeButton', null, new OpenLayers.Size(18,18), img, 'absolute'); this.maximizeDiv.style.display = 'none'; this.maximizeDiv.className = this.displayClass + 'MaximizeButton'; OpenLayers.Event.observe(this.maximizeDiv, 'click', OpenLayers.Function.bindAsEventListener(this.maximizeControl, this) ); this.div.appendChild(this.maximizeDiv); // minimize button div var img = imgLocation + 'layer-switcher-minimize.png'; this.minimizeDiv = OpenLayers.Util.createAlphaImageDiv( 'OpenLayers_Control_minimizeDiv', null, new OpenLayers.Size(18,18), img, 'absolute'); this.minimizeDiv.style.display = 'none'; this.minimizeDiv.className = this.displayClass + 'MinimizeButton'; OpenLayers.Event.observe(this.minimizeDiv, 'click', OpenLayers.Function.bindAsEventListener(this.minimizeControl, this) ); this.div.appendChild(this.minimizeDiv); var eventsToStop = ['dblclick','mousedown']; for (var i = 0; i < eventsToStop.length; i++) { OpenLayers.Event.observe(this.maximizeDiv, eventsToStop[i], OpenLayers.Event.stop); OpenLayers.Event.observe(this.minimizeDiv, eventsToStop[i], OpenLayers.Event.stop); } this.minimizeControl(); } else { // show the overview map this.element.style.display = ''; } if(this.map.getExtent()) { this.update(); } return this.div; }, /** * Method: baseLayerDraw * Draw the base layer - called if unable to complete in the initial draw */ baseLayerDraw: function() { this.draw(); this.map.events.unregister("changebaselayer", this, this.baseLayerDraw); }, /** * Method: rectMouseOut * Handle browser events * * Parameters: * evt - {<OpenLayers.Event>} evt */ rectMouseOut: function (evt) { if(this.rectDragStart != null) { if(this.performedRectDrag) { this.rectMouseMove(evt); var rectPxBounds = this.getRectPxBounds(); // if we're off of the overview map, update the main map // otherwise, keep moving the rect if((rectPxBounds.top <= 0) || (rectPxBounds.left <= 0) || (rectPxBounds.bottom >= this.size.h - this.hComp) || (rectPxBounds.right >= this.size.w - this.wComp)) { this.updateMapToRect(); } else { return; } } document.onselectstart = null; this.rectDragStart = null; } }, /** * Method: rectMouseDown * Handle browser events * * Parameters: * evt - {<OpenLayers.Event>} evt */ rectMouseDown: function (evt) { if(!OpenLayers.Event.isLeftClick(evt)) return; this.rectDragStart = evt.xy.clone(); this.performedRectDrag = false; OpenLayers.Event.stop(evt); }, /** * Method: rectMouseMove * Handle browser events * * Parameters: * evt - {<OpenLayers.Event>} evt */ rectMouseMove: function(evt) { if(this.rectDragStart != null) { var deltaX = this.rectDragStart.x - evt.xy.x; var deltaY = this.rectDragStart.y - evt.xy.y; var rectPxBounds = this.getRectPxBounds(); var rectTop = rectPxBounds.top; var rectLeft = rectPxBounds.left; var rectHeight = Math.abs(rectPxBounds.getHeight()); var rectWidth = rectPxBounds.getWidth(); // don't allow dragging off of parent element var newTop = Math.max(0, (rectTop - deltaY)); newTop = Math.min(newTop, this.ovmap.size.h - this.hComp - rectHeight); var newLeft = Math.max(0, (rectLeft - deltaX)); newLeft = Math.min(newLeft, this.ovmap.size.w - this.wComp - rectWidth); this.setRectPxBounds(new OpenLayers.Bounds(newLeft, newTop + rectHeight, newLeft + rectWidth, newTop)); this.rectDragStart = evt.xy.clone(); this.performedRectDrag = true; OpenLayers.Event.stop(evt);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -