geoCreator.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. var _config = require("../../config");
  2. var __DEV__ = _config.__DEV__;
  3. var echarts = require("../../echarts");
  4. var zrUtil = require("zrender/lib/core/util");
  5. var Geo = require("./Geo");
  6. var layout = require("../../util/layout");
  7. var numberUtil = require("../../util/number");
  8. /**
  9. * Resize method bound to the geo
  10. * @param {module:echarts/coord/geo/GeoModel|module:echarts/chart/map/MapModel} geoModel
  11. * @param {module:echarts/ExtensionAPI} api
  12. */
  13. function resizeGeo(geoModel, api) {
  14. var boundingCoords = geoModel.get('boundingCoords');
  15. if (boundingCoords != null) {
  16. var leftTop = boundingCoords[0];
  17. var rightBottom = boundingCoords[1];
  18. if (isNaN(leftTop[0]) || isNaN(leftTop[1]) || isNaN(rightBottom[0]) || isNaN(rightBottom[1])) {} else {
  19. this.setBoundingRect(leftTop[0], leftTop[1], rightBottom[0] - leftTop[0], rightBottom[1] - leftTop[1]);
  20. }
  21. }
  22. var rect = this.getBoundingRect();
  23. var boxLayoutOption;
  24. var center = geoModel.get('layoutCenter');
  25. var size = geoModel.get('layoutSize');
  26. var viewWidth = api.getWidth();
  27. var viewHeight = api.getHeight();
  28. var aspectScale = geoModel.get('aspectScale') || 0.75;
  29. var aspect = rect.width / rect.height * aspectScale;
  30. var useCenterAndSize = false;
  31. if (center && size) {
  32. center = [numberUtil.parsePercent(center[0], viewWidth), numberUtil.parsePercent(center[1], viewHeight)];
  33. size = numberUtil.parsePercent(size, Math.min(viewWidth, viewHeight));
  34. if (!isNaN(center[0]) && !isNaN(center[1]) && !isNaN(size)) {
  35. useCenterAndSize = true;
  36. } else {}
  37. }
  38. var viewRect;
  39. if (useCenterAndSize) {
  40. var viewRect = {};
  41. if (aspect > 1) {
  42. // Width is same with size
  43. viewRect.width = size;
  44. viewRect.height = size / aspect;
  45. } else {
  46. viewRect.height = size;
  47. viewRect.width = size * aspect;
  48. }
  49. viewRect.y = center[1] - viewRect.height / 2;
  50. viewRect.x = center[0] - viewRect.width / 2;
  51. } else {
  52. // Use left/top/width/height
  53. boxLayoutOption = geoModel.getBoxLayoutParams(); // 0.75 rate
  54. boxLayoutOption.aspect = aspect;
  55. viewRect = layout.getLayoutRect(boxLayoutOption, {
  56. width: viewWidth,
  57. height: viewHeight
  58. });
  59. }
  60. this.setViewRect(viewRect.x, viewRect.y, viewRect.width, viewRect.height);
  61. this.setCenter(geoModel.get('center'));
  62. this.setZoom(geoModel.get('zoom'));
  63. }
  64. /**
  65. * @param {module:echarts/coord/Geo} geo
  66. * @param {module:echarts/model/Model} model
  67. * @inner
  68. */
  69. function setGeoCoords(geo, model) {
  70. zrUtil.each(model.get('geoCoord'), function (geoCoord, name) {
  71. geo.addGeoCoord(name, geoCoord);
  72. });
  73. }
  74. var geoCreator = {
  75. // For deciding which dimensions to use when creating list data
  76. dimensions: Geo.prototype.dimensions,
  77. create: function (ecModel, api) {
  78. var geoList = []; // FIXME Create each time may be slow
  79. ecModel.eachComponent('geo', function (geoModel, idx) {
  80. var name = geoModel.get('map');
  81. var mapData = echarts.getMap(name);
  82. var geo = new Geo(name + idx, name, mapData && mapData.geoJson, mapData && mapData.specialAreas, geoModel.get('nameMap'));
  83. geo.zoomLimit = geoModel.get('scaleLimit');
  84. geoList.push(geo);
  85. setGeoCoords(geo, geoModel);
  86. geoModel.coordinateSystem = geo;
  87. geo.model = geoModel; // Inject resize method
  88. geo.resize = resizeGeo;
  89. geo.resize(geoModel, api);
  90. });
  91. ecModel.eachSeries(function (seriesModel) {
  92. var coordSys = seriesModel.get('coordinateSystem');
  93. if (coordSys === 'geo') {
  94. var geoIndex = seriesModel.get('geoIndex') || 0;
  95. seriesModel.coordinateSystem = geoList[geoIndex];
  96. }
  97. }); // If has map series
  98. var mapModelGroupBySeries = {};
  99. ecModel.eachSeriesByType('map', function (seriesModel) {
  100. if (!seriesModel.getHostGeoModel()) {
  101. var mapType = seriesModel.getMapType();
  102. mapModelGroupBySeries[mapType] = mapModelGroupBySeries[mapType] || [];
  103. mapModelGroupBySeries[mapType].push(seriesModel);
  104. }
  105. });
  106. zrUtil.each(mapModelGroupBySeries, function (mapSeries, mapType) {
  107. var mapData = echarts.getMap(mapType);
  108. var nameMapList = zrUtil.map(mapSeries, function (singleMapSeries) {
  109. return singleMapSeries.get('nameMap');
  110. });
  111. var geo = new Geo(mapType, mapType, mapData && mapData.geoJson, mapData && mapData.specialAreas, zrUtil.mergeAll(nameMapList));
  112. geo.zoomLimit = zrUtil.retrieve.apply(null, zrUtil.map(mapSeries, function (singleMapSeries) {
  113. return singleMapSeries.get('scaleLimit');
  114. }));
  115. geoList.push(geo); // Inject resize method
  116. geo.resize = resizeGeo;
  117. geo.resize(mapSeries[0], api);
  118. zrUtil.each(mapSeries, function (singleMapSeries) {
  119. singleMapSeries.coordinateSystem = geo;
  120. setGeoCoords(geo, singleMapSeries);
  121. });
  122. });
  123. return geoList;
  124. },
  125. /**
  126. * Fill given regions array
  127. * @param {Array.<Object>} originRegionArr
  128. * @param {string} mapName
  129. * @param {Object} [nameMap]
  130. * @return {Array}
  131. */
  132. getFilledRegions: function (originRegionArr, mapName, nameMap) {
  133. // Not use the original
  134. var regionsArr = (originRegionArr || []).slice();
  135. nameMap = nameMap || {};
  136. var map = echarts.getMap(mapName);
  137. var geoJson = map && map.geoJson;
  138. if (!geoJson) {
  139. return originRegionArr;
  140. }
  141. var dataNameMap = zrUtil.createHashMap();
  142. var features = geoJson.features;
  143. for (var i = 0; i < regionsArr.length; i++) {
  144. dataNameMap.set(regionsArr[i].name, regionsArr[i]);
  145. }
  146. for (var i = 0; i < features.length; i++) {
  147. var name = features[i].properties.name;
  148. if (!dataNameMap.get(name)) {
  149. if (nameMap.hasOwnProperty(name)) {
  150. name = nameMap[name];
  151. }
  152. regionsArr.push({
  153. name: name
  154. });
  155. }
  156. }
  157. return regionsArr;
  158. }
  159. };
  160. echarts.registerCoordinateSystem('geo', geoCreator);
  161. var _default = geoCreator;
  162. module.exports = _default;