Baidu.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. /**
  2. * @requires SuperMap/Layer/CanvasLayer.js
  3. * @requires SuperMap/Layer/Grid.js
  4. * @requires SuperMap/Tile/Image.js
  5. */
  6. /**
  7. * Class: SuperMap.Layer.Baidu
  8. * Baidu服务图层类。
  9. * 用于显示Baidu的地图,使用<SuperMap.Layer.Baidu>的
  10. * 构造函数可以创建Baidu图层,更多信息查看:
  11. *
  12. *
  13. *
  14. * Inherits from:
  15. * - <SuperMap.Layer.CanvasLayer>
  16. */
  17. SuperMap.Layer.Baidu = SuperMap.Class(SuperMap.CanvasLayer, {
  18. offsetXY:null,
  19. /**
  20. * APIProperty: dpi
  21. * {Float} 屏幕上每英寸包含像素点的个数。
  22. * 该参数结合图层比例尺可以推算出该比例尺下图层的分辨率.默认为96。
  23. */
  24. dpi: 96,
  25. /**
  26. * Property: attribution
  27. * {String} The layer attribution.
  28. */
  29. attribution: "Data by <a style='white-space: nowrap' target='_blank' href='http://map.baidu.com/'>Baidu</a>",
  30. /**
  31. * Property: zOffset
  32. * {Number} 图片url中z值偏移量
  33. */
  34. zOffset:3,
  35. /**
  36. * Constructor: SuperMap.Layer.Baidu
  37. * 创建Baidu图层
  38. *
  39. * Example:
  40. * (code)
  41. *
  42. * var baiduLayer = new SuperMap.Layer.Baidu();
  43. * (end)
  44. */
  45. initialize: function (options) {
  46. var me = this;
  47. me.name = "Baidu";
  48. me.url = "http://online${num}.map.bdimg.com/onlinelabel/?qt=tile&x=${x}&y=${y}&z=${z}&styles=pl&udt=20150815&scaler=1";
  49. // me.url = "http://shangetu${num}.map.bdimg.com/it/u=x=${x};y=${y};z=${z};v=017;type=web&fm=44&udt=20130712";
  50. /*
  51. offsetXY = [];
  52. offsetXY.push({x:-3,y:1});//3
  53. offsetXY.push({x:-6,y:3});//4
  54. offsetXY.push({x:-12,y:7});//5
  55. offsetXY.push({x:-24,y:15});//6
  56. offsetXY.push({x:-48,y:31});//7
  57. offsetXY.push({x:-96,y:63});//8
  58. offsetXY.push({x:-192,y:127});//9
  59. offsetXY.push({x:-384,y:255});//10
  60. offsetXY.push({x:-768,y:511});//11
  61. offsetXY.push({x:-1536,y:1023});//12
  62. offsetXY.push({x:-3072,y:2047});//13
  63. offsetXY.push({x:-6144,y:4095});//14
  64. offsetXY.push({x:-12288,y:8191});//15
  65. offsetXY.push({x:-24576,y:16383});//16
  66. offsetXY.push({x:-49152,y:32767});//17
  67. offsetXY.push({x:-98304,y:65535});//18
  68. offsetXY.push({x:-196608,y:131071});//19
  69. */
  70. /*
  71. var minX = 6291456;
  72. var minY = 0;
  73. var maxX= minX + Math.pow(2, 14) * 256 * 5;
  74. var maxY= minY + Math.pow(2, 14) * 256 * 4;
  75. */
  76. // console.log(Math.pow(2, 15) * 256 * 4); // bounds 3 16 2 4 1 1 19-3=16 0.5 15
  77. var minX = -33554432;
  78. var minY = -33554432;
  79. var maxX= 33554432;
  80. var maxY= 33554432;
  81. var res = Math.pow(2,15);
  82. var resAry= [];
  83. for (var i = 0; i < 17; i++) //百度 3-19
  84. {
  85. resAry[i] = res;
  86. res *= 0.5; //每次二分之一
  87. }
  88. //计算比例尺数组
  89. var scaAry = [];
  90. for(var i = 0;i<17;i++)
  91. {
  92. scaAry[i] = 0.0254/(96*resAry[i]); //0.0254 为英寸和米的转换常数 //PPI 每英寸的像素点数
  93. }
  94. options = SuperMap.Util.extend({
  95. maxExtent: new SuperMap.Bounds(
  96. minX, minY, maxX, maxY
  97. ),
  98. tileOrigin:new SuperMap.LonLat(minX, maxY),
  99. resolutions:resAry
  100. }, options);
  101. SuperMap.CanvasLayer.prototype.initialize.apply(me, [me.name, me.url, null, options]);
  102. me.units = "m";
  103. //投影从非官方的900913改为3857
  104. me.projection = "EPSG:3857";
  105. },
  106. /**
  107. * APIMethod: clone
  108. * 创建当前图层的副本。
  109. *
  110. * Parameters:
  111. * obj - {Object}
  112. *
  113. * Returns:
  114. * {<SuperMap.Layer.Baidu>} 新的图层。
  115. */
  116. clone: function (obj) {
  117. var me = this;
  118. if (obj == null) {
  119. obj = new SuperMap.Layer.Baidu(
  120. me.name, me.url, me.params, me.getOptions());
  121. }
  122. obj = SuperMap.CanvasLayer.prototype.clone.apply(me, [obj]);
  123. obj._timeoutId = null;
  124. return obj;
  125. },
  126. getTileUrl:function(xyz){
  127. var me = this,
  128. url = me.url;
  129. /*
  130. var x = xyz.x + offsetXY[xyz.z].x;
  131. var y = offsetXY[xyz.z].y - xyz.y;
  132. var z = xyz.z + 3;
  133. var num = Math.abs((xyz.x + xyz.y) % 8);
  134. num++;
  135. */
  136. var zoom = xyz.z + me.zOffset;
  137. var offsetX = Math.pow(2, zoom-1);
  138. var offsetY = offsetX - 1;
  139. var numX = xyz.x - offsetX;
  140. var numY = -xyz.y + offsetY;
  141. var num = Math.abs((xyz.x + xyz.y) % 8)+1;
  142. url = SuperMap.String.format(url, {
  143. num: num,
  144. x: numX,
  145. y: numY,
  146. z: zoom
  147. });
  148. url = url.replace(/-/g,"M");
  149. return url;
  150. },
  151. CLASS_NAME: 'SuperMap.Layer.Baidu'
  152. });