@@ -21,6 +21,8 @@ import { StageHandler, SeriesOption, SeriesSamplingOptionMixin } from '../util/t
2121import { Dictionary } from 'zrender/src/core/types' ;
2222import SeriesModel from '../model/Series' ;
2323import { isFunction , isString } from 'zrender/src/core/util' ;
24+ import SeriesData from '../data/SeriesData' ;
25+ import { CoordinateSystem } from '../coord/CoordinateSystem' ;
2426
2527
2628type Sampler = ( frame : ArrayLike < number > ) => number ;
@@ -72,6 +74,47 @@ const indexSampler = function (frame: ArrayLike<number>) {
7274 return Math . round ( frame . length / 2 ) ;
7375} ;
7476
77+ export function doDataSampling (
78+ data : SeriesData ,
79+ sampling : SeriesSamplingOptionMixin [ 'sampling' ] ,
80+ coordSys : CoordinateSystem ,
81+ dpr : number
82+ ) {
83+ const count = data . count ( ) ;
84+ // Only cartesian2d support down sampling. Disable it when there is few data.
85+ if ( count > 10 && coordSys . type === 'cartesian2d' && sampling ) {
86+ const baseAxis = coordSys . getBaseAxis ( ) ;
87+ const valueAxis = coordSys . getOtherAxis ( baseAxis ) ;
88+ const extent = baseAxis . getExtent ( ) ;
89+ // Coordinste system has been resized
90+ const size = Math . abs ( extent [ 1 ] - extent [ 0 ] ) * ( dpr || 1 ) ;
91+ const rate = Math . round ( count / size ) ;
92+
93+ if ( isFinite ( rate ) && rate > 1 ) {
94+ if ( sampling === 'lttb' ) {
95+ return data . lttbDownSample ( data . mapDimension ( valueAxis . dim ) , 1 / rate ) ;
96+ }
97+ else if ( sampling === 'minmax' ) {
98+ return data . minmaxDownSample ( data . mapDimension ( valueAxis . dim ) , 1 / rate ) ;
99+ }
100+ let sampler ;
101+ if ( isString ( sampling ) ) {
102+ sampler = samplers [ sampling ] ;
103+ }
104+ else if ( isFunction ( sampling ) ) {
105+ sampler = sampling ;
106+ }
107+ if ( sampler ) {
108+ // Only support sample the first dim mapped from value axis.
109+ return data . downSample (
110+ data . mapDimension ( valueAxis . dim ) , 1 / rate , sampler , indexSampler
111+ ) ;
112+ }
113+ }
114+ }
115+ return null ;
116+ }
117+
75118export default function dataSample ( seriesType : string ) : StageHandler {
76119 return {
77120
@@ -84,38 +127,10 @@ export default function dataSample(seriesType: string): StageHandler {
84127 const data = seriesModel . getData ( ) ;
85128 const sampling = seriesModel . get ( 'sampling' ) ;
86129 const coordSys = seriesModel . coordinateSystem ;
87- const count = data . count ( ) ;
88- // Only cartesian2d support down sampling. Disable it when there is few data.
89- if ( count > 10 && coordSys . type === 'cartesian2d' && sampling ) {
90- const baseAxis = coordSys . getBaseAxis ( ) ;
91- const valueAxis = coordSys . getOtherAxis ( baseAxis ) ;
92- const extent = baseAxis . getExtent ( ) ;
93- const dpr = api . getDevicePixelRatio ( ) ;
94- // Coordinste system has been resized
95- const size = Math . abs ( extent [ 1 ] - extent [ 0 ] ) * ( dpr || 1 ) ;
96- const rate = Math . round ( count / size ) ;
97-
98- if ( isFinite ( rate ) && rate > 1 ) {
99- if ( sampling === 'lttb' ) {
100- seriesModel . setData ( data . lttbDownSample ( data . mapDimension ( valueAxis . dim ) , 1 / rate ) ) ;
101- }
102- else if ( sampling === 'minmax' ) {
103- seriesModel . setData ( data . minmaxDownSample ( data . mapDimension ( valueAxis . dim ) , 1 / rate ) ) ;
104- }
105- let sampler ;
106- if ( isString ( sampling ) ) {
107- sampler = samplers [ sampling ] ;
108- }
109- else if ( isFunction ( sampling ) ) {
110- sampler = sampling ;
111- }
112- if ( sampler ) {
113- // Only support sample the first dim mapped from value axis.
114- seriesModel . setData ( data . downSample (
115- data . mapDimension ( valueAxis . dim ) , 1 / rate , sampler , indexSampler
116- ) ) ;
117- }
118- }
130+ const dpr = api . getDevicePixelRatio ( ) ;
131+ const resampled = doDataSampling ( data , sampling , coordSys , dpr ) ;
132+ if ( resampled ) {
133+ seriesModel . setData ( resampled ) ;
119134 }
120135 }
121136 } ;
0 commit comments