OpenLayers源码学习21:XYZ Posted on 2015-03-26 | In OpenLayers学习 | 看完WMTS之后, 发现XYZ这个类倒是最简单, 其实应该从XYZ这开始看 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879OpenLayers.Layer.XYZ = OpenLayers.Class(OpenLayers.Layer.Grid, { isBaseLayer: true, //墨卡托投影 sphericalMercator: false, //zoom全局偏移 zoomOffset: 0, // 服务端分辨率列表 serverResolutions: null, // 构造 initialize: function(name, url, options) { if (options && options.sphericalMercator || this.sphericalMercator) { options = OpenLayers.Util.extend({//有墨卡托投影, 转成900913_19级 projection: "EPSG:900913", numZoomLevels: 19 }, options); } OpenLayers.Layer.Grid.prototype.initialize.apply(this, [ name || this.name, url || this.url, {}, options ]); }, //克隆 clone: function (obj) { if (obj == null) { obj = new OpenLayers.Layer.XYZ(this.name, this.url, this.getOptions()); } //父类构造 obj = OpenLayers.Layer.Grid.prototype.clone.apply(this, [obj]); return obj; }, // 给瓦片用的接口, 产生实际url getURL: function (bounds) { var xyz = this.getXYZ(bounds); var url = this.url; if (OpenLayers.Util.isArray(url)) { var s = '' + xyz.x + xyz.y + xyz.z; url = this.selectUrl(s, url); } return OpenLayers.String.format(url, xyz); }, // 瓦片位置计算公式 getXYZ: function(bounds) { var res = this.getServerResolution(); var x = Math.round((bounds.left - this.maxExtent.left) / (res * this.tileSize.w));// (传入bound - 地图边界最左)/(分辨率x瓦片宽) var y = Math.round((this.maxExtent.top - bounds.top) / (res * this.tileSize.h)); var z = this.getServerZoom(); if (this.wrapDateLine) { var limit = Math.pow(2, z); x = ((x % limit) + limit) % limit; } return {'x': x, 'y': y, 'z': z}; }, // 设置持有的map对象 setMap: function(map) { OpenLayers.Layer.Grid.prototype.setMap.apply(this, arguments); if (!this.tileOrigin) { this.tileOrigin = new OpenLayers.LonLat(this.maxExtent.left, this.maxExtent.bottom); } }, CLASS_NAME: "OpenLayers.Layer.XYZ"});