MapAxis.js 3.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /* *
  2. *
  3. * (c) 2010-2019 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 H from '../parts/Globals.js';
  12. import U from '../parts/Utilities.js';
  13. var pick = U.pick;
  14. import '../parts/Axis.js';
  15. var addEvent = H.addEvent, Axis = H.Axis;
  16. /* eslint-disable no-invalid-this */
  17. // Override to use the extreme coordinates from the SVG shape, not the data
  18. // values
  19. addEvent(Axis, 'getSeriesExtremes', function () {
  20. var xData = [];
  21. // Remove the xData array and cache it locally so that the proceed method
  22. // doesn't use it
  23. if (this.isXAxis) {
  24. this.series.forEach(function (series, i) {
  25. if (series.useMapGeometry) {
  26. xData[i] = series.xData;
  27. series.xData = [];
  28. }
  29. });
  30. this.seriesXData = xData;
  31. }
  32. });
  33. addEvent(Axis, 'afterGetSeriesExtremes', function () {
  34. var xData = this.seriesXData, dataMin, dataMax, useMapGeometry;
  35. // Run extremes logic for map and mapline
  36. if (this.isXAxis) {
  37. dataMin = pick(this.dataMin, Number.MAX_VALUE);
  38. dataMax = pick(this.dataMax, -Number.MAX_VALUE);
  39. this.series.forEach(function (series, i) {
  40. if (series.useMapGeometry) {
  41. dataMin = Math.min(dataMin, pick(series.minX, dataMin));
  42. dataMax = Math.max(dataMax, pick(series.maxX, dataMax));
  43. series.xData = xData[i]; // Reset xData array
  44. useMapGeometry = true;
  45. }
  46. });
  47. if (useMapGeometry) {
  48. this.dataMin = dataMin;
  49. this.dataMax = dataMax;
  50. }
  51. delete this.seriesXData;
  52. }
  53. });
  54. // Override axis translation to make sure the aspect ratio is always kept
  55. addEvent(Axis, 'afterSetAxisTranslation', function () {
  56. var chart = this.chart, mapRatio, plotRatio = chart.plotWidth / chart.plotHeight, adjustedAxisLength, xAxis = chart.xAxis[0], padAxis, fixTo, fixDiff, preserveAspectRatio;
  57. // Check for map-like series
  58. if (this.coll === 'yAxis' && typeof xAxis.transA !== 'undefined') {
  59. this.series.forEach(function (series) {
  60. if (series.preserveAspectRatio) {
  61. preserveAspectRatio = true;
  62. }
  63. });
  64. }
  65. // On Y axis, handle both
  66. if (preserveAspectRatio) {
  67. // Use the same translation for both axes
  68. this.transA = xAxis.transA = Math.min(this.transA, xAxis.transA);
  69. mapRatio = plotRatio / ((xAxis.max - xAxis.min) /
  70. (this.max - this.min));
  71. // What axis to pad to put the map in the middle
  72. padAxis = mapRatio < 1 ? this : xAxis;
  73. // Pad it
  74. adjustedAxisLength =
  75. (padAxis.max - padAxis.min) * padAxis.transA;
  76. padAxis.pixelPadding = padAxis.len - adjustedAxisLength;
  77. padAxis.minPixelPadding = padAxis.pixelPadding / 2;
  78. fixTo = padAxis.fixTo;
  79. if (fixTo) {
  80. fixDiff = fixTo[1] - padAxis.toValue(fixTo[0], true);
  81. fixDiff *= padAxis.transA;
  82. if (Math.abs(fixDiff) > padAxis.minPixelPadding ||
  83. (padAxis.min === padAxis.dataMin &&
  84. padAxis.max === padAxis.dataMax)) { // zooming out again, keep within restricted area
  85. fixDiff = 0;
  86. }
  87. padAxis.minPixelPadding -= fixDiff;
  88. }
  89. }
  90. });
  91. // Override Axis.render in order to delete the fixTo prop
  92. addEvent(Axis, 'render', function () {
  93. this.fixTo = null;
  94. });