123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310 |
- /*
- * 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;
|