MapView.js 4.9 KB
Newer Older
L
lang 已提交
1 2 3 4 5
define(function (require) {

    var zrUtil = require('zrender/core/util');
    var graphic = require('../../util/graphic');

L
lang 已提交
6 7
    var RoamController = require('../../component/helper/RoamController');

L
lang 已提交
8 9 10 11
    require('../../echarts').extendChartView({

        type: 'map',

L
lang 已提交
12 13 14 15 16
        init: function (ecModel, api) {
            var controller = new RoamController(api.getZr(), null, null);
            this._controller = controller;
        },

L
lang 已提交
17
        render: function (mapModel, ecModel, api) {
L
lang 已提交
18 19 20
            var group = this.group;
            var geo = mapModel.coordinateSystem;
            group.removeAll();
L
lang 已提交
21

L
lang 已提交
22 23
            mapModel.needsDrawMap &&
                this._renderArea(mapModel, ecModel, api);
L
lang 已提交
24

L
lang 已提交
25
            mapModel.get('showLegendSymbol') && ecModel.getComponent('legend')
L
lang 已提交
26
                && this._renderSymbols(mapModel, ecModel, api);
L
lang 已提交
27 28 29 30 31 32 33 34 35 36 37 38 39 40

            var controller = this._controller;
            controller.off('pan')
                .on('pan', function (dx, dy) {
                    api.dispatch({
                        type: 'geoRoam',
                        // component: 'series',
                        name: mapModel.name,
                        dx: dx,
                        dy: dy
                    });
                });

            controller.rect = geo.getViewBox();
L
lang 已提交
41 42
        },

L
lang 已提交
43
        _renderArea: function (mapModel, ecModel, api) {
L
lang 已提交
44 45 46 47 48 49 50 51 52
            var data = mapModel.getData();

            var geo = mapModel.coordinateSystem;

            var mapGroup = new graphic.Group();
            var group = this.group;

            group.add(mapGroup);

L
lang 已提交
53
            var scale = geo.scale;
L
lang 已提交
54
            mapGroup.position = geo.position.slice();
L
lang 已提交
55
            mapGroup.scale = scale.slice();
L
lang 已提交
56 57 58 59 60

            zrUtil.each(geo.regions, function (region) {

                var regionGroup = new graphic.Group();

L
lang 已提交
61 62 63 64 65 66 67 68 69
                var dataIdx = data.indexOfName(region.name);
                var itemModel = data.getItemModel(dataIdx);

                var itemStyleModel = itemModel.getModel('itemStyle.normal');
                var hoverItemStyleModel = itemModel.getModel('itemStyle.emphasis');

                var itemStyle = itemStyleModel.getItemStyle();
                var hoverItemStyle = hoverItemStyleModel.getItemStyle();

L
lang 已提交
70
                // Competitable with 2.0
L
lang 已提交
71 72
                var areaStylePath = 'areaStyle.color';
                itemStyle.fill = itemStyleModel.get(areaStylePath);
L
lang 已提交
73
                hoverItemStyle.fill = hoverItemStyleModel.get('areaColor');
L
lang 已提交
74

L
lang 已提交
75 76
                var styleObj = zrUtil.defaults(
                    {
L
lang 已提交
77 78 79 80
                        // Global visual color is used by symbol
                        // item visual color may be coded by dataRange
                        fill: data.getItemVisual(dataIdx, 'color', true)
                            || data.getVisual('areaColor')
L
lang 已提交
81
                    },
L
lang 已提交
82
                    itemStyle
L
lang 已提交
83 84
                );

L
lang 已提交
85 86 87
                styleObj.lineWidth && (styleObj.lineWidth /= scale[0]);
                hoverItemStyle.lineWidth && (hoverItemStyle.lineWidth /= scale[0]);

L
lang 已提交
88 89 90 91 92 93 94 95 96 97
                zrUtil.each(region.contours, function (contour) {

                    var polygon = new graphic.Polygon({
                        shape: {
                            points: contour
                        }
                    });

                    polygon.setStyle(styleObj);

L
lang 已提交
98
                    graphic.setHoverStyle(polygon, hoverItemStyle);
L
lang 已提交
99 100 101 102 103 104

                    regionGroup.add(polygon);
                });

                mapGroup.add(regionGroup);
            });
L
lang 已提交
105 106
        },

L
lang 已提交
107 108
        _renderSymbols: function (mapModel, ecModel, api) {
            var data = mapModel.getData();
L
lang 已提交
109 110
            var group = this.group;

L
lang 已提交
111 112 113 114
            data.each('value', function (value, idx) {
                if (isNaN(value)) {
                    return;
                }
L
lang 已提交
115 116 117 118
                var itemModel = data.getItemModel(idx);
                var labelModel = itemModel.getModel('itemStyle.normal.label');
                var textStyleModel = labelModel.getModel('textStyle');

L
lang 已提交
119 120 121 122
                var layout = data.getItemLayout(idx);
                var point = layout.point;
                var offset = layout.offset;

L
lang 已提交
123 124
                var circle = new graphic.Circle({
                    style: {
L
lang 已提交
125
                        fill: data.getVisual('color')
L
lang 已提交
126 127 128 129 130 131
                    },
                    shape: {
                        cx: point[0] + offset * 9,
                        cy: point[1],
                        r: 3
                    },
L
lang 已提交
132
                    silent: true,
L
lang 已提交
133 134 135 136

                    z2: 10
                });

L
lang 已提交
137
                if (labelModel.get('show') && !offset) {
L
lang 已提交
138
                    circle.setStyle({
L
lang 已提交
139
                        text: data.getName(idx),
L
lang 已提交
140 141 142 143 144 145 146 147
                        textFill: textStyleModel.get('color'),
                        textPosition: 'bottom',
                        textFont: textStyleModel.getFont()
                    });
                }

                group.add(circle);
            });
L
lang 已提交
148 149 150
        }
    });
});