提交 cdbcd466 编写于 作者: S sushuang

Merge branch 'next' of https://github.com/100pah/echarts into next

# Conflicts:
#	src/chart/helper/createListFromArray.js
...@@ -3,6 +3,8 @@ import SymbolDraw from '../helper/SymbolDraw'; ...@@ -3,6 +3,8 @@ import SymbolDraw from '../helper/SymbolDraw';
import EffectSymbol from '../helper/EffectSymbol'; import EffectSymbol from '../helper/EffectSymbol';
import * as matrix from 'zrender/src/core/matrix'; import * as matrix from 'zrender/src/core/matrix';
import pointsLayout from '../../layout/points';
export default echarts.extendChartView({ export default echarts.extendChartView({
type: 'effectScatter', type: 'effectScatter',
...@@ -12,8 +14,6 @@ export default echarts.extendChartView({ ...@@ -12,8 +14,6 @@ export default echarts.extendChartView({
}, },
render: function (seriesModel, ecModel, api) { render: function (seriesModel, ecModel, api) {
this._removeRoamTransformInPoints(seriesModel);
var data = seriesModel.getData(); var data = seriesModel.getData();
var effectSymbolDraw = this._symbolDraw; var effectSymbolDraw = this._symbolDraw;
effectSymbolDraw.updateData(data); effectSymbolDraw.updateData(data);
...@@ -21,18 +21,16 @@ export default echarts.extendChartView({ ...@@ -21,18 +21,16 @@ export default echarts.extendChartView({
}, },
updateTransform: function (seriesModel, ecModel, api) { updateTransform: function (seriesModel, ecModel, api) {
var coordSys = seriesModel.coordinateSystem; var data = seriesModel.getData();
// Must mark group dirty and make sure the incremental layer will be cleared
// PENDING
this.group.dirty(); this.group.dirty();
if (coordSys.getRoamTransform) {
this._updateGroupTransform(seriesModel); var res = pointsLayout().reset(seriesModel);
} if (res.progress) {
else { res.progress({ start: 0, end: data.count() }, seriesModel);
return {
update: true
};
} }
this._symbolDraw.updateLayout(data);
}, },
_updateGroupTransform: function (seriesModel) { _updateGroupTransform: function (seriesModel) {
...@@ -43,17 +41,6 @@ export default echarts.extendChartView({ ...@@ -43,17 +41,6 @@ export default echarts.extendChartView({
} }
}, },
_removeRoamTransformInPoints: function (seriesModel) {
var coordSys = seriesModel.coordinateSystem;
if (coordSys && coordSys.removeRoamTransformInPoint) {
var data = seriesModel.getData();
data.each(function (i) {
var pt = data.getItemLayout(i);
coordSys.removeRoamTransformInPoint(pt);
});
}
},
remove: function (ecModel, api) { remove: function (ecModel, api) {
this._symbolDraw && this._symbolDraw.remove(api); this._symbolDraw && this._symbolDraw.remove(api);
}, },
......
...@@ -153,7 +153,7 @@ export default echarts.extendChartView({ ...@@ -153,7 +153,7 @@ export default echarts.extendChartView({
if (coordSysType === 'cartesian2d') { if (coordSysType === 'cartesian2d') {
// Ignore empty data // Ignore empty data
if (isNaN(data.get(dataDims[2], idx))) { if (isNaN(data.get(dataDims[2], idx))) {
return; continue;
} }
var point = coordSys.dataToPoint([ var point = coordSys.dataToPoint([
...@@ -177,7 +177,7 @@ export default echarts.extendChartView({ ...@@ -177,7 +177,7 @@ export default echarts.extendChartView({
else { else {
// Ignore empty data // Ignore empty data
if (isNaN(data.get(dataDims[1], idx))) { if (isNaN(data.get(dataDims[1], idx))) {
return; continue;
} }
rect = new graphic.Rect({ rect = new graphic.Rect({
......
...@@ -127,6 +127,19 @@ largeSymbolProto.updateData = function (data) { ...@@ -127,6 +127,19 @@ largeSymbolProto.updateData = function (data) {
this._incremental = null; this._incremental = null;
}; };
largeSymbolProto.updateLayout = function (data) {
if (this._incremental) {
return;
}
var points = data.getLayout('symbolPoints');
this.group.eachChild(function (child) {
var len = (child.endIndex - child.startIndex) * 2;
var byteOffset = child.startIndex * 4 * 2;
child.setShape('points', new Float32Array(points.buffer, byteOffset, len));
});
};
largeSymbolProto.incrementalPrepareUpdate = function (data) { largeSymbolProto.incrementalPrepareUpdate = function (data) {
this.group.removeAll(); this.group.removeAll();
...@@ -155,10 +168,11 @@ largeSymbolProto.incrementalUpdate = function (taskParams, data) { ...@@ -155,10 +168,11 @@ largeSymbolProto.incrementalUpdate = function (taskParams, data) {
else { else {
symbolEl = new LargeSymbolPath({ symbolEl = new LargeSymbolPath({
rectHover: true, rectHover: true,
cursor: 'default' cursor: 'default',
startIndex: taskParams.start,
endIndex: taskParams.end
}); });
symbolEl.incremental = true; symbolEl.incremental = true;
symbolEl.__startIndex = taskParams.start;
this.group.add(symbolEl); this.group.add(symbolEl);
} }
...@@ -210,7 +224,7 @@ largeSymbolProto._setCommon = function (symbolEl, data, isIncremental) { ...@@ -210,7 +224,7 @@ largeSymbolProto._setCommon = function (symbolEl, data, isIncremental) {
var dataIndex = symbolEl.findDataIndex(e.offsetX, e.offsetY); var dataIndex = symbolEl.findDataIndex(e.offsetX, e.offsetY);
if (dataIndex >= 0) { if (dataIndex >= 0) {
// Provide dataIndex for tooltip // Provide dataIndex for tooltip
symbolEl.dataIndex = dataIndex + symbolEl.__startIndex; symbolEl.dataIndex = dataIndex + symbolEl.startIndex;
} }
}); });
} }
......
import * as echarts from '../echarts'; import * as echarts from '../echarts';
import * as zrUtil from 'zrender/src/core/util';
import './scatter/ScatterSeries'; import './scatter/ScatterSeries';
import './scatter/ScatterView'; import './scatter/ScatterView';
// import './scatter/StreamScatterSeries';
// import './scatter/StreamScatterView';
import visualSymbol from '../visual/symbol'; import visualSymbol from '../visual/symbol';
import layoutPoints from '../layout/points'; import layoutPoints from '../layout/points';
...@@ -15,5 +13,23 @@ import '../component/gridSimple'; ...@@ -15,5 +13,23 @@ import '../component/gridSimple';
echarts.registerVisual(visualSymbol('scatter', 'circle')); echarts.registerVisual(visualSymbol('scatter', 'circle'));
echarts.registerLayout(layoutPoints('scatter')); echarts.registerLayout(layoutPoints('scatter'));
// echarts.registerVisual(zrUtil.curry(visualSymbol, 'streamScatter', 'circle', null)); // echarts.registerProcessor(function (ecModel, api) {
// echarts.registerLayout(zrUtil.curry(layoutPoints, 'streamScatter')); // ecModel.eachSeriesByType('scatter', function (seriesModel) {
// var data = seriesModel.getData();
// var coordSys = seriesModel.coordinateSystem;
// if (coordSys.type !== 'geo') {
// return;
// }
// var startPt = coordSys.pointToData([0, 0]);
// var endPt = coordSys.pointToData([api.getWidth(), api.getHeight()]);
// var dims = zrUtil.map(coordSys.dimensions, function (dim) {
// return seriesModel.coordDimToDataDim(dim)[0];
// });
// var range = {};
// range[dims[0]] = [Math.min(startPt[0], endPt[0]), Math.max(startPt[0], endPt[0])];
// range[dims[1]] = [Math.min(startPt[1], endPt[1]), Math.max(startPt[1], endPt[1])];
// data.selectRange(range);
// });
// });
\ No newline at end of file
...@@ -3,14 +3,14 @@ import SymbolDraw from '../helper/SymbolDraw'; ...@@ -3,14 +3,14 @@ import SymbolDraw from '../helper/SymbolDraw';
import LargeSymbolDraw from '../helper/LargeSymbolDraw'; import LargeSymbolDraw from '../helper/LargeSymbolDraw';
import * as matrix from 'zrender/src/core/matrix'; import * as matrix from 'zrender/src/core/matrix';
import pointsLayout from '../../layout/points';
echarts.extendChartView({ echarts.extendChartView({
type: 'scatter', type: 'scatter',
render: function (seriesModel, ecModel, api) { render: function (seriesModel, ecModel, api) {
var data = seriesModel.getData(); var data = seriesModel.getData();
this._removeRoamTransformInPoints(seriesModel, 0, data.count());
this._updateGroupTransform(seriesModel);
var symbolDraw = this._updateSymbolDraw(data, seriesModel); var symbolDraw = this._updateSymbolDraw(data, seriesModel);
symbolDraw.updateData(data); symbolDraw.updateData(data);
...@@ -19,8 +19,6 @@ echarts.extendChartView({ ...@@ -19,8 +19,6 @@ echarts.extendChartView({
}, },
incrementalPrepareRender: function (seriesModel, ecModel, api) { incrementalPrepareRender: function (seriesModel, ecModel, api) {
this._updateGroupTransform(seriesModel);
var data = seriesModel.getData(); var data = seriesModel.getData();
var symbolDraw = this._updateSymbolDraw(data, seriesModel); var symbolDraw = this._updateSymbolDraw(data, seriesModel);
...@@ -30,61 +28,29 @@ echarts.extendChartView({ ...@@ -30,61 +28,29 @@ echarts.extendChartView({
}, },
incrementalRender: function (taskParams, seriesModel, ecModel) { incrementalRender: function (taskParams, seriesModel, ecModel) {
this._removeRoamTransformInPoints(seriesModel, taskParams.start, taskParams.end);
this._symbolDraw.incrementalUpdate(taskParams, seriesModel.getData()); this._symbolDraw.incrementalUpdate(taskParams, seriesModel.getData());
this._finished = taskParams.end === seriesModel.getData().count(); this._finished = taskParams.end === seriesModel.getData().count();
}, },
updateTransform: function (seriesModel, ecModel, api) { updateTransform: function (seriesModel, ecModel, api) {
var coordSys = seriesModel.coordinateSystem; var data = seriesModel.getData();
var update = true;
// Must mark group dirty and make sure the incremental layer will be cleared // Must mark group dirty and make sure the incremental layer will be cleared
// PENDING // PENDING
this.group.dirty(); this.group.dirty();
if (coordSys.getRoamTransform) {
update = false;
this._updateGroupTransform(seriesModel);
}
if (update || !this._finished || !this._symbolDraw.isPersistent()) { if (!this._finished || data.count() > 2e5 || !this._symbolDraw.isPersistent()) {
return { return {
update: true update: true
}; };
} }
}, else {
var res = pointsLayout().reset(seriesModel);
_updateGroupTransform: function (seriesModel) { if (res.progress) {
var coordSys = seriesModel.coordinateSystem; res.progress({ start: 0, end: data.count() }, seriesModel);
if (coordSys && coordSys.getRoamTransform) {
this.group.transform = matrix.clone(coordSys.getRoamTransform());
this.group.decomposeTransform();
}
},
_removeRoamTransformInPoints: function (seriesModel, start, end) {
var coordSys = seriesModel.coordinateSystem;
if (coordSys && coordSys.removeRoamTransformInPoint) {
var data = seriesModel.getData();
var pt = [];
if (seriesModel.pipelineContext.large) {
var points = data.getLayout('symbolPoints');
if (points) {
for (var i = 0; i < points.length; i += 2) {
pt[0] = points[i];
pt[1] = points[i + 1];
coordSys.removeRoamTransformInPoint(pt);
points[i] = pt[0];
points[i + 1] = pt[1];
}
}
}
else {
for (var i = start; i < end; i++) {
var pt = data.getItemLayout(i);
coordSys.removeRoamTransformInPoint(pt);
}
} }
this._symbolDraw.updateLayout(data);
} }
}, },
......
...@@ -163,12 +163,6 @@ View.prototype = { ...@@ -163,12 +163,6 @@ View.prototype = {
return this._roamTransformable.getLocalTransform(); return this._roamTransformable.getLocalTransform();
}, },
removeRoamTransformInPoint: function (pt) {
if (this._roamTransformable.invTransform) {
vector.applyTransform(pt, pt, this._roamTransformable.invTransform);
}
},
/** /**
* Remove roam * Remove roam
*/ */
......
...@@ -41,7 +41,7 @@ function cloneChunk(originalChunk) { ...@@ -41,7 +41,7 @@ function cloneChunk(originalChunk) {
var TRANSFERABLE_PROPERTIES = [ var TRANSFERABLE_PROPERTIES = [
'stackedOn', 'hasItemOption', '_nameList', '_idList', 'stackedOn', 'hasItemOption', '_nameList', '_idList',
'_rawData', '_rawExtent', '_chunkSize', '_dimValueGetter', '_count' '_rawData', '_rawExtent', '_chunkSize', '_chunkCount', '_dimValueGetter', '_count'
]; ];
function transferProperties(a, b) { function transferProperties(a, b) {
...@@ -82,10 +82,13 @@ function DefaultDataProvider(dataArray, dimSize) { ...@@ -82,10 +82,13 @@ function DefaultDataProvider(dataArray, dimSize) {
zrUtil.extend(this, methods); zrUtil.extend(this, methods);
} }
var providerProto = DefaultDataProvider.prototype;
// If data is pure without style configuration // If data is pure without style configuration
DefaultDataProvider.prototype.pure = false; providerProto.pure = false;
// If data is persistent and will not be released after use. // If data is persistent and will not be released after use.
DefaultDataProvider.prototype.persistent = true; providerProto.persistent = true;
// If data is isTypedArray.
providerProto.isTypedArray = false;
var normalProviderMethods = { var normalProviderMethods = {
...@@ -109,6 +112,8 @@ var typedArrayProviderMethods = { ...@@ -109,6 +112,8 @@ var typedArrayProviderMethods = {
pure: true, pure: true,
isTypedArray: true,
count: function () { count: function () {
return this._array ? (this._array.length / this._dimSize) : 0; return this._array ? (this._array.length / this._dimSize) : 0;
}, },
...@@ -562,7 +567,7 @@ listProto._initDataFromProvider = function (start, end) { ...@@ -562,7 +567,7 @@ listProto._initDataFromProvider = function (start, end) {
nameList[idx] = name; nameList[idx] = name;
// Try using the id in option // Try using the id in option
var id = dataItem && dataItem.id; var id = dataItem == null ? null : dataItem.id;
if (id == null && name != null) { if (id == null && name != null) {
// Use name as id and add counter to avoid same name // Use name as id and add counter to avoid same name
...@@ -583,6 +588,9 @@ listProto._initDataFromProvider = function (start, end) { ...@@ -583,6 +588,9 @@ listProto._initDataFromProvider = function (start, end) {
} }
this._count = end; this._count = end;
// Reset data extent
this._extent = {};
}; };
/** /**
...@@ -614,7 +622,7 @@ listProto.getIndices = function () { ...@@ -614,7 +622,7 @@ listProto.getIndices = function () {
* @return {number} * @return {number}
*/ */
listProto.get = function (dim, idx, stack) { listProto.get = function (dim, idx, stack) {
if (idx < 0 || idx >= this._count) { if (!(idx >= 0 && idx < this._count)) {
return NaN; return NaN;
} }
var storage = this._storage; var storage = this._storage;
...@@ -716,23 +724,20 @@ listProto.getDataExtent = function (dim, stack) { ...@@ -716,23 +724,20 @@ listProto.getDataExtent = function (dim, stack) {
var dimData = this._storage[dim]; var dimData = this._storage[dim];
var initialExtent = [Infinity, -Infinity]; var initialExtent = [Infinity, -Infinity];
stack = stack || false; stack = (stack || false) && isStacked(this, dim);
if (!dimData) { if (!dimData) {
return initialExtent; return initialExtent;
} }
// Make more strict checkings to ensure hitting cache. // Make more strict checkings to ensure hitting cache.
var stacked = isStacked(this, dim);
var currEnd = this.count(); var currEnd = this.count();
// Consider that the data is incremental, the extent should be var cacheName = [dim, !!stack].join('_');
// cached by not only dim, but also the end index.
var cacheName = [dim, !!(stack && stacked), currEnd].join('_');
// Consider the most cases when using data zoom, `getDataExtent` // Consider the most cases when using data zoom, `getDataExtent`
// happened before filtering. We cache raw extent, which is not // happened before filtering. We cache raw extent, which is not
// necessary to be cleared and recalculated when restore data. // necessary to be cleared and recalculated when restore data.
var useRaw = !this._indices && !stacked; var useRaw = !this._indices && !stack;
var dimExtent; var dimExtent;
if (useRaw) { if (useRaw) {
...@@ -1006,6 +1011,10 @@ function validateDimensions(list, dims) { ...@@ -1006,6 +1011,10 @@ function validateDimensions(list, dims) {
listProto.each = function (dims, cb, stack, context) { listProto.each = function (dims, cb, stack, context) {
'use strict'; 'use strict';
if (!this._count) {
return;
}
if (typeof dims === 'function') { if (typeof dims === 'function') {
context = stack; context = stack;
stack = cb; stack = cb;
...@@ -1058,6 +1067,10 @@ listProto.each = function (dims, cb, stack, context) { ...@@ -1058,6 +1067,10 @@ listProto.each = function (dims, cb, stack, context) {
listProto.filterSelf = function (dimensions, cb, stack, context) { listProto.filterSelf = function (dimensions, cb, stack, context) {
'use strict'; 'use strict';
if (!this._count) {
return;
}
if (typeof dimensions === 'function') { if (typeof dimensions === 'function') {
context = stack; context = stack;
stack = cb; stack = cb;
...@@ -1124,10 +1137,15 @@ listProto.filterSelf = function (dimensions, cb, stack, context) { ...@@ -1124,10 +1137,15 @@ listProto.filterSelf = function (dimensions, cb, stack, context) {
/** /**
* Select data in range. (For optimization of filter) * Select data in range. (For optimization of filter)
* (Manually inline code, support 5 million data filtering in data zoom.)
*/ */
listProto.selectRange = function (range, stack) { listProto.selectRange = function (range, stack) {
'use strict'; 'use strict';
if (!this._count) {
return;
}
stack = stack || false; stack = stack || false;
var dimensions = []; var dimensions = [];
...@@ -1153,31 +1171,74 @@ listProto.selectRange = function (range, stack) { ...@@ -1153,31 +1171,74 @@ listProto.selectRange = function (range, stack) {
var offset = 0; var offset = 0;
var dim0 = dimensions[0]; var dim0 = dimensions[0];
if (dimSize === 1) { var min = range[dim0][0];
var min = range[dim0][0]; var max = range[dim0][1];
var max = range[dim0][1];
for (var i = 0; i < originalCount; i++) { var quickFinished = false;
var rawIndex = this.getRawIndex(i); if (!this._indices && !stack) {
var val = stack ? this.get(dim0, i, true) : this._getFast(dim0, rawIndex); // Extreme optimization for common case. About 2x faster in chrome.
var idx = 0;
if (val >= min && val <= max) { if (dimSize === 1) {
newIndices[offset++] = rawIndex; var dimStorage = this._storage[dimensions[0]];
for (var k = 0; k < this._chunkCount; k++) {
var chunkStorage = dimStorage[k];
var len = Math.min(this._count - k * this._chunkSize, this._chunkSize);
for (var i = 0; i < len; i++) {
var val = chunkStorage[i];
if (val >= min && val <= max) {
newIndices[offset++] = idx;
}
idx++;
}
} }
quickFinished = true;
}
else if (dimSize === 2) {
var dimStorage = this._storage[dim0];
var dimStorage2 = this._storage[dimensions[1]];
var min2 = range[dimensions[1]][0];
var max2 = range[dimensions[1]][1];
for (var k = 0; k < this._chunkCount; k++) {
var chunkStorage = dimStorage[k];
var chunkStorage2= dimStorage2[k];
var len = Math.min(this._count - k * this._chunkSize, this._chunkSize);
for (var i = 0; i < len; i++) {
var val = chunkStorage[i];
var val2 = chunkStorage2[i];
if (val >= min && val <= max && val2 >= min2 && val2 <= max2) {
newIndices[offset++] = idx;
}
idx++;
}
}
quickFinished = true;
} }
} }
else { if (!quickFinished) {
for (var i = 0; i < originalCount; i++) { if (dimSize === 1) {
var keep = true; stack = stack || isStacked(this, dim0);
var rawIndex = this.getRawIndex(i); for (var i = 0; i < originalCount; i++) {
for (var k = 0; k < dimSize; k++) { var rawIndex = this.getRawIndex(i);
var dimk = dimensions[k]; var val = stack ? this.get(dim0, i, true) : this._getFast(dim0, rawIndex);
var val = stack ? this.get(dimk, i, true) : this._getFast(dim, rawIndex); if (val >= min && val <= max) {
if (val < range[dimk][0] || val > range[dimk][1]) { newIndices[offset++] = rawIndex;
keep = false;
} }
} }
if (keep) { }
newIndices[offset++] = this.getRawIndex(i); else {
for (var i = 0; i < originalCount; i++) {
var keep = true;
var rawIndex = this.getRawIndex(i);
for (var k = 0; k < dimSize; k++) {
var dimk = dimensions[k];
var val = stack ? this.get(dimk, i, true) : this._getFast(dim, rawIndex);
if (val < range[dimk][0] || val > range[dimk][1]) {
keep = false;
}
}
if (keep) {
newIndices[offset++] = this.getRawIndex(i);
}
} }
} }
} }
...@@ -1213,10 +1274,6 @@ listProto.mapArray = function (dimensions, cb, stack, context) { ...@@ -1213,10 +1274,6 @@ listProto.mapArray = function (dimensions, cb, stack, context) {
dimensions = []; dimensions = [];
} }
if (__DEV__) {
validateDimensions(this, dimensions);
}
var result = []; var result = [];
this.each(dimensions, function () { this.each(dimensions, function () {
result.push(cb && cb.apply(this, arguments)); result.push(cb && cb.apply(this, arguments));
...@@ -1643,6 +1700,10 @@ listProto.TRANSFERABLE_METHODS = ['cloneShallow', 'downSample', 'map']; ...@@ -1643,6 +1700,10 @@ listProto.TRANSFERABLE_METHODS = ['cloneShallow', 'downSample', 'map'];
// listProto.CHANGABLE_METHODS = ['filterSelf']; // listProto.CHANGABLE_METHODS = ['filterSelf'];
listProto.defaultDimValueGetter = function (dataItem, dimName, dataIndex, dimIndex) { listProto.defaultDimValueGetter = function (dataItem, dimName, dataIndex, dimIndex) {
if (this._rawData.isTypedArray) {
return dataIndex[dimIndex];
}
var value = modelUtil.getDataItemValue(dataItem); var value = modelUtil.getDataItemValue(dataItem);
// If any dataItem is like { value: 10 } // If any dataItem is like { value: 10 }
if (!this._rawData.pure && modelUtil.isDataItemOption(dataItem)) { if (!this._rawData.pure && modelUtil.isDataItemOption(dataItem)) {
......
...@@ -1021,7 +1021,14 @@ echartsProto.resize = function (opts) { ...@@ -1021,7 +1021,14 @@ echartsProto.resize = function (opts) {
var ecModel = this._model; var ecModel = this._model;
var optionChanged = ecModel && ecModel.resetOption('media'); // Resize loading effect
this._loadingFX && this._loadingFX.resize();
if (!ecModel) {
return;
}
var optionChanged = ecModel.resetOption('media');
optionChanged && ecModel.settingTask.dirty(); optionChanged && ecModel.settingTask.dirty();
...@@ -1042,9 +1049,6 @@ function refresh(ecIns, needPrepare, silent) { ...@@ -1042,9 +1049,6 @@ function refresh(ecIns, needPrepare, silent) {
needPrepare && prepare(ecIns); needPrepare && prepare(ecIns);
updateMethods.update.call(ecIns); updateMethods.update.call(ecIns);
// Resize loading effect
ecIns._loadingFX && ecIns._loadingFX.resize();
ecIns[IN_MAIN_PROCESS] = false; ecIns[IN_MAIN_PROCESS] = false;
flushPendingActions.call(ecIns, silent); flushPendingActions.call(ecIns, silent);
......
...@@ -11,7 +11,7 @@ export default function (seriesType) { ...@@ -11,7 +11,7 @@ export default function (seriesType) {
ecModel.eachSeriesByType(seriesType, function (seriesModel) { ecModel.eachSeriesByType(seriesType, function (seriesModel) {
seriesModel.__paletteScope = paletteScope; seriesModel.__paletteScope = paletteScope;
seriesModel.push(seriesModel); seiresModels.push(seriesModel);
}); });
return seiresModels; return seiresModels;
}, },
......
...@@ -33,20 +33,27 @@ ...@@ -33,20 +33,27 @@
var chunkCount = 0; var chunkCount = 0;
function genData1(len, offset) { function genData1(len, offset) {
// console.profile('gen');
var lngRange = [-10.781327, 131.48]; var lngRange = [-10.781327, 131.48];
var latRange = [18.252847, 52.33]; var latRange = [18.252847, 52.33];
var data = []; var arr = new Float32Array(len * 2);
while (len--) { var off = 0;
var x = +(Math.random() * 10).toFixed(3);
data.push([ // var data = [];
x, for (var i = 0; i < len; i++) {
+(Math.sin(x) - x * (len % 2 ? 0.1 : -0.1) * Math.random()).toFixed(3) + (offset || 0) / 10, var x = +Math.random() * 10;
Math.random() * 100 var y = +Math.sin(x) - x * (len % 2 ? 0.1 : -0.1) * Math.random() + (offset || 0) / 10;
]); arr[off++] = x;
arr[off++] = y;
// data.push([
// x,
// y
// ]);
} }
// console.profileEnd('gen');
return data; return arr;
// return data;
} }
function genData2(count) { function genData2(count) {
...@@ -118,14 +125,20 @@ ...@@ -118,14 +125,20 @@
name: 'pm2.5', name: 'pm2.5',
type: 'scatter', type: 'scatter',
large: true, large: true,
data: genData1(1e6), data: genData1(5e6),
dimensions: ['x', 'y'],
encode: {
x: 0,
y: 1
},
xAxisIndex: 0, xAxisIndex: 0,
yAxisIndex: 0, yAxisIndex: 0,
symbolSize: 2, symbolSize: 1,
// symbol: 'rect', // symbol: 'rect',
itemStyle: { itemStyle: {
normal: { normal: {
color: '#128de3' color: '#128de3',
opacity: 0.2
} }
}, },
progressive: 3000 progressive: 3000
...@@ -161,7 +174,7 @@ ...@@ -161,7 +174,7 @@
window.onresize = chart.resize; window.onresize = chart.resize;
next(); // next();
function next() { function next() {
if (chunkCount++ < chunkMax) { if (chunkCount++ < chunkMax) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册