123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431 |
- /**
- * @requires SuperMap/Layer.js
- * @requires SuperMap/Util.js
- */
- /**
- * Class: SuperMap.Layer.EventPane
- * Base class for 3rd party layers. Create a new event pane layer with the
- * <SuperMap.Layer.EventPane> constructor.
- *
- * Inherits from:
- * - <SuperMap.Layer>
- */
- SuperMap.Layer.EventPane = SuperMap.Class(SuperMap.Layer, {
- /**
- * APIProperty: smoothDragPan
- * {Boolean} smoothDragPan determines whether non-public/internal API
- * methods are used for better performance while dragging EventPane
- * layers. When not in sphericalMercator mode, the smoother dragging
- * doesn't actually move north/south directly with the number of
- * pixels moved, resulting in a slight offset when you drag your mouse
- * north south with this option on. If this visual disparity bothers
- * you, you should turn this option off, or use spherical mercator.
- * Default is on.
- */
- smoothDragPan: true,
- /**
- * Property: isBaseLayer
- * {Boolean} EventPaned layers are always base layers, by necessity.
- */
- isBaseLayer: true,
- /**
- * APIProperty: isFixed
- * {Boolean} EventPaned layers are fixed by default.
- */
- isFixed: true,
- /**
- * Property: pane
- * {DOMElement} A reference to the element that controls the events.
- */
- pane: null,
- /**
- * Property: mapObject
- * {Object} This is the object which will be used to load the 3rd party library
- * in the case of the google layer, this will be of type GMap,
- * in the case of the ve layer, this will be of type VEMap
- */
- mapObject: null,
- /**
- * Constructor: SuperMap.Layer.EventPane
- * Create a new event pane layer
- *
- * Parameters:
- * name - {String}
- * options - {Object} Hashtable of extra options to tag onto the layer
- */
- initialize: function(name, options) {
- SuperMap.Layer.prototype.initialize.apply(this, arguments);
- if (this.pane == null) {
- this.pane = SuperMap.Util.createDiv(this.div.id + "_EventPane");
- }
- },
- /**
- * APIMethod: destroy
- * Deconstruct this layer.
- */
- destroy: function() {
- this.mapObject = null;
- this.pane = null;
- SuperMap.Layer.prototype.destroy.apply(this, arguments);
- },
- /**
- * Method: setMap
- * Set the map property for the layer. This is done through an accessor
- * so that subclasses can override this and take special action once
- * they have their map variable set.
- *
- * Parameters:
- * map - {<SuperMap.Map>}
- */
- setMap: function(map) {
- SuperMap.Layer.prototype.setMap.apply(this, arguments);
- this.pane.style.zIndex = parseInt(this.div.style.zIndex) + 1;
- this.pane.style.display = this.div.style.display;
- this.pane.style.width="100%";
- this.pane.style.height="100%";
- if (SuperMap.BROWSER_NAME == "msie") {
- this.pane.style.background =
- "url(" + SuperMap.Util.getImagesLocation() + "blank.gif)";
- }
- if (this.isFixed) {
- this.map.eventsDiv.appendChild(this.pane);
- } else {
- this.map.layerContainerDiv.appendChild(this.pane);
- }
- // once our layer has been added to the map, we can load it
- this.loadMapObject();
- // if map didn't load, display warning
- if (this.mapObject == null) {
- this.loadWarningMessage();
- }
- },
- /**
- * APIMethod: removeMap
- * On being removed from the map, we'll like to remove the invisible 'pane'
- * div that we added to it on creation.
- *
- * Parameters:
- * map - {<SuperMap.Map>}
- */
- removeMap: function(map) {
- if (this.pane && this.pane.parentNode) {
- this.pane.parentNode.removeChild(this.pane);
- }
- SuperMap.Layer.prototype.removeMap.apply(this, arguments);
- },
- /**
- * Method: loadWarningMessage
- * If we can't load the map lib, then display an error message to the
- * user and tell them where to go for help.
- *
- * This function sets up the layout for the warning message. Each 3rd
- * party layer must implement its own getWarningHTML() function to
- * provide the actual warning message.
- */
- loadWarningMessage:function() {
- this.div.style.backgroundColor = "darkblue";
- var viewSize = this.map.getSize();
- var msgW = Math.min(viewSize.w, 300);
- var msgH = Math.min(viewSize.h, 200);
- var size = new SuperMap.Size(msgW, msgH);
- var centerPx = new SuperMap.Pixel(viewSize.w/2, viewSize.h/2);
- var topLeft = centerPx.add(-size.w/2, -size.h/2);
- var div = SuperMap.Util.createDiv(this.name + "_warning",
- topLeft,
- size,
- null,
- null,
- null,
- "auto");
- div.style.padding = "7px";
- div.style.backgroundColor = "yellow";
- div.innerHTML = this.getWarningHTML();
- this.div.appendChild(div);
- },
- /**
- * Method: getWarningHTML
- * To be implemented by subclasses.
- *
- * Returns:
- * {String} String with information on why layer is broken, how to get
- * it working.
- */
- getWarningHTML:function() {
- //should be implemented by subclasses
- return "";
- },
- /**
- * Method: display
- * Set the display on the pane
- *
- * Parameters:
- * display - {Boolean}
- */
- display: function(display) {
- SuperMap.Layer.prototype.display.apply(this, arguments);
- this.pane.style.display = this.div.style.display;
- },
- /**
- * Method: setZIndex
- * Set the z-index order for the pane.
- *
- * Parameters:
- * zIndex - {int}
- */
- setZIndex: function (zIndex) {
- SuperMap.Layer.prototype.setZIndex.apply(this, arguments);
- this.pane.style.zIndex = parseInt(this.div.style.zIndex) + 1;
- },
- /**
- * Method: moveByPx
- * Move the layer based on pixel vector. To be implemented by subclasses.
- *
- * Parameters:
- * dx - {Number} The x coord of the displacement vector.
- * dy - {Number} The y coord of the displacement vector.
- */
- moveByPx: function(dx, dy) {
- SuperMap.Layer.prototype.moveByPx.apply(this, arguments);
- if (this.dragPanMapObject) {
- this.dragPanMapObject(dx, -dy);
- } else {
- this.moveTo(this.map.getCachedCenter());
- }
- },
- /**
- * Method: moveTo
- * Handle calls to move the layer.
- *
- * Parameters:
- * bounds - {<SuperMap.Bounds>}
- * zoomChanged - {Boolean}
- * dragging - {Boolean}
- */
- moveTo:function(bounds, zoomChanged, dragging) {
- SuperMap.Layer.prototype.moveTo.apply(this, arguments);
- if (this.mapObject != null) {
- var newCenter = this.map.getCenter();
- var newZoom = this.map.getZoom();
- if (newCenter != null) {
- var moOldCenter = this.getMapObjectCenter();
- var oldCenter = this.getOLLonLatFromMapObjectLonLat(moOldCenter);
- var moOldZoom = this.getMapObjectZoom();
- var oldZoom= this.getOLZoomFromMapObjectZoom(moOldZoom);
- if ( !(newCenter.equals(oldCenter)) ||
- !(newZoom == oldZoom) ) {
- if (!zoomChanged && oldCenter && this.dragPanMapObject &&
- this.smoothDragPan) {
- var oldPx = this.map.getViewPortPxFromLonLat(oldCenter);
- var newPx = this.map.getViewPortPxFromLonLat(newCenter);
- this.dragPanMapObject(newPx.x-oldPx.x, oldPx.y-newPx.y);
- } else {
- var center = this.getMapObjectLonLatFromOLLonLat(newCenter);
- var zoom = this.getMapObjectZoomFromOLZoom(newZoom);
- this.setMapObjectCenter(center, zoom, dragging);
- }
- }
- }
- }
- },
- /********************************************************/
- /* */
- /* Baselayer Functions */
- /* */
- /********************************************************/
- /**
- * Method: getLonLatFromViewPortPx
- * Get a map location from a pixel location
- *
- * Parameters:
- * viewPortPx - {<SuperMap.Pixel>}
- *
- * Returns:
- * {<SuperMap.LonLat>} An SuperMap.LonLat which is the passed-in view
- * port SuperMap.Pixel, translated into lon/lat by map lib
- * If the map lib is not loaded or not centered, returns null
- */
- getLonLatFromViewPortPx: function (viewPortPx) {
- var lonlat = null;
- if ( (this.mapObject != null) &&
- (this.getMapObjectCenter() != null) ) {
- var moPixel = this.getMapObjectPixelFromOLPixel(viewPortPx);
- var moLonLat = this.getMapObjectLonLatFromMapObjectPixel(moPixel);
- lonlat = this.getOLLonLatFromMapObjectLonLat(moLonLat);
- }
- return lonlat;
- },
- /**
- * Method: getViewPortPxFromLonLat
- * Get a pixel location from a map location
- *
- * Parameters:
- * lonlat - {<SuperMap.LonLat>}
- *
- * Returns:
- * {<SuperMap.Pixel>} An SuperMap.Pixel which is the passed-in
- * SuperMap.LonLat, translated into view port pixels by map lib
- * If map lib is not loaded or not centered, returns null
- */
- getViewPortPxFromLonLat: function (lonlat) {
- var viewPortPx = null;
- if ( (this.mapObject != null) &&
- (this.getMapObjectCenter() != null) ) {
- var moLonLat = this.getMapObjectLonLatFromOLLonLat(lonlat);
- var moPixel = this.getMapObjectPixelFromMapObjectLonLat(moLonLat);
- viewPortPx = this.getOLPixelFromMapObjectPixel(moPixel);
- }
- return viewPortPx;
- },
- /********************************************************/
- /* */
- /* Translation Functions */
- /* */
- /* The following functions translate Map Object and */
- /* OL formats for Pixel, LonLat */
- /* */
- /********************************************************/
- //
- // TRANSLATION: MapObject LatLng <-> SuperMap.LonLat
- //
- /**
- * Method: getOLLonLatFromMapObjectLonLat
- * Get an OL style map location from a 3rd party style map location
- *
- * Parameters
- * moLonLat - {Object}
- *
- * Returns:
- * {<SuperMap.LonLat>} An SuperMap.LonLat, translated from the passed in
- * MapObject LonLat
- * Returns null if null value is passed in
- */
- getOLLonLatFromMapObjectLonLat: function(moLonLat) {
- var olLonLat = null;
- if (moLonLat != null) {
- var lon = this.getLongitudeFromMapObjectLonLat(moLonLat);
- var lat = this.getLatitudeFromMapObjectLonLat(moLonLat);
- olLonLat = new SuperMap.LonLat(lon, lat);
- }
- return olLonLat;
- },
- /**
- * Method: getMapObjectLonLatFromOLLonLat
- * Get a 3rd party map location from an OL map location.
- *
- * Parameters:
- * olLonLat - {<SuperMap.LonLat>}
- *
- * Returns:
- * {Object} A MapObject LonLat, translated from the passed in
- * SuperMap.LonLat
- * Returns null if null value is passed in
- */
- getMapObjectLonLatFromOLLonLat: function(olLonLat) {
- var moLatLng = null;
- if (olLonLat != null) {
- moLatLng = this.getMapObjectLonLatFromLonLat(olLonLat.lon,
- olLonLat.lat);
- }
- return moLatLng;
- },
- //
- // TRANSLATION: MapObject Pixel <-> SuperMap.Pixel
- //
- /**
- * Method: getOLPixelFromMapObjectPixel
- * Get an OL pixel location from a 3rd party pixel location.
- *
- * Parameters:
- * moPixel - {Object}
- *
- * Returns:
- * {<SuperMap.Pixel>} An SuperMap.Pixel, translated from the passed in
- * MapObject Pixel
- * Returns null if null value is passed in
- */
- getOLPixelFromMapObjectPixel: function(moPixel) {
- var olPixel = null;
- if (moPixel != null) {
- var x = this.getXFromMapObjectPixel(moPixel);
- var y = this.getYFromMapObjectPixel(moPixel);
- olPixel = new SuperMap.Pixel(x, y);
- }
- return olPixel;
- },
- /**
- * Method: getMapObjectPixelFromOLPixel
- * Get a 3rd party pixel location from an OL pixel location
- *
- * Parameters:
- * olPixel - {<SuperMap.Pixel>}
- *
- * Returns:
- * {Object} A MapObject Pixel, translated from the passed in
- * SuperMap.Pixel
- * Returns null if null value is passed in
- */
- getMapObjectPixelFromOLPixel: function(olPixel) {
- var moPixel = null;
- if (olPixel != null) {
- moPixel = this.getMapObjectPixelFromXY(olPixel.x, olPixel.y);
- }
- return moPixel;
- },
- CLASS_NAME: "SuperMap.Layer.EventPane"
- });
|