codesite-noreply at google.com
2010-Mar-24 18:34 UTC
[Mapstraction] [mapstraction] r76 committed - ...
Revision: 76 Author: freyfogle Date: Wed Mar 24 11:33:58 2010 Log: Adding patch from David Whitchurch-Bennett <david at nmaltd.com> http://code.google.com/p/mapstraction/source/detail?r=76 Added: /trunk/source/mxn.openspace.core.js ======================================--- /dev/null +++ /trunk/source/mxn.openspace.core.js Wed Mar 24 11:33:58 2010 @@ -0,0 +1,460 @@ +mxn.register(''openspace'', { + +Mapstraction: { + + init: function(element, api) { + var me = this; + // create the map with no controls and don''t centre popup info window + this.maps[api] = new OpenSpace.Map(element,{ + controls: [], + centreInfoWindow: false + }); + // note that these three controls are always there and the fact that + // there are three resident controls is used in addControls() + // enable map drag with mouse and keyboard + this.maps[api].addControl(new OpenLayers.Control.Navigation()); + this.maps[api].addControl(new + OpenLayers.Control.KeyboardDefaults()); + // include copyright statement + this.maps[api].addControl(new + OpenSpace.Control.CopyrightCollection()); + + this.maps[api].events.register("click", this.maps[api], + function(evt) { + var point = this.getLonLatFromViewPortPx( evt.xy ); + // convert to LatLonPoint + var llPoint = new mxn.LatLonPoint; + llPoint.fromProprietary(this.api, point); + me.clickHandler( llPoint.lat, llPoint.lon ); + return false; + }); + this.loaded[api] = true; + }, + + applyOptions: function(){ + var map = this.maps[this.api]; + + // TODO: Add provider code + }, + + resizeTo: function(width, height){ + this.currentElement.style.width = width; + this.currentElement.style.height = height; + this.maps[this.api].updateSize(); + }, + + addControls: function( args ) { + var map = this.maps[this.api]; + // remove existing controls but leave the basic navigation, + keyboard and copyright controls in place + // these were added in addAPI and not normally be removed + for (var i = map.controls.length; i>3; i--) { + map.controls[i-1].deactivate(); + map.removeControl(map.controls[i-1]); + } + // pan and zoom controls not available separately + if ( args.zoom == ''large'') { + map.addControl(new OpenSpace.Control.LargeMapControl()); + } + else if ( args.zoom == ''small'' || args.pan ) { + map.addControl(new OpenSpace.Control.SmallMapControl()); + } + if ( args.overview ) { + // this should work but as of OpenSpace 0.7.2 generates an error + // unless done before setCenterAndZoom + var osOverviewControl = new OpenSpace.Control.OverviewMap(); + map.addControl(osOverviewControl); + osOverviewControl.maximizeControl(); + } + if ( args.map_type ) { + // this is all you get with openspace, a control to switch on or + // off the layers and markers + // probably not much use to anybody + map.addControl(new OpenLayers.Control.LayerSwitcher()); + } + }, + + addSmallControls: function() { + var map = this.maps[this.api]; + map.addControl(new OpenSpace.Control.SmallMapControl()); + }, + + addLargeControls: function() { + var map = this.maps[this.api]; + map.addControl(new OpenSpace.Control.LargeMapControl()); + }, + + addMapTypeControls: function() { + var map = this.maps[this.api]; + + // TODO: Add provider code + }, + + setCenterAndZoom: function(point, zoom) { + var map = this.maps[this.api]; + var pt = point.toProprietary(this.api); + + var oszoom = zoom-6; + if (oszoom<0) { + oszoom = 0; + } + else if (oszoom>10) { + oszoom = 10; + } + map.setCenter(pt, oszoom); + }, + + addMarker: function(marker, old) { + var map = this.maps[this.api]; + var pin = marker.toProprietary(this.api); + + map.addOverlay(pin); + + return pin; + }, + + removeMarker: function(marker) { + var map = this.maps[this.api]; + + // TODO: Add provider code + }, + + removeAllMarkers: function() { + var map = this.maps[this.api]; + + // TODO: Add provider code + }, + + declutterMarkers: function(opts) { + var map = this.maps[this.api]; + + // TODO: Add provider code + }, + + addPolyline: function(polyline, old) { + var map = this.maps[this.api]; + var pl = polyline.toProprietary(this.api); + + // TODO: Add provider code + + return pl; + }, + + removePolyline: function(polyline) { + var map = this.maps[this.api]; + + // TODO: Add provider code + }, + + getCenter: function() { + var point; + var map = this.maps[this.api]; + + var pt = map.getCenter(); // an OpenSpace.MapPoint, + // UK National Grid + point = new mxn.LatLonPoint(); + point.fromOpenSpace(pt); // convert to LatLonPoint + + return point; + }, + + setCenter: function(point, options) { + var map = this.maps[this.api]; + var pt = point.toProprietary(this.api); + if(options && options.pan) { + map.setCenter(pt.toProprietary(this.api)); + } + else { + map.setCenter(pt.toProprietary(this.api)); + } + }, + + setZoom: function(zoom) { + var map = this.maps[this.api]; + + var oszoom = zoom-6; + if (oszoom<0) { + oszoom = 0; + } + else if (oszoom>10) { + oszoom = 10; + } + map.zoomTo(oszoom); + + }, + + getZoom: function() { + var map = this.maps[this.api]; + var zoom; + + zoom = map.zoom + 6; // convert to equivalent google zoom + + return zoom; + }, + + getZoomLevelForBoundingBox: function( bbox ) { + var map = this.maps[this.api]; + // NE and SW points from the bounding box. + var ne = bbox.getNorthEast(); + var sw = bbox.getSouthWest(); + var zoom; + + var obounds = new OpenSpace.MapBounds(); + obounds.extend(new + mxn.LatLonPoint(sw.lat,sw.lon).toProprietary(this.api)); + obounds.extend(new + mxn.LatLonPoint(ne.lat,ne.lon).toProprietary(this.api)); + zoom = map.getZoomForExtent(obounds) + 6; // get it and adjust to + // equivalent google zoom + + return zoom; + }, + + setMapType: function(type) { + var map = this.maps[this.api]; + switch(type) { + case mxn.Mapstraction.ROAD: + // TODO: Add provider code + break; + case mxn.Mapstraction.SATELLITE: + // TODO: Add provider code + break; + case mxn.Mapstraction.HYBRID: + // TODO: Add provider code + break; + default: + // TODO: Add provider code + } + }, + + getMapType: function() { + var map = this.maps[this.api]; + + // TODO: Add provider code + //return mxn.Mapstraction.ROAD; + //return mxn.Mapstraction.SATELLITE; + //return mxn.Mapstraction.HYBRID; + }, + + getBounds: function () { + var map = this.maps[this.api]; + + // array of openspace coords + // left, bottom, right, top + var olbox = map.calculateBounds().toArray(); + var ossw = new OpenSpace.MapPoint( olbox[0], olbox[1] ); + var osne = new OpenSpace.MapPoint( olbox[2], olbox[3] ); + // convert to LatLonPoints + var sw = new mxn.LatLonPoint; + sw.fromOpenSpace(ossw); + var ne = new mxn.LatLonPoint; + ne.fromOpenSpace(osne); + return new mxn.BoundingBox(sw.lat, sw.lon, ne.lat, ne.lon); + }, + + setBounds: function(bounds){ + var map = this.maps[this.api]; + var sw = bounds.getSouthWest(); + var ne = bounds.getNorthEast(); + + var obounds = new OpenSpace.MapBounds(); + obounds.extend(new + mxn.LatLonPoint(sw.lat,sw.lon).toProprietary(this.api)); + obounds.extend(new + mxn.LatLonPoint(ne.lat,ne.lon).toProprietary(this.api)); + map.zoomToExtent(obounds); + + }, + + addImageOverlay: function(id, src, opacity, west, south, east, + north, oContext) { + var map = this.maps[this.api]; + + // TODO: Add provider code + }, + + setImagePosition: function(id, oContext) { + var map = this.maps[this.api]; + var topLeftPoint; var bottomRightPoint; + + // TODO: Add provider code + + //oContext.pixels.top = ...; + //oContext.pixels.left = ...; + //oContext.pixels.bottom = ...; + //oContext.pixels.right = ...; + }, + + addOverlay: function(url, autoCenterAndZoom) { + var map = this.maps[this.api]; + + // TODO: Add provider code + }, + + addTileLayer: function(tile_url, opacity, copyright_text, min_zoom, + max_zoom) { + var map = this.maps[this.api]; + // TODO: Add provider code + }, + + toggleTileLayer: function(tile_url) { + var map = this.maps[this.api]; + // TODO: Add provider code + }, + + getPixelRatio: function() { + var map = this.maps[this.api]; + // TODO: Add provider code + }, + + mousePosition: function(element) { + var map = this.maps[this.api]; + + try { + map.events.register(''mousemove'', map, function (e) { + var lonLat = map.getLonLatFromViewPortPx(e.xy); + var lon = lonLat.lon * (180.0 / 20037508.34); + var lat = lonLat.lat * (180.0 / 20037508.34); + lat + (180/Math.PI)*(2*Math.atan(Math.exp(lat*Math.PI/180))-(Math.PI/2)); + var loc = numFormatFloat(lat,4) + '' / '' + + numFormatFloat(lon,4); + // numFormatFloat(X,4) simply formats floating point ''X'' to + // 4 dec places + locDisp.innerHTML = loc; + }); + locDisp.innerHTML = ''0.0000 / 0.0000''; + } catch (x) { + alert("Error: " + x); + } + + // TODO: Add provider code + } +}, + +LatLonPoint: { + + toProprietary: function() { + var lonlat = new OpenLayers.LonLat(this.lon, this.lat); + // need to convert to UK national grid + var gridProjection = new OpenSpace.GridProjection(); + return gridProjection.getMapPointFromLonLat(lonlat); + // on OpenSpace.MapPoint + + }, + + fromProprietary: function(osPoint) { + var gridProjection = new OpenSpace.GridProjection(); + var olpt = gridProjection.getLonLatFromMapPoint(osPoint); + // an OpenLayers.LonLat + this.lon = olpt.lon; + this.lat = olpt.lat; + } + +}, + +Marker: { + + toProprietary: function() { + var size, anchor, icon; + if(this.iconSize) { + size = new OpenLayers.Size(this.iconSize[0], + this.iconSize[1]); + } + else { + size = new OpenLayers.Size(20,25); + } + + if(this.iconAnchor) { + anchor = new OpenLayers.Pixel(this.iconAnchor[0], + this.iconAnchor[1]); + } + else { + // FIXME: hard-coding the anchor point + anchor = new OpenLayers.Pixel(-(size.w/2), -size.h); + } + + if(this.iconUrl) { + icon = new OpenSpace.Icon(this.iconUrl, size, anchor); + } + else { // leave at default OpenSpace icon + } + + // This requires an OpenLayers specific hack, doesn''t work when + // not including OpenLayers.js + // if (this.labelText) { + // var marker = new + OpenLayers.Marker.Label(this.location.toProprietary(this.api), icon, + this.labelText, {mouseOver:true,tooltipsFormat:true}); + // } + // else { + var marker = new OpenLayers.Marker(this.location.toProprietary(this.api), icon); + // } + return marker; + }, + + openBubble: function() { + // TODO: Add provider code + }, + + hide: function() { + // TODO: Add provider code + }, + + show: function() { + // TODO: Add provider code + }, + + update: function() { + // TODO: Add provider code + } +}, + +Polyline: { + + toProprietary: function() { + var ospolyline; + var ospoints = []; + for (var i = 0, length = this.points.length ; i< length; i++){ + // convert each point to OpenSpace.MapPoint + var ospoint = this.points[i].toProprietary(this.api); + var olgpoint = new OpenLayers.Geometry.Point(ospoint.getEasting(), + ospoint.getNorthing()); + ospoints.push(olgpoint); + } + if (this.closed) { + ospolyline = new OpenLayers.Feature.Vector(new + OpenLayers.Geometry.LinearRing(ospoints), null, { + + + fillColor: this.color, + strokeColor: this.color, + strokeOpacity: this.opacity, + fillOpacity: this.opacity, + strokeWidth: this.width + }); + } + else { + ospolyline = new OpenLayers.Feature.Vector(new + OpenLayers.Geometry.LineString(ospoints), null, { + fillColor: 0, + strokeColor: this.color, + strokeOpacity: this.opacity, + fillOpacity: 0, + strokeWidth: this.width + }); + } + return ospolyline; + }, + + show: function() { + // TODO: Add provider code + }, + + hide: function() { + // TODO: Add provider code + } + +} + +});