| 
/* 
 | 
* Licensed to the Apache Software Foundation (ASF) under one 
 | 
* or more contributor license agreements.  See the NOTICE file 
 | 
* distributed with this work for additional information 
 | 
* regarding copyright ownership.  The ASF licenses this file 
 | 
* to you under the Apache License, Version 2.0 (the 
 | 
* "License"); you may not use this file except in compliance 
 | 
* with the License.  You may obtain a copy of the License at 
 | 
* 
 | 
*   http://www.apache.org/licenses/LICENSE-2.0 
 | 
* 
 | 
* Unless required by applicable law or agreed to in writing, 
 | 
* software distributed under the License is distributed on an 
 | 
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
 | 
* KIND, either express or implied.  See the License for the 
 | 
* specific language governing permissions and limitations 
 | 
* under the License. 
 | 
*/ 
 | 
  
 | 
  
 | 
/** 
 | 
 * AUTO-GENERATED FILE. DO NOT MODIFY. 
 | 
 */ 
 | 
  
 | 
/* 
 | 
* Licensed to the Apache Software Foundation (ASF) under one 
 | 
* or more contributor license agreements.  See the NOTICE file 
 | 
* distributed with this work for additional information 
 | 
* regarding copyright ownership.  The ASF licenses this file 
 | 
* to you under the Apache License, Version 2.0 (the 
 | 
* "License"); you may not use this file except in compliance 
 | 
* with the License.  You may obtain a copy of the License at 
 | 
* 
 | 
*   http://www.apache.org/licenses/LICENSE-2.0 
 | 
* 
 | 
* Unless required by applicable law or agreed to in writing, 
 | 
* software distributed under the License is distributed on an 
 | 
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
 | 
* KIND, either express or implied.  See the License for the 
 | 
* specific language governing permissions and limitations 
 | 
* under the License. 
 | 
*/ 
 | 
import { __extends } from "tslib"; 
 | 
import * as graphic from '../../util/graphic.js'; 
 | 
import { toggleHoverEmphasis } from '../../util/states.js'; 
 | 
import HeatmapLayer from './HeatmapLayer.js'; 
 | 
import * as zrUtil from 'zrender/lib/core/util.js'; 
 | 
import ChartView from '../../view/Chart.js'; 
 | 
import { isCoordinateSystemType } from '../../coord/CoordinateSystem.js'; 
 | 
import { setLabelStyle, getLabelStatesModels } from '../../label/labelStyle.js'; 
 | 
function getIsInPiecewiseRange(dataExtent, pieceList, selected) { 
 | 
  var dataSpan = dataExtent[1] - dataExtent[0]; 
 | 
  pieceList = zrUtil.map(pieceList, function (piece) { 
 | 
    return { 
 | 
      interval: [(piece.interval[0] - dataExtent[0]) / dataSpan, (piece.interval[1] - dataExtent[0]) / dataSpan] 
 | 
    }; 
 | 
  }); 
 | 
  var len = pieceList.length; 
 | 
  var lastIndex = 0; 
 | 
  return function (val) { 
 | 
    var i; 
 | 
    // Try to find in the location of the last found 
 | 
    for (i = lastIndex; i < len; i++) { 
 | 
      var interval = pieceList[i].interval; 
 | 
      if (interval[0] <= val && val <= interval[1]) { 
 | 
        lastIndex = i; 
 | 
        break; 
 | 
      } 
 | 
    } 
 | 
    if (i === len) { 
 | 
      // Not found, back interation 
 | 
      for (i = lastIndex - 1; i >= 0; i--) { 
 | 
        var interval = pieceList[i].interval; 
 | 
        if (interval[0] <= val && val <= interval[1]) { 
 | 
          lastIndex = i; 
 | 
          break; 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
    return i >= 0 && i < len && selected[i]; 
 | 
  }; 
 | 
} 
 | 
function getIsInContinuousRange(dataExtent, range) { 
 | 
  var dataSpan = dataExtent[1] - dataExtent[0]; 
 | 
  range = [(range[0] - dataExtent[0]) / dataSpan, (range[1] - dataExtent[0]) / dataSpan]; 
 | 
  return function (val) { 
 | 
    return val >= range[0] && val <= range[1]; 
 | 
  }; 
 | 
} 
 | 
function isGeoCoordSys(coordSys) { 
 | 
  var dimensions = coordSys.dimensions; 
 | 
  // Not use coordSys.type === 'geo' because coordSys maybe extended 
 | 
  return dimensions[0] === 'lng' && dimensions[1] === 'lat'; 
 | 
} 
 | 
var HeatmapView = /** @class */function (_super) { 
 | 
  __extends(HeatmapView, _super); 
 | 
  function HeatmapView() { 
 | 
    var _this = _super !== null && _super.apply(this, arguments) || this; 
 | 
    _this.type = HeatmapView.type; 
 | 
    return _this; 
 | 
  } 
 | 
  HeatmapView.prototype.render = function (seriesModel, ecModel, api) { 
 | 
    var visualMapOfThisSeries; 
 | 
    ecModel.eachComponent('visualMap', function (visualMap) { 
 | 
      visualMap.eachTargetSeries(function (targetSeries) { 
 | 
        if (targetSeries === seriesModel) { 
 | 
          visualMapOfThisSeries = visualMap; 
 | 
        } 
 | 
      }); 
 | 
    }); 
 | 
    if (process.env.NODE_ENV !== 'production') { 
 | 
      if (!visualMapOfThisSeries) { 
 | 
        throw new Error('Heatmap must use with visualMap'); 
 | 
      } 
 | 
    } 
 | 
    // Clear previously rendered progressive elements. 
 | 
    this._progressiveEls = null; 
 | 
    this.group.removeAll(); 
 | 
    var coordSys = seriesModel.coordinateSystem; 
 | 
    if (coordSys.type === 'cartesian2d' || coordSys.type === 'calendar') { 
 | 
      this._renderOnCartesianAndCalendar(seriesModel, api, 0, seriesModel.getData().count()); 
 | 
    } else if (isGeoCoordSys(coordSys)) { 
 | 
      this._renderOnGeo(coordSys, seriesModel, visualMapOfThisSeries, api); 
 | 
    } 
 | 
  }; 
 | 
  HeatmapView.prototype.incrementalPrepareRender = function (seriesModel, ecModel, api) { 
 | 
    this.group.removeAll(); 
 | 
  }; 
 | 
  HeatmapView.prototype.incrementalRender = function (params, seriesModel, ecModel, api) { 
 | 
    var coordSys = seriesModel.coordinateSystem; 
 | 
    if (coordSys) { 
 | 
      // geo does not support incremental rendering? 
 | 
      if (isGeoCoordSys(coordSys)) { 
 | 
        this.render(seriesModel, ecModel, api); 
 | 
      } else { 
 | 
        this._progressiveEls = []; 
 | 
        this._renderOnCartesianAndCalendar(seriesModel, api, params.start, params.end, true); 
 | 
      } 
 | 
    } 
 | 
  }; 
 | 
  HeatmapView.prototype.eachRendered = function (cb) { 
 | 
    graphic.traverseElements(this._progressiveEls || this.group, cb); 
 | 
  }; 
 | 
  HeatmapView.prototype._renderOnCartesianAndCalendar = function (seriesModel, api, start, end, incremental) { 
 | 
    var coordSys = seriesModel.coordinateSystem; 
 | 
    var isCartesian2d = isCoordinateSystemType(coordSys, 'cartesian2d'); 
 | 
    var width; 
 | 
    var height; 
 | 
    var xAxisExtent; 
 | 
    var yAxisExtent; 
 | 
    if (isCartesian2d) { 
 | 
      var xAxis = coordSys.getAxis('x'); 
 | 
      var yAxis = coordSys.getAxis('y'); 
 | 
      if (process.env.NODE_ENV !== 'production') { 
 | 
        if (!(xAxis.type === 'category' && yAxis.type === 'category')) { 
 | 
          throw new Error('Heatmap on cartesian must have two category axes'); 
 | 
        } 
 | 
        if (!(xAxis.onBand && yAxis.onBand)) { 
 | 
          throw new Error('Heatmap on cartesian must have two axes with boundaryGap true'); 
 | 
        } 
 | 
      } 
 | 
      // add 0.5px to avoid the gaps 
 | 
      width = xAxis.getBandWidth() + .5; 
 | 
      height = yAxis.getBandWidth() + .5; 
 | 
      xAxisExtent = xAxis.scale.getExtent(); 
 | 
      yAxisExtent = yAxis.scale.getExtent(); 
 | 
    } 
 | 
    var group = this.group; 
 | 
    var data = seriesModel.getData(); 
 | 
    var emphasisStyle = seriesModel.getModel(['emphasis', 'itemStyle']).getItemStyle(); 
 | 
    var blurStyle = seriesModel.getModel(['blur', 'itemStyle']).getItemStyle(); 
 | 
    var selectStyle = seriesModel.getModel(['select', 'itemStyle']).getItemStyle(); 
 | 
    var borderRadius = seriesModel.get(['itemStyle', 'borderRadius']); 
 | 
    var labelStatesModels = getLabelStatesModels(seriesModel); 
 | 
    var emphasisModel = seriesModel.getModel('emphasis'); 
 | 
    var focus = emphasisModel.get('focus'); 
 | 
    var blurScope = emphasisModel.get('blurScope'); 
 | 
    var emphasisDisabled = emphasisModel.get('disabled'); 
 | 
    var dataDims = isCartesian2d ? [data.mapDimension('x'), data.mapDimension('y'), data.mapDimension('value')] : [data.mapDimension('time'), data.mapDimension('value')]; 
 | 
    for (var idx = start; idx < end; idx++) { 
 | 
      var rect = void 0; 
 | 
      var style = data.getItemVisual(idx, 'style'); 
 | 
      if (isCartesian2d) { 
 | 
        var dataDimX = data.get(dataDims[0], idx); 
 | 
        var dataDimY = data.get(dataDims[1], idx); 
 | 
        // Ignore empty data and out of extent data 
 | 
        if (isNaN(data.get(dataDims[2], idx)) || isNaN(dataDimX) || isNaN(dataDimY) || dataDimX < xAxisExtent[0] || dataDimX > xAxisExtent[1] || dataDimY < yAxisExtent[0] || dataDimY > yAxisExtent[1]) { 
 | 
          continue; 
 | 
        } 
 | 
        var point = coordSys.dataToPoint([dataDimX, dataDimY]); 
 | 
        rect = new graphic.Rect({ 
 | 
          shape: { 
 | 
            x: point[0] - width / 2, 
 | 
            y: point[1] - height / 2, 
 | 
            width: width, 
 | 
            height: height 
 | 
          }, 
 | 
          style: style 
 | 
        }); 
 | 
      } else { 
 | 
        // Ignore empty data 
 | 
        if (isNaN(data.get(dataDims[1], idx))) { 
 | 
          continue; 
 | 
        } 
 | 
        rect = new graphic.Rect({ 
 | 
          z2: 1, 
 | 
          shape: coordSys.dataToRect([data.get(dataDims[0], idx)]).contentShape, 
 | 
          style: style 
 | 
        }); 
 | 
      } 
 | 
      // Optimization for large dataset 
 | 
      if (data.hasItemOption) { 
 | 
        var itemModel = data.getItemModel(idx); 
 | 
        var emphasisModel_1 = itemModel.getModel('emphasis'); 
 | 
        emphasisStyle = emphasisModel_1.getModel('itemStyle').getItemStyle(); 
 | 
        blurStyle = itemModel.getModel(['blur', 'itemStyle']).getItemStyle(); 
 | 
        selectStyle = itemModel.getModel(['select', 'itemStyle']).getItemStyle(); 
 | 
        // Each item value struct in the data would be firstly 
 | 
        // { 
 | 
        //     itemStyle: { borderRadius: [30, 30] }, 
 | 
        //     value: [2022, 02, 22] 
 | 
        // } 
 | 
        borderRadius = itemModel.get(['itemStyle', 'borderRadius']); 
 | 
        focus = emphasisModel_1.get('focus'); 
 | 
        blurScope = emphasisModel_1.get('blurScope'); 
 | 
        emphasisDisabled = emphasisModel_1.get('disabled'); 
 | 
        labelStatesModels = getLabelStatesModels(itemModel); 
 | 
      } 
 | 
      rect.shape.r = borderRadius; 
 | 
      var rawValue = seriesModel.getRawValue(idx); 
 | 
      var defaultText = '-'; 
 | 
      if (rawValue && rawValue[2] != null) { 
 | 
        defaultText = rawValue[2] + ''; 
 | 
      } 
 | 
      setLabelStyle(rect, labelStatesModels, { 
 | 
        labelFetcher: seriesModel, 
 | 
        labelDataIndex: idx, 
 | 
        defaultOpacity: style.opacity, 
 | 
        defaultText: defaultText 
 | 
      }); 
 | 
      rect.ensureState('emphasis').style = emphasisStyle; 
 | 
      rect.ensureState('blur').style = blurStyle; 
 | 
      rect.ensureState('select').style = selectStyle; 
 | 
      toggleHoverEmphasis(rect, focus, blurScope, emphasisDisabled); 
 | 
      rect.incremental = incremental; 
 | 
      // PENDING 
 | 
      if (incremental) { 
 | 
        // Rect must use hover layer if it's incremental. 
 | 
        rect.states.emphasis.hoverLayer = true; 
 | 
      } 
 | 
      group.add(rect); 
 | 
      data.setItemGraphicEl(idx, rect); 
 | 
      if (this._progressiveEls) { 
 | 
        this._progressiveEls.push(rect); 
 | 
      } 
 | 
    } 
 | 
  }; 
 | 
  HeatmapView.prototype._renderOnGeo = function (geo, seriesModel, visualMapModel, api) { 
 | 
    var inRangeVisuals = visualMapModel.targetVisuals.inRange; 
 | 
    var outOfRangeVisuals = visualMapModel.targetVisuals.outOfRange; 
 | 
    // if (!visualMapping) { 
 | 
    //     throw new Error('Data range must have color visuals'); 
 | 
    // } 
 | 
    var data = seriesModel.getData(); 
 | 
    var hmLayer = this._hmLayer || this._hmLayer || new HeatmapLayer(); 
 | 
    hmLayer.blurSize = seriesModel.get('blurSize'); 
 | 
    hmLayer.pointSize = seriesModel.get('pointSize'); 
 | 
    hmLayer.minOpacity = seriesModel.get('minOpacity'); 
 | 
    hmLayer.maxOpacity = seriesModel.get('maxOpacity'); 
 | 
    var rect = geo.getViewRect().clone(); 
 | 
    var roamTransform = geo.getRoamTransform(); 
 | 
    rect.applyTransform(roamTransform); 
 | 
    // Clamp on viewport 
 | 
    var x = Math.max(rect.x, 0); 
 | 
    var y = Math.max(rect.y, 0); 
 | 
    var x2 = Math.min(rect.width + rect.x, api.getWidth()); 
 | 
    var y2 = Math.min(rect.height + rect.y, api.getHeight()); 
 | 
    var width = x2 - x; 
 | 
    var height = y2 - y; 
 | 
    var dims = [data.mapDimension('lng'), data.mapDimension('lat'), data.mapDimension('value')]; 
 | 
    var points = data.mapArray(dims, function (lng, lat, value) { 
 | 
      var pt = geo.dataToPoint([lng, lat]); 
 | 
      pt[0] -= x; 
 | 
      pt[1] -= y; 
 | 
      pt.push(value); 
 | 
      return pt; 
 | 
    }); 
 | 
    var dataExtent = visualMapModel.getExtent(); 
 | 
    var isInRange = visualMapModel.type === 'visualMap.continuous' ? getIsInContinuousRange(dataExtent, visualMapModel.option.range) : getIsInPiecewiseRange(dataExtent, visualMapModel.getPieceList(), visualMapModel.option.selected); 
 | 
    hmLayer.update(points, width, height, inRangeVisuals.color.getNormalizer(), { 
 | 
      inRange: inRangeVisuals.color.getColorMapper(), 
 | 
      outOfRange: outOfRangeVisuals.color.getColorMapper() 
 | 
    }, isInRange); 
 | 
    var img = new graphic.Image({ 
 | 
      style: { 
 | 
        width: width, 
 | 
        height: height, 
 | 
        x: x, 
 | 
        y: y, 
 | 
        image: hmLayer.canvas 
 | 
      }, 
 | 
      silent: true 
 | 
    }); 
 | 
    this.group.add(img); 
 | 
  }; 
 | 
  HeatmapView.type = 'heatmap'; 
 | 
  return HeatmapView; 
 | 
}(ChartView); 
 | 
export default HeatmapView; 
 |