BMapCoordSys.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. var _echarts = require("echarts");
  2. var zrUtil = _echarts.util;
  3. var graphic = _echarts.graphic;
  4. var matrix = _echarts.matrix;
  5. /* global BMap */
  6. function BMapCoordSys(bmap, api) {
  7. this._bmap = bmap;
  8. this.dimensions = ['lng', 'lat'];
  9. this._mapOffset = [0, 0];
  10. this._api = api;
  11. this._projection = new BMap.MercatorProjection();
  12. }
  13. BMapCoordSys.prototype.dimensions = ['lng', 'lat'];
  14. BMapCoordSys.prototype.setZoom = function (zoom) {
  15. this._zoom = zoom;
  16. };
  17. BMapCoordSys.prototype.setCenter = function (center) {
  18. this._center = this._projection.lngLatToPoint(new BMap.Point(center[0], center[1]));
  19. };
  20. BMapCoordSys.prototype.setMapOffset = function (mapOffset) {
  21. this._mapOffset = mapOffset;
  22. };
  23. BMapCoordSys.prototype.getBMap = function () {
  24. return this._bmap;
  25. };
  26. BMapCoordSys.prototype.dataToPoint = function (data) {
  27. var point = new BMap.Point(data[0], data[1]); // TODO mercator projection is toooooooo slow
  28. // var mercatorPoint = this._projection.lngLatToPoint(point);
  29. // var width = this._api.getZr().getWidth();
  30. // var height = this._api.getZr().getHeight();
  31. // var divider = Math.pow(2, 18 - 10);
  32. // return [
  33. // Math.round((mercatorPoint.x - this._center.x) / divider + width / 2),
  34. // Math.round((this._center.y - mercatorPoint.y) / divider + height / 2)
  35. // ];
  36. var px = this._bmap.pointToOverlayPixel(point);
  37. var mapOffset = this._mapOffset;
  38. return [px.x - mapOffset[0], px.y - mapOffset[1]];
  39. };
  40. BMapCoordSys.prototype.pointToData = function (pt) {
  41. var mapOffset = this._mapOffset;
  42. var pt = this._bmap.overlayPixelToPoint({
  43. x: pt[0] + mapOffset[0],
  44. y: pt[1] + mapOffset[1]
  45. });
  46. return [pt.lng, pt.lat];
  47. };
  48. BMapCoordSys.prototype.getViewRect = function () {
  49. var api = this._api;
  50. return new graphic.BoundingRect(0, 0, api.getWidth(), api.getHeight());
  51. };
  52. BMapCoordSys.prototype.getRoamTransform = function () {
  53. return matrix.create();
  54. };
  55. BMapCoordSys.prototype.prepareCustoms = function (data) {
  56. var rect = this.getViewRect();
  57. return {
  58. coordSys: {
  59. // The name exposed to user is always 'cartesian2d' but not 'grid'.
  60. type: 'bmap',
  61. x: rect.x,
  62. y: rect.y,
  63. width: rect.width,
  64. height: rect.height
  65. },
  66. api: {
  67. coord: zrUtil.bind(this.dataToPoint, this),
  68. size: zrUtil.bind(dataToCoordSize, this)
  69. }
  70. };
  71. };
  72. function dataToCoordSize(dataSize, dataItem) {
  73. dataItem = dataItem || [0, 0];
  74. return zrUtil.map([0, 1], function (dimIdx) {
  75. var val = dataItem[dimIdx];
  76. var halfSize = dataSize[dimIdx] / 2;
  77. var p1 = [];
  78. var p2 = [];
  79. p1[dimIdx] = val - halfSize;
  80. p2[dimIdx] = val + halfSize;
  81. p1[1 - dimIdx] = p2[1 - dimIdx] = dataItem[1 - dimIdx];
  82. return Math.abs(this.dataToPoint(p1)[dimIdx] - this.dataToPoint(p2)[dimIdx]);
  83. }, this);
  84. }
  85. var Overlay; // For deciding which dimensions to use when creating list data
  86. BMapCoordSys.dimensions = BMapCoordSys.prototype.dimensions;
  87. function createOverlayCtor() {
  88. function Overlay(root) {
  89. this._root = root;
  90. }
  91. Overlay.prototype = new BMap.Overlay();
  92. /**
  93. * 初始化
  94. *
  95. * @param {BMap.Map} map
  96. * @override
  97. */
  98. Overlay.prototype.initialize = function (map) {
  99. map.getPanes().labelPane.appendChild(this._root);
  100. return this._root;
  101. };
  102. /**
  103. * @override
  104. */
  105. Overlay.prototype.draw = function () {};
  106. return Overlay;
  107. }
  108. BMapCoordSys.create = function (ecModel, api) {
  109. var bmapCoordSys;
  110. var root = api.getDom(); // TODO Dispose
  111. ecModel.eachComponent('bmap', function (bmapModel) {
  112. var painter = api.getZr().painter;
  113. var viewportRoot = painter.getViewportRoot();
  114. if (typeof BMap === 'undefined') {
  115. throw new Error('BMap api is not loaded');
  116. }
  117. Overlay = Overlay || createOverlayCtor();
  118. if (bmapCoordSys) {
  119. throw new Error('Only one bmap component can exist');
  120. }
  121. if (!bmapModel.__bmap) {
  122. // Not support IE8
  123. var bmapRoot = root.querySelector('.ec-extension-bmap');
  124. if (bmapRoot) {
  125. // Reset viewport left and top, which will be changed
  126. // in moving handler in BMapView
  127. viewportRoot.style.left = '0px';
  128. viewportRoot.style.top = '0px';
  129. root.removeChild(bmapRoot);
  130. }
  131. bmapRoot = document.createElement('div');
  132. bmapRoot.style.cssText = 'width:100%;height:100%'; // Not support IE8
  133. bmapRoot.classList.add('ec-extension-bmap');
  134. root.appendChild(bmapRoot);
  135. var bmap = bmapModel.__bmap = new BMap.Map(bmapRoot);
  136. var overlay = new Overlay(viewportRoot);
  137. bmap.addOverlay(overlay); // Override
  138. painter.getViewportRootOffset = function () {
  139. return {
  140. offsetLeft: 0,
  141. offsetTop: 0
  142. };
  143. };
  144. }
  145. var bmap = bmapModel.__bmap; // Set bmap options
  146. // centerAndZoom before layout and render
  147. var center = bmapModel.get('center');
  148. var zoom = bmapModel.get('zoom');
  149. if (center && zoom) {
  150. var pt = new BMap.Point(center[0], center[1]);
  151. bmap.centerAndZoom(pt, zoom);
  152. }
  153. bmapCoordSys = new BMapCoordSys(bmap, api);
  154. bmapCoordSys.setMapOffset(bmapModel.__mapOffset || [0, 0]);
  155. bmapCoordSys.setZoom(zoom);
  156. bmapCoordSys.setCenter(center);
  157. bmapModel.coordinateSystem = bmapCoordSys;
  158. });
  159. ecModel.eachSeries(function (seriesModel) {
  160. if (seriesModel.get('coordinateSystem') === 'bmap') {
  161. seriesModel.coordinateSystem = bmapCoordSys;
  162. }
  163. });
  164. };
  165. var _default = BMapCoordSys;
  166. module.exports = _default;