⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 grid.js

📁 用来在地图上做操作GIS,在地图上做标记
💻 JS
📖 第 1 页 / 共 2 页
字号:
/* 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/Layer/HTTPRequest.js *  * Class: OpenLayers.Layer.Grid * Base class for layers that use a lattice of tiles.  Create a new grid * layer with the <OpenLayers.Layer.Grid> constructor. * * Inherits from: *  - <OpenLayers.Layer.HTTPRequest> */OpenLayers.Layer.Grid = OpenLayers.Class(OpenLayers.Layer.HTTPRequest, {        /**     * APIProperty: tileSize     * {<OpenLayers.Size>}     */    tileSize: null,        /**     * Property: grid     * {Array(Array(<OpenLayers.Tile>))} This is an array of rows, each row is      *     an array of tiles.     */    grid: null,    /**     * APIProperty: singleTile     * {Boolean} Moves the layer into single-tile mode, meaning that one tile      *     will be loaded. The tile's size will be determined by the 'ratio'     *     property. When the tile is dragged such that it does not cover the      *     entire viewport, it is reloaded.     */    singleTile: false,    /** APIProperty: ratio     *  {Float} Used only when in single-tile mode, this specifies the      *          ratio of the size of the single tile to the size of the map.     */    ratio: 1.5,    /**     * APIProperty: buffer     * {Integer} Used only when in gridded mode, this specifies the number of      *           extra rows and colums of tiles on each side which will     *           surround the minimum grid tiles to cover the map.     */    buffer: 2,    /**     * APIProperty: numLoadingTiles     * {Integer} How many tiles are still loading?     */    numLoadingTiles: 0,    /**     * Constructor: OpenLayers.Layer.Grid     * Create a new grid layer     *     * Parameters:     * name - {String}     * url - {String}     * params - {Object}     * options - {Object} Hashtable of extra options to tag onto the layer     */    initialize: function(name, url, params, options) {        OpenLayers.Layer.HTTPRequest.prototype.initialize.apply(this,                                                                 arguments);                //grid layers will trigger 'tileloaded' when each new tile is         // loaded, as a means of progress update to listeners.        // listeners can access 'numLoadingTiles' if they wish to keep track        // of the loading progress        //        this.events.addEventType("tileloaded");        this.grid = [];    },    /**     * APIMethod: destroy     * Deconstruct the layer and clear the grid.     */    destroy: function() {        this.clearGrid();        this.grid = null;        this.tileSize = null;        OpenLayers.Layer.HTTPRequest.prototype.destroy.apply(this, arguments);     },    /**     * Method: clearGrid     * Go through and remove all tiles from the grid, calling     *    destroy() on each of them to kill circular references     */    clearGrid:function() {        if (this.grid) {            for(var iRow=0; iRow < this.grid.length; iRow++) {                var row = this.grid[iRow];                for(var iCol=0; iCol < row.length; iCol++) {                    var tile = row[iCol];                    this.removeTileMonitoringHooks(tile);                    tile.destroy();                }            }            this.grid = [];        }    },    /**     * APIMethod: clone     * Create a clone of this layer     *     * Parameters:     * obj - {Object} Is this ever used?     *      * Returns:     * {<OpenLayers.Layer.Grid>} An exact clone of this OpenLayers.Layer.Grid     */    clone: function (obj) {                if (obj == null) {            obj = new OpenLayers.Layer.Grid(this.name,                                            this.url,                                            this.params,                                            this.options);        }        //get all additions from superclasses        obj = OpenLayers.Layer.HTTPRequest.prototype.clone.apply(this, [obj]);        // copy/set any non-init, non-simple values here        if (this.tileSize != null) {            obj.tileSize = this.tileSize.clone();        }                // we do not want to copy reference to grid, so we make a new array        obj.grid = [];        return obj;    },        /**     * Method: moveTo     * This function is called whenever the map is moved. All the moving     * of actual 'tiles' is done by the map, but moveTo's role is to accept     * a bounds and make sure the data that that bounds requires is pre-loaded.     *     * Parameters:     * bounds - {<OpenLayers.Bounds>}     * zoomChanged - {Boolean}     * dragging - {Boolean}     */    moveTo:function(bounds, zoomChanged, dragging) {        OpenLayers.Layer.HTTPRequest.prototype.moveTo.apply(this, arguments);                bounds = bounds || this.map.getExtent();        if (bounds != null) {                         // if grid is empty or zoom has changed, we *must* re-tile            var forceReTile = !this.grid.length || zoomChanged;            // total bounds of the tiles            var tilesBounds = this.getTilesBounds();                              if (this.singleTile) {                                // We want to redraw whenever even the slightest part of the                 //  current bounds is not contained by our tile.                //  (thus, we do not specify partial -- its default is false)                if ( forceReTile ||                      (!dragging && !tilesBounds.containsBounds(bounds))) {                    this.initSingleTile(bounds);                }            } else {                             // if the bounds have changed such that they are not even                 //  *partially* contained by our tiles (IE user has                 //  programmatically panned to the other side of the earth)                 //  then we want to reTile (thus, partial true).                  //                if (forceReTile || !tilesBounds.containsBounds(bounds, true)) {                    this.initGriddedTiles(bounds);                } else {                    //we might have to shift our buffer tiles                    this.moveGriddedTiles(bounds);                }            }        }    },        /**     * APIMethod: setTileSize     * Check if we are in singleTile mode and if so, set the size as a ratio     *     of the map size (as specified by the layer's 'ratio' property).     *      * Parameters:     * size - {<OpenLayers.Size>}     */    setTileSize: function(size) {         if (this.singleTile) {            var size = this.map.getSize().clone();            size.h = parseInt(size.h * this.ratio);            size.w = parseInt(size.w * this.ratio);        }         OpenLayers.Layer.HTTPRequest.prototype.setTileSize.apply(this, [size]);    },            /**     * Method: getGridBounds     * Deprecated. This function will be removed in 3.0. Please use      *     getTilesBounds() instead.     *      * Returns:     * {<OpenLayers.Bounds>} A Bounds object representing the bounds of all the     * currently loaded tiles (including those partially or not at all seen      * onscreen)     */    getGridBounds: function() {        var msg = "The getGridBounds() function is deprecated. It will be " +                  "removed in 3.0. Please use getTilesBounds() instead.";        OpenLayers.Console.warn(msg);        return this.getTilesBounds();    },    /**     * APIMethod: getTilesBounds     * Return the bounds of the tile grid.     *     * Returns:     * {<OpenLayers.Bounds>} A Bounds object representing the bounds of all the     *     currently loaded tiles (including those partially or not at all seen      *     onscreen).     */    getTilesBounds: function() {            var bounds = null;                 if (this.grid.length) {            var bottom = this.grid.length - 1;            var bottomLeftTile = this.grid[bottom][0];                var right = this.grid[0].length - 1;             var topRightTile = this.grid[0][right];                bounds = new OpenLayers.Bounds(bottomLeftTile.bounds.left,                                            bottomLeftTile.bounds.bottom,                                           topRightTile.bounds.right,                                            topRightTile.bounds.top);                    }           return bounds;    },    /**     * Method: initSingleTile     *      * Parameters:      * bounds - {<OpenLayers.Bounds>}     */    initSingleTile: function(bounds) {        //determine new tile bounds        var center = bounds.getCenterLonLat();        var tileWidth = bounds.getWidth() * this.ratio;        var tileHeight = bounds.getHeight() * this.ratio;                                               var tileBounds =             new OpenLayers.Bounds(center.lon - (tileWidth/2),                                  center.lat - (tileHeight/2),                                  center.lon + (tileWidth/2),                                  center.lat + (tileHeight/2));          var ul = new OpenLayers.LonLat(tileBounds.left, tileBounds.top);        var px = this.map.getLayerPxFromLonLat(ul);        if (!this.grid.length) {            this.grid[0] = [];        }        var tile = this.grid[0][0];        if (!tile) {            tile = this.addTile(tileBounds, px);                        this.addTileMonitoringHooks(tile);            tile.draw();            this.grid[0][0] = tile;        } else {            tile.moveTo(tileBounds, px);        }                           //remove all but our single tile        this.removeExcessTiles(1,1);    },    /**     * Method: initGriddedTiles     *      * Parameters:     * bounds - {<OpenLayers.Bounds>}     */    initGriddedTiles:function(bounds) {                // work out mininum number of rows and columns; this is the number of        // tiles required to cover the viewport plus at least one for panning        var viewSize = this.map.getSize();        var minRows = Math.ceil(viewSize.h/this.tileSize.h) +                       Math.max(1, 2 * this.buffer);        var minCols = Math.ceil(viewSize.w/this.tileSize.w) +                      Math.max(1, 2 * this.buffer);                var extent = this.map.getMaxExtent();        var resolution = this.map.getResolution();        var tilelon = resolution * this.tileSize.w;        var tilelat = resolution * this.tileSize.h;                var offsetlon = bounds.left - extent.left;        var tilecol = Math.floor(offsetlon/tilelon) - this.buffer;        var tilecolremain = offsetlon/tilelon - tilecol;        var tileoffsetx = -tilecolremain * this.tileSize.w;        var tileoffsetlon = extent.left + tilecol * tilelon;                var offsetlat = bounds.top - (extent.bottom + tilelat);          var tilerow = Math.ceil(offsetlat/tilelat) + this.buffer;        var tilerowremain = tilerow - offsetlat/tilelat;        var tileoffsety = -tilerowremain * this.tileSize.h;        var tileoffsetlat = extent.bottom + tilerow * tilelat;                tileoffsetx = Math.round(tileoffsetx); // heaven help us        tileoffsety = Math.round(tileoffsety);        this.origin = new OpenLayers.Pixel(tileoffsetx, tileoffsety);        var startX = tileoffsetx;         var startLon = tileoffsetlon;        var rowidx = 0;            do {            var row = this.grid[rowidx++];            if (!row) {                row = [];                this.grid.push(row);            }            tileoffsetlon = startLon;            tileoffsetx = startX;            var colidx = 0;             do {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -