/** * @requires SuperMap/Layer/CanvasLayer.js * @requires SuperMap/Layer/Grid.js * @requires SuperMap/Tile/Image.js */ /** * Class: SuperMap.Layer.Tianditu * 天地图服务图层类。 * 用于显示天地图的地图服务,使用的 * 构造函数可以创建天地图图层,更多信息查看: * * Inherits from: * - */ SuperMap.Layer.Tianditu = SuperMap.Class(SuperMap.CanvasLayer, { /** * APIProperty: layerType * {String} 图层类型.(vec:矢量图层,img:影像图层,ter:地形图层) */ layerType:"vec", //(vec:矢量图层,cva:矢量标签图层,img:影像图层,cia:影像标签图层,ter:地形,cta:地形标签图层) /** * APIProperty: isLabel * {Boolean} 是否是标签图层. */ isLabel:false, /** * Property: attribution * {String} The layer attribution. */ attribution: "Data by Tianditu", /** * Property: url * {String} 图片url. */ url:"http://t${num}.tianditu.com/DataServer?T=${type}_${proj}&x=${x}&y=${y}&l=${z}", //cva_url:"http://t${num}.tianditu.com/DataServer?T=cva_${proj}&x=${x}&y=${y}&l=${z}", /** * Property: zOffset * {Number} 图片url中z值偏移量 */ zOffset:1, /** * APIProperty: dpi * {Float} 屏幕上每英寸包含像素点的个数。 * 该参数结合图层比例尺可以推算出该比例尺下图层的分辨率.默认为96。 */ dpi: 96, /** * Constructor: SuperMap.Layer.Tianditu * 创建天地图图层 * * Example: * (code) * var tiandituLayer = new SuperMap.Layer.Tianditu(); * (end) */ initialize: function (options) { var me = this; me.name = "Tianditu"; // options = SuperMap.Util.extend({ // maxExtent: new SuperMap.Bounds( // minX, minY, maxX, maxY // ), // tileOrigin:new SuperMap.LonLat(minX, maxY), // //maxResolution:maxResolution, // //minResolution:minResolution, // resolutions:resolutions, // units:me.units, // projection:me.projection // }, options); SuperMap.CanvasLayer.prototype.initialize.apply(me, [me.name, me.url, null, options]); }, /** * APIMethod: clone * 创建当前图层的副本。 * * Parameters: * obj - {Object} * * Returns: * {} 新的图层。 */ clone: function (obj) { var me = this; if (obj == null) { obj = new SuperMap.Layer.Tianditu( me.name, me.url, me.params, me.getOptions()); } obj = SuperMap.CanvasLayer.prototype.clone.apply(me, [obj]); obj._timeoutId = null; return obj; }, /** * Method: getTileUrl * 获取每个tile的图片url * * Parameters: * xyz - {Object} */ getTileUrl:function(xyz){ var me = this; url = me.url; var proj = this.projection; if(proj.getCode){ proj = proj.getCode(); } if(proj=="EPSG:4326"){ var proj = "c" } else{ var proj = "w"; } var x = xyz.x; var y = xyz.y; var z = xyz.z+me.zOffset; var num = Math.abs((xyz.x + xyz.y) % 7); var lt = this.layerType; if(this.isLabel){ if(this.layerType=="vec")lt="cva" if(this.layerType=="img")lt="cia" if(this.layerType=="ter")lt="cta" } url = SuperMap.String.format(url, { num: num, x: x, y: y, z: z, proj:proj, type:lt }); return url; }, /** * Method: setMap * Set the map property for the layer. This is done through an accessor * so that subclasses can override this and take special action once * they have their map variable set. * * Here we take care to bring over any of the necessary default * properties from the map. * * Parameters: * map - {} */ setMap: function(map) { SuperMap.CanvasLayer.prototype.setMap.apply(this, [map]); var proCode = null; var proj = this.projection||map.projection; if(proj){ if(proj.getCode){ proCode = proj.getCode(); } else{ proCode = proj; } } this.setTiandituParam(proCode); }, /** * Method: setTiandituParam * 设置出图相关参数 * * Parameters: * projection - {String} 投影坐标系 */ setTiandituParam:function(projection){ var lt = this.layerType; if(lt=="vec"){ var resLen = 17; var resStart = 0; this.zOffset = 1; this.numZoomLevels = 17; } else if(lt=="img"){ var resLen = 17; var resStart = 0; this.zOffset = 1; this.numZoomLevels = 17; } else if(lt=="ter"){ var resLen = 13; var resStart = 0; this.zOffset = 1; this.numZoomLevels = 13; } if(projection=="EPSG:4326"){ var minX = -180; var minY = -90; var maxX= 180; var maxY= 90; //var maxResolution = 156543.0339; //var minResolution = 0.5971642833709717; var resolutions = []; for(var i=resStart;i