123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513 |
- mxn.register('openlayers', {
- Mapstraction: {
- init: function(element, api){
- var me = this;
- this.maps[api] = new OpenLayers.Map(
- element.id,
- {
- maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
- maxResolution:156543,
- numZoomLevels:18,
- units:'meters',
- projection: "EPSG:41001"
- }
- );
- this.layers['osmmapnik'] = new OpenLayers.Layer.TMS(
- 'OSM Mapnik',
- [
- "http://a.tile.openstreetmap.org/",
- "http://b.tile.openstreetmap.org/",
- "http://c.tile.openstreetmap.org/"
- ],
- {
- type:'png',
- getURL: function (bounds) {
- var res = this.map.getResolution();
- var x = Math.round ((bounds.left - this.maxExtent.left) / (res * this.tileSize.w));
- var y = Math.round ((this.maxExtent.top - bounds.top) / (res * this.tileSize.h));
- var z = this.map.getZoom();
- var limit = Math.pow(2, z);
- if (y < 0 || y >= limit) {
- return null;
- } else {
- x = ((x % limit) + limit) % limit;
- var path = z + "/" + x + "/" + y + "." + this.type;
- var url = this.url;
- if (url instanceof Array) {
- url = this.selectUrl(path, url);
- }
- return url + path;
- }
- },
- displayOutsideMaxExtent: true
- }
- );
- this.layers['osm'] = new OpenLayers.Layer.TMS(
- 'OSM',
- [
- "http://a.tah.openstreetmap.org/Tiles/tile.php/",
- "http://b.tah.openstreetmap.org/Tiles/tile.php/",
- "http://c.tah.openstreetmap.org/Tiles/tile.php/"
- ],
- {
- type:'png',
- getURL: function (bounds) {
- var res = this.map.getResolution();
- var x = Math.round ((bounds.left - this.maxExtent.left) / (res * this.tileSize.w));
- var y = Math.round ((this.maxExtent.top - bounds.top) / (res * this.tileSize.h));
- var z = this.map.getZoom();
- var limit = Math.pow(2, z);
- if (y < 0 || y >= limit) {
- return null;
- } else {
- x = ((x % limit) + limit) % limit;
- var path = z + "/" + x + "/" + y + "." + this.type;
- var url = this.url;
- if (url instanceof Array) {
- url = this.selectUrl(path, url);
- }
- return url + path;
- }
- },
- displayOutsideMaxExtent: true
- }
- );
- this.maps[api].addLayer(this.layers['osmmapnik']);
- this.maps[api].addLayer(this.layers['osm']);
- },
- applyOptions: function(){
- // var map = this.maps[this.api];
- // var myOptions = [];
- // if (this.options.enableDragging) {
- // myOptions.draggable = true;
- // }
- // if (this.options.enableScrollWheelZoom){
- // myOptions.scrollwheel = true;
- // }
- // map.setOptions(myOptions);
- },
- 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];
- // FIXME: OpenLayers has a bug removing all the controls says crschmidt
- for (var i = map.controls.length; i>1; i--) {
- map.controls[i-1].deactivate();
- map.removeControl(map.controls[i-1]);
- }
- if ( args.zoom == 'large' ) {
- map.addControl(new OpenLayers.Control.PanZoomBar());
- }
- else if ( args.zoom == 'small' ) {
- map.addControl(new OpenLayers.Control.ZoomPanel());
- if ( args.pan) {
- map.addControl(new OpenLayers.Control.PanPanel());
- }
- }
- else {
- if ( args.pan){
- map.addControl(new OpenLayers.Control.PanPanel());
- }
- }
- if ( args.overview ) {
- map.addControl(new OpenLayers.Control.OverviewMap());
- }
- if ( args.map_type ) {
- map.addControl(new OpenLayers.Control.LayerSwitcher());
- }
- },
- addSmallControls: function() {
- var map = this.maps[this.api];
- this.addControlsArgs.pan = false;
- this.addControlsArgs.scale = false;
- this.addControlsArgs.zoom = 'small';
- map.addControl(new OpenLayers.Control.ZoomBox());
- map.addControl(new OpenLayers.Control.LayerSwitcher({
- 'ascending':false
- }));
- },
- addLargeControls: function() {
- var map = this.maps[this.api];
- map.addControl(new OpenLayers.Control.PanZoomBar());
- this.addControlsArgs.pan = true;
- this.addControlsArgs.zoom = 'large';
- },
- addMapTypeControls: function() {
- var map = this.maps[this.api];
- map.addControl( new OpenLayers.Control.LayerSwitcher({
- 'ascending':false
- }) );
- this.addControlsArgs.map_type = true;
- },
- setCenterAndZoom: function(point, zoom) {
- var map = this.maps[this.api];
- var pt = point.toProprietary(this.api);
- map.setCenter(point.toProprietary(this.api), zoom);
- },
- addMarker: function(marker, old) {
- var map = this.maps[this.api];
- var pin = marker.toProprietary(this.api);
- if (!this.layers['markers']) {
- this.layers['markers'] = new OpenLayers.Layer.Markers('markers');
- map.addLayer(this.layers['markers']);
- }
- this.layers['markers'].addMarker(pin);
- return pin;
- },
- removeMarker: function(marker) {
- var map = this.maps[this.api];
- var pin = marker.toProprietary(this.api);
- this.layers['markers'].removeMarker(pin);
- pin.destroy();
- },
- 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);
- if (!this.layers['polylines']) {
- this.layers['polylines'] = new OpenLayers.Layer.Vector('polylines');
- map.addLayer(this.layers['polylines']);
- }
- polyline.setChild(pl);
- this.layers['polylines'].addFeatures([pl]);
- return pl;
- },
- removePolyline: function(polyline) {
- var map = this.maps[this.api];
- var pl = polyline.toProprietary(this.api);
- this.layers['polylines'].removeFeatures([pl]);
- },
- removeAllPolylines: function() {
- var olpolylines = [];
- for(var i = 0, length = this.polylines.length; i < length; i++){
- olpolylines.push(this.polylines[i].toProprietary(this.api));
- }
- if (this.layers['polylines']) this.layers['polylines'].removeFeatures(olpolylines);
- },
- getCenter: function() {
- var map = this.maps[this.api];
- pt = map.getCenter();
- return new mxn.LatLonPoint(pt.lat, pt.lon);
- },
- setCenter: function(point, options) {
- var map = this.maps[this.api];
- var pt = point.toProprietary(this.api);
- map.setCenter(pt);
-
- },
- setZoom: function(zoom) {
- var map = this.maps[this.api];
- map.zoomTo(zoom);
- },
- getZoom: function() {
- var map = this.maps[this.api];
- return map.zoom;
- },
- getZoomLevelForBoundingBox: function( bbox ) {
- var map = this.maps[this.api];
- // throw 'Not implemented';
- return zoom;
- },
- setMapType: function(type) {
- var map = this.maps[this.api];
- throw 'Not implemented (setMapType)';
- // switch(type) {
- // case mxn.Mapstraction.ROAD:
- // map.setMapTypeId(google.maps.MapTypeId.ROADMAP);
- // break;
- // case mxn.Mapstraction.SATELLITE:
- // map.setMapTypeId(google.maps.MapTypeId.SATELLITE);
- // break;
- // case mxn.Mapstraction.HYBRID:
- // map.setMapTypeId(google.maps.MapTypeId.HYBRID);
- // break;
- // default:
- // map.setMapTypeId(google.maps.MapTypeId.ROADMAP);
- // }
- },
- getMapType: function() {
- var map = this.maps[this.api];
- // TODO: implement actual layer support
- return mxn.Mapstraction.ROAD;
- // var type = map.getMapTypeId();
- // switch(type) {
- // case google.maps.MapTypeId.ROADMAP:
- // return mxn.Mapstraction.ROAD;
- // case google.maps.MapTypeId.SATELLITE:
- // return mxn.Mapstraction.SATELLITE;
- // case google.maps.MapTypeId.HYBRID:
- // return mxn.Mapstraction.HYBRID;
- // //case google.maps.MapTypeId.TERRAIN:
- // // return something;
- // default:
- // return null;
- // }
- },
- getBounds: function () {
- var map = this.maps[this.api];
- var olbox = map.calculateBounds();
- return new mxn.BoundingBox(olbox.bottom, olbox.left, olbox.top, olbox.right);
- },
- setBounds: function(bounds){
- var map = this.maps[this.api];
- var sw = bounds.getSouthWest();
- var ne = bounds.getNorthEast();
- if(sw.lon > ne.lon) {
- sw.lon -= 360;
- }
- var obounds = new OpenLayers.Bounds();
-
- 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];
- // TODO: Add provider code
- }
- },
- LatLonPoint: {
- toProprietary: function() {
- var ollon = this.lon * 20037508.34 / 180;
- var ollat = Math.log(Math.tan((90 + this.lat) * Math.PI / 360)) / (Math.PI / 180);
- ollat = ollat * 20037508.34 / 180;
- return new OpenLayers.LonLat(ollon, ollat);
- },
- fromProprietary: function(olPoint) {
- var lon = (olPoint.lon / 20037508.34) * 180;
- var lat = (olPoint.lat / 20037508.34) * 180;
- lat = 180/Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2);
- this.lon = lon;
- this.lat = 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(21,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 OpenLayers.Icon(this.iconUrl, size, anchor);
- }
- else {
- icon = new OpenLayers.Icon('http://openlayers.org/dev/img/marker-gold.png', size, anchor);
- }
- var marker = new OpenLayers.Marker(this.location.toProprietary("openlayers"), icon);
- if(this.infoBubble) {
- var popup = new OpenLayers.Popup(null,
- this.location.toProprietary("openlayers"),
- new OpenLayers.Size(100,100),
- this.infoBubble,
- true);
- popup.autoSize = true;
- var theMap = this.map;
- if(this.hover) {
- marker.events.register("mouseover", marker, function(event) {
- theMap.addPopup(popup);
- popup.show();
- });
- marker.events.register("mouseout", marker, function(event) {
- popup.hide();
- theMap.removePopup(popup);
- });
- }
- else {
- var shown = false;
- marker.events.register("mousedown", marker, function(event) {
- if (shown) {
- popup.hide();
- theMap.removePopup(popup);
- shown = false;
- } else {
- theMap.addPopup(popup);
- popup.show();
- shown = true;
- }
- });
- }
- }
- if(this.hoverIconUrl) {
- // TODO
- }
- if(this.infoDiv){
- // TODO
- }
- return marker;
- },
- openBubble: function() {
- // TODO: Add provider code
- },
- hide: function() {
- this.proprietary_marker.setOptions({visible:false});
- },
- show: function() {
- this.proprietary_marker.setOptions({visible:true});
- },
- update: function() {
- // TODO: Add provider code
- }
- },
- Polyline: {
- toProprietary: function() {
- var olpolyline;
- var olpoints = [];
- var ring;
- var style = {
- strokeColor: this.color || "#000000",
- strokeOpacity: this.opacity || 1,
- strokeWidth: this.width || 1,
- fillColor: this.fillColor || "#000000",
- fillOpacity: this.getAttribute('fillOpacity') || 0.2
- };
- //TODO Handle closed attribute
- for (var i = 0, length = this.points.length ; i< length; i++){
- olpoint = this.points[i].toProprietary("openlayers");
- olpoints.push(new OpenLayers.Geometry.Point(olpoint.lon, olpoint.lat));
- }
- if (this.closed) {
- // a closed polygon
- ring = new OpenLayers.Geometry.LinearRing(olpoints);
- } else {
- // a line
- ring = new OpenLayers.Geometry.LineString(olpoints);
- }
- olpolyline = new OpenLayers.Feature.Vector(ring, null, style);
- return olpolyline;
- },
- show: function() {
- throw 'Not implemented';
- },
- hide: function() {
- throw 'Not implemented';
- }
- }
- });
|