BMapCoordSys.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. define(function (require) {
  2. var echarts = require('echarts');
  3. function BMapCoordSys(bmap, api) {
  4. this._bmap = bmap;
  5. this.dimensions = ['lng', 'lat'];
  6. this._mapOffset = [0, 0];
  7. this._api = api;
  8. }
  9. BMapCoordSys.prototype.dimensions = ['lng', 'lat'];
  10. BMapCoordSys.prototype.setMapOffset = function (mapOffset) {
  11. this._mapOffset = mapOffset;
  12. };
  13. BMapCoordSys.prototype.getBMap = function () {
  14. return this._bmap;
  15. };
  16. BMapCoordSys.prototype.dataToPoint = function (data) {
  17. var point = new BMap.Point(data[0], data[1]);
  18. // TODO pointToOverlayPixel is toooooooo slow, cache the transform
  19. var px = this._bmap.pointToOverlayPixel(point);
  20. var mapOffset = this._mapOffset;
  21. return [px.x - mapOffset[0], px.y - mapOffset[1]];
  22. };
  23. BMapCoordSys.prototype.pointToData = function (pt) {
  24. var mapOffset = this._mapOffset;
  25. var pt = this._bmap.overlayPixelToPoint({
  26. x: pt[0] + mapOffset[0],
  27. y: pt[1] + mapOffset[1]
  28. });
  29. return [pt.lng, pt.lat];
  30. };
  31. BMapCoordSys.prototype.getViewRect = function () {
  32. var api = this._api;
  33. return new echarts.graphic.BoundingRect(0, 0, api.getWidth(), api.getHeight());
  34. };
  35. BMapCoordSys.prototype.getRoamTransform = function () {
  36. return echarts.matrix.create();
  37. };
  38. var Overlay;
  39. // For deciding which dimensions to use when creating list data
  40. BMapCoordSys.dimensions = BMapCoordSys.prototype.dimensions;
  41. function createOverlayCtor() {
  42. function Overlay(root) {
  43. this._root = root;
  44. }
  45. Overlay.prototype = new BMap.Overlay();
  46. /**
  47. * 初始化
  48. *
  49. * @param {BMap.Map} map
  50. * @override
  51. */
  52. Overlay.prototype.initialize = function (map) {
  53. map.getPanes().labelPane.appendChild(this._root);
  54. return this._root;
  55. };
  56. /**
  57. * @override
  58. */
  59. Overlay.prototype.draw = function () {};
  60. return Overlay;
  61. }
  62. BMapCoordSys.create = function (ecModel, api) {
  63. var bmapCoordSys;
  64. var root = api.getDom();
  65. // TODO Dispose
  66. ecModel.eachComponent('bmap', function (bmapModel) {
  67. var viewportRoot = api.getZr().painter.getViewportRoot();
  68. if (typeof BMap === 'undefined') {
  69. throw new Error('BMap api is not loaded');
  70. }
  71. Overlay = Overlay || createOverlayCtor();
  72. if (bmapCoordSys) {
  73. throw new Error('Only one bmap component can exist');
  74. }
  75. if (!bmapModel.__bmap) {
  76. // Not support IE8
  77. var bmapRoot = root.querySelector('.ec-extension-bmap');
  78. if (bmapRoot) {
  79. // Reset viewport left and top, which will be changed
  80. // in moving handler in BMapView
  81. viewportRoot.style.left = '0px';
  82. viewportRoot.style.top = '0px';
  83. root.removeChild(bmapRoot);
  84. }
  85. bmapRoot = document.createElement('div');
  86. bmapRoot.style.cssText = 'width:100%;height:100%';
  87. // Not support IE8
  88. bmapRoot.classList.add('ec-extension-bmap');
  89. root.appendChild(bmapRoot);
  90. var bmap = bmapModel.__bmap = new BMap.Map(bmapRoot);
  91. var overlay = new Overlay(viewportRoot);
  92. bmap.addOverlay(overlay);
  93. }
  94. var bmap = bmapModel.__bmap;
  95. // Set bmap options
  96. // centerAndZoom before layout and render
  97. var center = bmapModel.get('center');
  98. var zoom = bmapModel.get('zoom');
  99. if (center && zoom) {
  100. var pt = new BMap.Point(center[0], center[1]);
  101. bmap.centerAndZoom(pt, zoom);
  102. }
  103. bmapCoordSys = new BMapCoordSys(bmap, api);
  104. bmapCoordSys.setMapOffset(bmapModel.__mapOffset || [0, 0]);
  105. bmapModel.coordinateSystem = bmapCoordSys;
  106. });
  107. ecModel.eachSeries(function (seriesModel) {
  108. if (seriesModel.get('coordinateSystem') === 'bmap') {
  109. seriesModel.coordinateSystem = bmapCoordSys;
  110. }
  111. });
  112. };
  113. return BMapCoordSys;
  114. });