markerHelper.js 5.0 KB
Newer Older
L
lang 已提交
1 2 3
define(function (require) {

    var zrUtil = require('zrender/core/util');
L
lang 已提交
4 5
    var numberUtil = require('../../util/number');

L
tweak  
lang 已提交
6
    function getPrecision(data, valueAxisDim, dataIndex) {
L
lang 已提交
7 8 9 10 11 12 13 14 15 16 17 18
        var precision = -1;
        do {
            precision = Math.max(
                numberUtil.getPrecision(data.get(
                    valueAxisDim, dataIndex
                )),
                precision
            );
            data = data.stackedOn;
        } while (data);

        return precision;
L
tweak  
lang 已提交
19
    }
L
lang 已提交
20

L
tweak  
lang 已提交
21
    function markerTypeCalculatorWithExtent(percent, data, baseAxisDim, valueAxisDim, valueIndex) {
L
lang 已提交
22 23 24 25 26 27 28 29
        var extent = data.getDataExtent(valueAxisDim);
        var valueArr = [];
        var min = extent[0];
        var max = extent[1];
        var val = (max - min) * percent + min;
        var dataIndex = data.indexOfNearest(valueAxisDim, val);
        valueArr[1 - valueIndex] = data.get(baseAxisDim, dataIndex);
        valueArr[valueIndex] = data.get(valueAxisDim, dataIndex, true);
L
lang 已提交
30 31 32 33 34 35

        var precision = getPrecision(data, valueAxisDim, dataIndex);
        if (precision >= 0) {
            valueArr[valueIndex] = +valueArr[valueIndex].toFixed(precision);
        }

L
lang 已提交
36
        return valueArr;
L
tweak  
lang 已提交
37
    }
L
lang 已提交
38

L
tweak  
lang 已提交
39
    var curry = zrUtil.curry;
L
lang 已提交
40
    // TODO Specified percent
L
lang 已提交
41 42 43 44 45 46 47
    var markerTypeCalculator = {
        /**
         * @method
         * @param {module:echarts/data/List} data
         * @param {string} baseAxisDim
         * @param {string} valueAxisDim
         */
L
tweak  
lang 已提交
48
        min: curry(markerTypeCalculatorWithExtent, 0),
L
lang 已提交
49 50 51 52 53 54
        /**
         * @method
         * @param {module:echarts/data/List} data
         * @param {string} baseAxisDim
         * @param {string} valueAxisDim
         */
L
tweak  
lang 已提交
55
        max: curry(markerTypeCalculatorWithExtent, 1),
L
lang 已提交
56 57 58 59 60 61
        /**
         * @method
         * @param {module:echarts/data/List} data
         * @param {string} baseAxisDim
         * @param {string} valueAxisDim
         */
L
tweak  
lang 已提交
62
        average: curry(markerTypeCalculatorWithExtent, 0.5)
L
lang 已提交
63 64
    };

L
tweak  
lang 已提交
65 66 67 68 69 70 71 72 73
    /**
     * Transform markPoint data item to format used in List by do the following
     * 1. Calculate statistic like `max`, `min`, `average`
     * 2. Convert `item.xAxis`, `item.yAxis` to `item.value` array
     * @param  {module:echarts/data/List} data
     * @param  {module:echarts/coord/*} [coordSys]
     * @param  {Object} item
     * @return {Object}
     */
L
lang 已提交
74
    var dataTransform = function (data, coordSys, item) {
L
lang 已提交
75 76
        // 1. If not specify the position with pixel directly
        // 2. If value is not a data array. Which uses xAxis, yAxis to specify the value on each dimension
L
tweak  
lang 已提交
77 78 79 80
        if (isNaN(item.x) || isNaN(item.y)
            && !zrUtil.isArray(item.value)
            && coordSys
        ) {
L
lang 已提交
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
            var valueAxisDim;
            var baseAxisDim;
            var valueAxis;
            var baseAxis;
            if (item.valueIndex != null) {
                valueAxisDim = coordSys.dimensions[item.valueIndex];
                baseAxisDim = coordSys.dimensions[1 - item.valueIndex];
                valueAxis = coordSys.getAxis(valueAxisDim);
                baseAxis = coordSys.getAxis(baseAxisDim);
            }
            else {
                baseAxis = coordSys.getBaseAxis();
                valueAxis = coordSys.getOtherAxis(baseAxis);
                baseAxisDim = baseAxis.dim;
                valueAxisDim = valueAxis.dim;
            }
L
tweak  
lang 已提交
97 98 99
            var valueIndex = item.valueIndex != null
                ? item.valueIndex
                : ((valueAxisDim === 'angle' || valueAxisDim === 'x') ? 0 : 1);
L
lang 已提交
100 101 102
            // Clone the option
            // Transform the properties xAxis, yAxis, radiusAxis, angleAxis, geoCoord to value
            item = zrUtil.extend({}, item);
L
lang 已提交
103
            if (item.type && markerTypeCalculator[item.type] && baseAxis && valueAxis) {
L
lang 已提交
104
                var value = markerTypeCalculator[item.type](
L
tweak  
lang 已提交
105
                    data, baseAxis.dim, valueAxisDim, valueIndex
L
lang 已提交
106
                );
L
lang 已提交
107 108 109
                if (item.value != null) {
                    value.push(+item.value);
                }
L
lang 已提交
110 111
                item.value = value;
            }
L
lang 已提交
112
            else {
L
lang 已提交
113
                var originalValue = item.value;
L
lang 已提交
114 115
                // FIXME Only has one of xAxis and yAxis.
                item.value = [
L
lang 已提交
116
                    item.xAxis != null ? item.xAxis : item.radiusAxis,
L
lang 已提交
117
                    item.yAxis != null ? item.yAxis : item.angleAxis
L
lang 已提交
118
                ];
L
lang 已提交
119 120 121
                if (originalValue != null) {
                    item.value.push(+originalValue);
                }
L
lang 已提交
122
            }
L
lang 已提交
123
            item.__rawValue = item.value[valueIndex];
L
lang 已提交
124 125 126 127
        }
        return item;
    };

L
tweak  
lang 已提交
128 129 130 131 132 133 134 135

    /**
     * Filter data which is out of coordinateSystem range
     * [dataFilter description]
     * @param  {module:echarts/coord/*} [coordSys]
     * @param  {Object} item
     * @return {boolean}
     */
L
lang 已提交
136
    var dataFilter = function (coordSys, item) {
L
tweak  
lang 已提交
137
        // Alwalys return true if there is no coordSys
L
lang 已提交
138
        return coordSys ? coordSys.containData(item.value) : true;
L
Comma  
lang 已提交
139
    };
L
lang 已提交
140 141 142 143 144 145

    return {
        dataTransform: dataTransform,
        dataFilter: dataFilter
    };
});