MapAxis.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. /* *
  2. *
  3. * (c) 2010-2020 Torstein Honsi
  4. *
  5. * License: www.highcharts.com/license
  6. *
  7. * !!!!!!! SOURCE GETS TRANSPILED BY TYPESCRIPT. EDIT TS FILE ONLY. !!!!!!!
  8. *
  9. * */
  10. 'use strict';
  11. import Axis from './Axis.js';
  12. import U from '../Utilities.js';
  13. var addEvent = U.addEvent, pick = U.pick;
  14. /**
  15. * Map support for axes.
  16. * @private
  17. * @class
  18. */
  19. var MapAxisAdditions = /** @class */ (function () {
  20. /* *
  21. *
  22. * Constructors
  23. *
  24. * */
  25. function MapAxisAdditions(axis) {
  26. this.axis = axis;
  27. }
  28. return MapAxisAdditions;
  29. }());
  30. /**
  31. * Axis with map support.
  32. * @private
  33. * @class
  34. */
  35. var MapAxis = /** @class */ (function () {
  36. function MapAxis() {
  37. }
  38. /**
  39. * Extends axes with map support.
  40. * @private
  41. *
  42. * @param {Highcharts.Axis} AxisClass
  43. * Axis class to extend.
  44. */
  45. MapAxis.compose = function (AxisClass) {
  46. AxisClass.keepProps.push('mapAxis');
  47. /* eslint-disable no-invalid-this */
  48. addEvent(AxisClass, 'init', function () {
  49. var axis = this;
  50. if (!axis.mapAxis) {
  51. axis.mapAxis = new MapAxisAdditions(axis);
  52. }
  53. });
  54. // Override to use the extreme coordinates from the SVG shape, not the
  55. // data values
  56. addEvent(AxisClass, 'getSeriesExtremes', function () {
  57. if (!this.mapAxis) {
  58. return;
  59. }
  60. var axis = this;
  61. var xData = [];
  62. // Remove the xData array and cache it locally so that the proceed
  63. // method doesn't use it
  64. if (axis.isXAxis) {
  65. axis.series.forEach(function (series, i) {
  66. if (series.useMapGeometry) {
  67. xData[i] = series.xData;
  68. series.xData = [];
  69. }
  70. });
  71. axis.mapAxis.seriesXData = xData;
  72. }
  73. });
  74. addEvent(AxisClass, 'afterGetSeriesExtremes', function () {
  75. if (!this.mapAxis) {
  76. return;
  77. }
  78. var axis = this;
  79. var xData = axis.mapAxis.seriesXData || [];
  80. var dataMin, dataMax, useMapGeometry;
  81. // Run extremes logic for map and mapline
  82. if (axis.isXAxis) {
  83. dataMin = pick(axis.dataMin, Number.MAX_VALUE);
  84. dataMax = pick(axis.dataMax, -Number.MAX_VALUE);
  85. axis.series.forEach(function (series, i) {
  86. if (series.useMapGeometry) {
  87. dataMin = Math.min(dataMin, pick(series.minX, dataMin));
  88. dataMax = Math.max(dataMax, pick(series.maxX, dataMax));
  89. series.xData = xData[i]; // Reset xData array
  90. useMapGeometry = true;
  91. }
  92. });
  93. if (useMapGeometry) {
  94. axis.dataMin = dataMin;
  95. axis.dataMax = dataMax;
  96. }
  97. axis.mapAxis.seriesXData = void 0;
  98. }
  99. });
  100. // Override axis translation to make sure the aspect ratio is always
  101. // kept
  102. addEvent(AxisClass, 'afterSetAxisTranslation', function () {
  103. if (!this.mapAxis) {
  104. return;
  105. }
  106. var axis = this;
  107. var chart = axis.chart;
  108. var plotRatio = chart.plotWidth / chart.plotHeight;
  109. var xAxis = chart.xAxis[0];
  110. var mapRatio, adjustedAxisLength, padAxis, fixTo, fixDiff, preserveAspectRatio;
  111. // Check for map-like series
  112. if (axis.coll === 'yAxis' && typeof xAxis.transA !== 'undefined') {
  113. axis.series.forEach(function (series) {
  114. if (series.preserveAspectRatio) {
  115. preserveAspectRatio = true;
  116. }
  117. });
  118. }
  119. // On Y axis, handle both
  120. if (preserveAspectRatio) {
  121. // Use the same translation for both axes
  122. axis.transA = xAxis.transA = Math.min(axis.transA, xAxis.transA);
  123. mapRatio = plotRatio / ((xAxis.max - xAxis.min) /
  124. (axis.max - axis.min));
  125. // What axis to pad to put the map in the middle
  126. padAxis = mapRatio < 1 ? axis : xAxis;
  127. // Pad it
  128. adjustedAxisLength =
  129. (padAxis.max - padAxis.min) * padAxis.transA;
  130. padAxis.mapAxis.pixelPadding = padAxis.len - adjustedAxisLength;
  131. padAxis.minPixelPadding = padAxis.mapAxis.pixelPadding / 2;
  132. fixTo = padAxis.mapAxis.fixTo;
  133. if (fixTo) {
  134. fixDiff = fixTo[1] - padAxis.toValue(fixTo[0], true);
  135. fixDiff *= padAxis.transA;
  136. if (Math.abs(fixDiff) > padAxis.minPixelPadding ||
  137. (padAxis.min === padAxis.dataMin &&
  138. padAxis.max === padAxis.dataMax)) { // zooming out again, keep within restricted area
  139. fixDiff = 0;
  140. }
  141. padAxis.minPixelPadding -= fixDiff;
  142. }
  143. }
  144. });
  145. // Override Axis.render in order to delete the fixTo prop
  146. addEvent(AxisClass, 'render', function () {
  147. var axis = this;
  148. if (axis.mapAxis) {
  149. axis.mapAxis.fixTo = void 0;
  150. }
  151. });
  152. /* eslint-enable no-invalid-this */
  153. };
  154. return MapAxis;
  155. }());
  156. MapAxis.compose(Axis); // @todo move to factory functions
  157. export default MapAxis;