From: Tom Hughes Date: Wed, 28 Nov 2007 18:59:05 +0000 (+0000) Subject: Add a javascript file to provide OSM layers for OpenStreetMap. X-Git-Tag: live~8055 X-Git-Url: https://git.openstreetmap.org/rails.git/commitdiff_plain/29645d2d296de6e511a17204a39a4207595ebcf3 Add a javascript file to provide OSM layers for OpenStreetMap. --- diff --git a/public/openlayers/OpenStreetMap.js b/public/openlayers/OpenStreetMap.js new file mode 100644 index 000000000..90d8142ca --- /dev/null +++ b/public/openlayers/OpenStreetMap.js @@ -0,0 +1,144 @@ +/** + * Namespace: Util.OSM + */ +OpenLayers.Util.OSM = {}; + +/** + * Constant: MISSING_TILE_URL + * {String} URL of image to display for missing tiles + */ +OpenLayers.Util.OSM.MISSING_TILE_URL = "http://openstreetmap.org/openlayers/img/404.png"; + +/** + * Property: originalOnImageLoadError + * {Function} Original onImageLoadError function. + */ +OpenLayers.Util.OSM.originalOnImageLoadError = OpenLayers.Util.onImageLoadError; + +/** + * Function: onImageLoadError + */ +OpenLayers.Util.onImageLoadError = function() { + if (this.src.match(/^http:\/\/[abc]\.[a-z]+\.openstreetmap\.org/)) { + this.src = OpenLayers.Util.OSM.MISSING_TILE_URL; + } else { + OpenLayers.Util.OSM.originalOnImageLoadError; + } +}; + +/** + * @requires OpenLayers/Layer/TMS.js + * + * Class: OpenLayers.Layer.OSM + * + * Inherits from: + * - + */ +OpenLayers.Layer.OSM = OpenLayers.Class(OpenLayers.Layer.TMS, { + /** + * Constructor: OpenLayers.Layer.OSM + * + * Parameters: + * name - {String} + * url - {String} + * options - {Object} Hashtable of extra options to tag onto the layer + */ + initialize: function(name, url, options) { + options = OpenLayers.Util.extend(options, { attribution: "Powered by OpenStreetMap" }); + OpenLayers.Layer.TMS.prototype.initialize.apply(this, arguments); + }, + + /** + * Method: getUrl + * + * Parameters: + * bounds - {} + * + * Returns: + * {String} A string with the layer's url and parameters and also the + * passed-in bounds and appropriate tile size specified as + * parameters + */ + 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 OpenLayers.Util.OSM.MISSING_TILE_URL; + } + else + { + x = ((x % limit) + limit) % limit; + + var url = this.url; + var path = z + "/" + x + "/" + y + ".png"; + + if (url instanceof Array) + { + url = this.selectUrl(path, url); + } + + return url + path; + } + }, + + CLASS_NAME: "OpenLayers.Layer.OSM" +}); + +/** + * Class: OpenLayers.Layer.OSM.Mapnik + * + * Inherits from: + * - + */ +OpenLayers.Layer.OSM.Mapnik = OpenLayers.Class(OpenLayers.Layer.OSM, { + /** + * Constructor: OpenLayers.Layer.OSM.Mapnik + * + * Parameters: + * name - {String} + * options - {Object} Hashtable of extra options to tag onto the layer + */ + initialize: function(name, options) { + var url = [ + "http://a.tile.openstreetmap.org/", + "http://b.tile.openstreetmap.org/", + "http://c.tile.openstreetmap.org/" + ]; + var newArguments = [name, url, options]; + OpenLayers.Layer.OSM.prototype.initialize.apply(this, newArguments); + }, + + CLASS_NAME: "OpenLayers.Layer.OSM.Mapnik" +}); + +/** + * Class: OpenLayers.Layer.OSM.Osmarender + * + * Inherits from: + * - + */ +OpenLayers.Layer.OSM.Osmarender = OpenLayers.Class(OpenLayers.Layer.OSM, { + /** + * Constructor: OpenLayers.Layer.OSM.Osmarender + * + * Parameters: + * name - {String} + * options - {Object} Hashtable of extra options to tag onto the layer + */ + initialize: function(name, options) { + var url = [ + "http://a.tah.openstreetmap.org/Tiles/tile.php/", + "http://b.tah.openstreetmap.org/Tiles/tile.php/", + "http://c.tah.openstreetmap.org/Tiles/tile.php/" + ]; + var newArguments = [name, url, options]; + OpenLayers.Layer.OSM.prototype.initialize.apply(this, newArguments); + }, + + CLASS_NAME: "OpenLayers.Layer.OSM.Osmarender" +});