├── .bowerrc
├── .gitignore
├── .jshintrc
├── README.md
├── bower.json
├── dist
├── angular-echarts.js
└── angular-echarts.min.js
├── docs
├── china.js
├── data.json
└── docs.js
├── gulpfile.js
├── index.html
├── package.json
└── src
├── directive.js
├── theme.js
├── theme
├── dark.js
├── infographic.js
├── macarons.js
├── roma.js
└── shine.js
└── util.js
/.bowerrc:
--------------------------------------------------------------------------------
1 | {
2 | "directory": "vendor"
3 | }
4 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | vendor
2 | node_modules
3 | .idea/
--------------------------------------------------------------------------------
/.jshintrc:
--------------------------------------------------------------------------------
1 | {
2 | "node": true,
3 | "browser": true,
4 | "esnext": true,
5 | "bitwise": false,
6 | "camelcase": false,
7 | "curly": false,
8 | "eqeqeq": true,
9 | "immed": true,
10 | "latedef": true,
11 | "newcap": true,
12 | "noarg": true,
13 | "quotmark": "single",
14 | "regexp": true,
15 | "undef": true,
16 | "unused": false,
17 | "strict": true,
18 | "trailing": true,
19 | "smarttabs": false,
20 | "loopfunc": false,
21 | "globals": {
22 | "jasmine": true,
23 | "angular": true,
24 | "d3": true,
25 | "_": true,
26 | "$": true,
27 | "Rickshaw": true,
28 | "ApplicationConfiguration": true
29 | },
30 | "predef": [ // Extra globals.
31 | "define",
32 | "require",
33 | "exports",
34 | "module",
35 | "describe",
36 | "before",
37 | "beforeEach",
38 | "after",
39 | "afterEach",
40 | "it",
41 | "echarts",
42 | "expect"
43 | ],
44 | "indent": 4,
45 | "devel": true,
46 | "noempty": true
47 | }
48 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # eCharts + AngularJS
2 |
3 | AngularJS directives to use [eCharts](http://ecomfe.github.io/echarts/index-en.html)
4 |
5 | ## Prerequisites
6 |
7 | You will need the following things properly installed on your computer.
8 |
9 | * [Node.js](http://nodejs.org/) (with NPM) and [Bower](http://bower.io/)
10 |
11 | ## Breaking Changes in V1
12 |
13 | * `echart` support is v3.4.0;
14 | * `angular` support is v1.6.2;
15 | * map chart requires additional work, see below;
16 | * custome themes are removed, all uses the build in ones;
17 |
18 | ## Building
19 |
20 | - Preparing
21 | `bower install` & `npm install`
22 |
23 | - default
24 | `gulp`
25 | > develop with realtime monitor, automatic open browser to view example
26 |
27 | - build
28 | `gulp build`
29 | > Build file to dist
30 |
31 | - publish
32 | `gulp publish`
33 | > Build & bump npm versions
34 |
35 | ## Usage
36 |
37 | Install bower dependency and save for production
38 |
39 | ```
40 | $ bower install angular-echarts --save
41 | ```
42 |
43 | Inject echarts and angular-echarts file into page
44 |
45 | ```
46 |
47 |
48 | ```
49 |
50 | *Download and inject map definitions if you want a map chart: http://echarts.baidu.com/download-map.html*
51 |
52 | Add dependency and declare a demo controller
53 |
54 | ```
55 | var app = angular.module('demo', ['angular-echarts']);
56 | app.controller('LineChartController', function ($scope) {
57 |
58 | var pageload = {
59 | name: 'page.load',
60 | datapoints: [
61 | { x: 2001, y: 1012 },
62 | { x: 2002, y: 1023 },
63 | { x: 2003, y: 1045 },
64 | { x: 2004, y: 1062 },
65 | { x: 2005, y: 1032 },
66 | { x: 2006, y: 1040 },
67 | { x: 2007, y: 1023 },
68 | { x: 2008, y: 1090 },
69 | { x: 2009, y: 1012 },
70 | { x: 2010, y: 1012 },
71 | ]
72 | };
73 |
74 | var firstPaint = {
75 | name: 'page.firstPaint',
76 | datapoints: [
77 | { x: 2001, y: 22 },
78 | { x: 2002, y: 13 },
79 | { x: 2003, y: 35 },
80 | { x: 2004, y: 52 },
81 | { x: 2005, y: 32 },
82 | { x: 2006, y: 40 },
83 | { x: 2007, y: 63 },
84 | { x: 2008, y: 80 },
85 | { x: 2009, y: 20 },
86 | { x: 2010, y: 25 },
87 | ]
88 | };
89 |
90 | $scope.config = {
91 | title: 'Line Chart',
92 | subtitle: 'Line Chart Subtitle',
93 | debug: true,
94 | showXAxis: true,
95 | showYAxis: true,
96 | showLegend: true,
97 | stack: false,
98 | };
99 |
100 | $scope.data = [ pageload ];
101 | $scope.multiple = [pageload, firstPaint ];
102 |
103 | });
104 | ```
105 |
106 | Use this markup for a quick demo
107 |
108 | ```
109 |
110 |
111 |
112 |
113 | ```
114 |
115 | ## Contribute
116 |
117 | * `git clone git@github.com:wangshijun/angular-echarts.git`
118 | * change into the new directory
119 | * `npm install`
120 | * `bower install`
121 |
122 | ### __Running / Development__
123 |
124 | * open ```docs/index.html``` in browser
125 |
126 | > Or you can use `gulp server` and visit `http://localhost:8080` in Chrome browser, to avoid `XMLHttpRequest Cross origin requests` error.
127 |
128 |
--------------------------------------------------------------------------------
/bower.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular-echarts",
3 | "version": "1.0.3",
4 | "homepage": "https://github.com/wangshijun/angular-echarts",
5 | "authors": [
6 | "wangshijun2010 "
7 | ],
8 | "description": "angular baidu echarts",
9 | "main": "./dist/angular-echarts.min.js",
10 | "moduleType": [
11 | "globals"
12 | ],
13 | "keywords": [
14 | "angular",
15 | "baidu",
16 | "echarts"
17 | ],
18 | "license": "MIT",
19 | "ignore": [
20 | "**/.*",
21 | "node_modules",
22 | "bower_components",
23 | "test",
24 | "tests"
25 | ],
26 | "dependencies": {
27 | "angular": "~1.6",
28 | "echarts": "~3.4"
29 | },
30 | "devDependencies": {
31 | "bootstrap": "~3"
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/dist/angular-echarts.js:
--------------------------------------------------------------------------------
1 | (function () {'use strict';
2 | /**
3 | * generate directive link function
4 | *
5 | * @param {Service} $http, http service to make ajax requests from angular
6 | * @param {String} type, chart type
7 | */
8 | function getLinkFunction($http, theme, util, type) {
9 | return function (scope, element, attrs) {
10 | scope.config = scope.config || {};
11 | var ndWrapper = element.find('div')[0], ndParent = element.parent()[0], parentWidth = ndParent.clientWidth, parentHeight = ndParent.clientHeight, width, height, chart;
12 | var chartEvent = {};
13 | function getSizes(config) {
14 | width = config.width || parseInt(attrs.width) || parentWidth || 320;
15 | height = config.height || parseInt(attrs.height) || parentHeight || 240;
16 | ndWrapper.style.width = width + 'px';
17 | ndWrapper.style.height = height + 'px';
18 | }
19 | function getOptions(data, config, type) {
20 | // merge default config
21 | config = angular.extend({
22 | showXAxis: true,
23 | showYAxis: true,
24 | showLegend: true
25 | }, config);
26 | var xAxis = angular.extend({
27 | orient: 'top',
28 | axisLine: { show: false }
29 | }, angular.isObject(config.xAxis) ? config.xAxis : {});
30 | var yAxis = angular.extend({
31 | type: 'value',
32 | orient: 'right',
33 | scale: false,
34 | axisLine: { show: false },
35 | axisLabel: {
36 | formatter: function (v) {
37 | return util.formatKMBT(v);
38 | }
39 | }
40 | }, angular.isObject(config.yAxis) ? config.yAxis : {});
41 | // basic config
42 | var options = {
43 | title: util.getTitle(data, config, type),
44 | tooltip: util.getTooltip(data, config, type),
45 | legend: util.getLegend(data, config, type),
46 | toolbox: angular.extend({ show: false }, angular.isObject(config.toolbox) ? config.toolbox : {}),
47 | xAxis: util.isHeatmapChart(type) ? config.xAxis : [ angular.extend(util.getAxisTicks(data, config, type), xAxis) ],
48 | yAxis: util.isHeatmapChart(type) ? config.yAxis : [ yAxis ],
49 | graphic: config.graphic && (angular.isObject(config.graphic) || angular.isArray(config.graphic)) ? config.graphic : [],
50 | series: util.getSeries(data, config, type),
51 | visualMap: config.visualMap ? config.visualMap : null
52 | };
53 | if (!config.showXAxis) {
54 | angular.forEach(options.xAxis, function (axis) {
55 | axis.axisLine = { show: false };
56 | axis.axisLabel = { show: false };
57 | axis.axisTick = { show: false };
58 | });
59 | }
60 | if (!config.showYAxis) {
61 | angular.forEach(options.yAxis, function (axis) {
62 | axis.axisLine = { show: false };
63 | axis.axisLabel = { show: false };
64 | axis.axisTick = { show: false };
65 | });
66 | }
67 | if (!config.showLegend || type === 'gauge') {
68 | delete options.legend;
69 | }
70 | if (!util.isAxisChart(type) && !util.isHeatmapChart(type)) {
71 | delete options.xAxis;
72 | delete options.yAxis;
73 | }
74 | if (config.dataZoom) {
75 | options.dataZoom = angular.extend({
76 | show: true,
77 | realtime: true
78 | }, config.dataZoom);
79 | }
80 | if (config.dataRange) {
81 | options.dataRange = angular.extend({}, config.dataRange);
82 | }
83 | if (config.polar) {
84 | options.polar = config.polar;
85 | }
86 | if (config.grid) {
87 | options.grid = config.grid;
88 | }
89 | return options;
90 | }
91 | var isAjaxInProgress = false;
92 | var textStyle = {
93 | color: 'red',
94 | fontSize: 36,
95 | fontWeight: 900,
96 | fontFamily: 'Microsoft Yahei, Arial'
97 | };
98 | function setOptions() {
99 | if (!scope.data || !scope.config) {
100 | return;
101 | }
102 | var options;
103 | getSizes(scope.config);
104 | if (!chart) {
105 | chart = echarts.init(ndWrapper, scope.config.theme || 'shine');
106 | }
107 | if (scope.config.event) {
108 | if (!Array.isArray(scope.config.event)) {
109 | scope.config.event = [scope.config.event];
110 | }
111 | if (Array.isArray(scope.config.event)) {
112 | scope.config.event.forEach(function (ele) {
113 | if (!chartEvent[ele.type]) {
114 | chartEvent[ele.type] = true;
115 | chart.on(ele.type, function (param) {
116 | ele.fn(param);
117 | });
118 | }
119 | });
120 | }
121 | }
122 | // string type for data param is assumed to ajax datarequests
123 | if (angular.isString(scope.data)) {
124 | if (isAjaxInProgress) {
125 | return;
126 | }
127 | isAjaxInProgress = true;
128 | // show loading
129 | chart.showLoading({
130 | text: scope.config.loading || '\u594B\u529B\u52A0\u8F7D\u4E2D...',
131 | textStyle: textStyle
132 | });
133 | // fire data request
134 | $http.get(scope.data).then(function (response) {
135 | isAjaxInProgress = false;
136 | chart.hideLoading();
137 | if (response.data.data) {
138 | options = getOptions(response.data.data, scope.config, type);
139 | if (scope.config.forceClear) {
140 | chart.clear();
141 | }
142 | if (options.series.length) {
143 | chart.setOption(options);
144 | chart.resize();
145 | } else {
146 | chart.showLoading({
147 | text: scope.config.errorMsg || '\u6CA1\u6709\u6570\u636E',
148 | textStyle: textStyle
149 | });
150 | }
151 | } else {
152 | chart.showLoading({
153 | text: scope.config.emptyMsg || '\u6570\u636E\u52A0\u8F7D\u5931\u8D25',
154 | textStyle: textStyle
155 | });
156 | }
157 | }); // if data is avaliable, render immediately
158 | } else {
159 | options = getOptions(scope.data, scope.config, type);
160 | if (scope.config.forceClear) {
161 | chart.clear();
162 | }
163 | if (options.series.length) {
164 | chart.setOption(options);
165 | chart.resize();
166 | } else {
167 | chart.showLoading({
168 | text: scope.config.errorMsg || '\u6CA1\u6709\u6570\u636E',
169 | textStyle: textStyle
170 | });
171 | }
172 | }
173 | scope.chartObj = chart;
174 | }
175 | // update when charts config changes
176 | scope.$watch(function () {
177 | return scope.config;
178 | }, function (value) {
179 | if (value) {
180 | setOptions();
181 | }
182 | }, true);
183 | scope.$watch(function () {
184 | return scope.data;
185 | }, function (value) {
186 | if (value) {
187 | setOptions();
188 | }
189 | }, true);
190 | };
191 | }
192 | /**
193 | * add directives
194 | */
195 | var app = angular.module('angular-echarts', ['angular-echarts.theme', 'angular-echarts.util']);
196 | var types = ['line', 'bar', 'area', 'pie', 'donut', 'gauge', 'map', 'radar', 'heatmap'];
197 | for (var i = 0, n = types.length; i < n; i++) {
198 | (function (type) {
199 | app.directive(type + 'Chart', ['$http', 'theme', 'util', function ($http, theme, util) {
200 | return {
201 | restrict: 'EA',
202 | template: '',
203 | scope: {
204 | config: '=config',
205 | data: '=data',
206 | chartObj: '=?chartObj'
207 | },
208 | link: getLinkFunction($http, theme, util, type)
209 | };
210 | }]);
211 | }(types[i]));
212 | }
213 | 'use strict';
214 | /**
215 | * util services
216 | */
217 | angular.module('angular-echarts.util', []).factory('util', function () {
218 | function isPieChart(type) {
219 | return ['pie', 'donut'].indexOf(type) > -1;
220 | }
221 | function isMapChart(type) {
222 | return ['map'].indexOf(type) > -1;
223 | }
224 | function isAxisChart(type) {
225 | return ['line', 'bar', 'area'].indexOf(type) > -1;
226 | }
227 | function isHeatmapChart(type) {
228 | return ['heatmap'].indexOf(type) > -1;
229 | }
230 | /**
231 | * get x axis ticks from the 1st serie
232 | */
233 | function getAxisTicks(data, config, type) {
234 | var ticks = [];
235 | if (data[0]) {
236 | angular.forEach(data[0].datapoints, function (datapoint) {
237 | ticks.push(datapoint.x);
238 | });
239 | }
240 | return {
241 | type: 'category',
242 | boundaryGap: type === 'bar',
243 | data: ticks
244 | };
245 | }
246 | /**
247 | * get series config
248 | *
249 | * @param {Array} data serie data
250 | * @param {Object} config options
251 | * @param {String} chart type
252 | */
253 | function getSeries(data, config, type) {
254 | var series = [];
255 | angular.forEach(data, function (serie) {
256 | // datapoints for line, area, bar chart
257 | var datapoints = [];
258 | angular.forEach(serie.datapoints, function (datapoint) {
259 | datapoints.push(datapoint.y);
260 | });
261 | var conf = {
262 | type: type || 'line',
263 | name: serie.name,
264 | data: datapoints
265 | };
266 | conf = angular.extend(conf, serie);
267 | // area chart is actually line chart with special itemStyle
268 | if (type === 'area') {
269 | conf.type = 'line';
270 | conf.itemStyle = conf.itemStyle || { normal: { areaStyle: { type: 'default' } } };
271 | }
272 | // gauge chart need many special config
273 | if (type === 'gauge') {
274 | conf = angular.extend(conf, {
275 | splitNumber: 10,
276 | // 分割段数,默认为5
277 | axisLine: {
278 | // 坐标轴线
279 | lineStyle: {
280 | // 属性lineStyle控制线条样式
281 | color: [[0.2, '#228b22'], [0.8, '#48b'], [1, '#ff4500']],
282 | width: 8
283 | }
284 | },
285 | axisTick: {
286 | // 坐标轴小标记
287 | splitNumber: 10,
288 | // 每份split细分多少段
289 | length: 12,
290 | // 属性length控制线长
291 | lineStyle: {
292 | // 属性lineStyle控制线条样式
293 | color: 'auto'
294 | }
295 | },
296 | axisLabel: {
297 | // 坐标轴文本标签,详见axis.axisLabel
298 | textStyle: {
299 | // 其余属性默认使用全局文本样式,详见TEXTSTYLE
300 | color: 'auto'
301 | }
302 | },
303 | splitLine: {
304 | // 分隔线
305 | show: true,
306 | // 默认显示,属性show控制显示与否
307 | length: 30,
308 | // 属性length控制线长
309 | lineStyle: {
310 | // 属性lineStyle(详见lineStyle)控制线条样式
311 | color: 'auto'
312 | }
313 | },
314 | pointer: { width: 5 },
315 | title: {
316 | show: true,
317 | offsetCenter: [0, '-40%'],
318 | // x, y,单位px
319 | textStyle: {
320 | // 其余属性默认使用全局文本样式,详见TEXTSTYLE
321 | fontWeight: 'bolder'
322 | }
323 | },
324 | detail: {
325 | formatter: '{value}%',
326 | textStyle: {
327 | // 其余属性默认使用全局文本样式,详见TEXTSTYLE
328 | color: 'auto',
329 | fontWeight: 'bolder'
330 | }
331 | }
332 | }, config.gauge || {});
333 | }
334 | // datapoints for pie chart and gauges are different
335 | if (!isAxisChart(type)) {
336 | conf.data = [];
337 | angular.forEach(serie.datapoints, function (datapoint) {
338 | conf.data.push({
339 | value: datapoint.y,
340 | name: datapoint.x
341 | });
342 | });
343 | }
344 | if (isPieChart(type)) {
345 | // donut charts are actually pie charts
346 | conf.type = 'pie';
347 | // pie chart need special radius, center config
348 | conf.center = config.center || ['40%', '50%'];
349 | conf.radius = config.radius || '60%';
350 | // donut chart require special itemStyle
351 | if (type === 'donut') {
352 | conf.radius = config.radius || ['50%', '70%'];
353 | conf = angular.extend(conf, {
354 | itemStyle: {
355 | normal: {
356 | label: { show: false },
357 | labelLine: { show: false }
358 | },
359 | emphasis: {
360 | label: {
361 | show: true,
362 | position: 'center',
363 | textStyle: {
364 | fontSize: '50',
365 | fontWeight: 'bold'
366 | }
367 | }
368 | }
369 | }
370 | }, config.donut || {});
371 | } else if (type === 'pie') {
372 | conf = angular.extend(conf, {
373 | itemStyle: {
374 | normal: {
375 | label: {
376 | position: 'inner',
377 | formatter: function (item) {
378 | return (+item.percent).toFixed() + '%';
379 | }
380 | },
381 | labelLine: { show: false }
382 | },
383 | emphasis: {
384 | label: {
385 | show: true,
386 | formatter: '{b}\n{d}%'
387 | }
388 | }
389 | }
390 | }, config.pie || {});
391 | }
392 | }
393 | if (isMapChart(type)) {
394 | conf.type = 'map';
395 | conf = angular.extend(conf, serie, config.map || {});
396 | }
397 | // if stack set to true
398 | if (config.stack) {
399 | conf.stack = 'total';
400 | }
401 | if (type === 'radar') {
402 | conf.data = serie.data;
403 | }
404 | if (isHeatmapChart(type)) {
405 | conf.type = 'heatmap';
406 | conf.name = serie.name;
407 | conf.data = serie.data;
408 | conf = angular.extend(conf, {
409 | label: { normal: { show: true } },
410 | itemStyle: {
411 | emphasis: {
412 | shadowBlur: 10,
413 | shadowColor: 'rgba(0, 0, 0, 0.5)'
414 | }
415 | }
416 | }, config.heatmap || {});
417 | }
418 | series.push(conf);
419 | });
420 | return series;
421 | }
422 | /**
423 | * get legends from data series
424 | */
425 | function getLegend(data, config, type) {
426 | var legend = { data: [] };
427 | if (isPieChart(type)) {
428 | if (data[0]) {
429 | angular.forEach(data[0].datapoints, function (datapoint) {
430 | legend.data.push(datapoint.x);
431 | });
432 | }
433 | legend.orient = 'verticle';
434 | legend.x = 'right';
435 | legend.y = 'center';
436 | } else if (type === 'map') {
437 | legend = {};
438 | } else {
439 | angular.forEach(data, function (serie) {
440 | legend.data.push(serie.name);
441 | });
442 | legend.orient = 'horizontal';
443 | }
444 | return angular.extend(legend, config.legend || {});
445 | }
446 | /**
447 | * get tooltip config
448 | */
449 | function getTooltip(data, config, type) {
450 | var tooltip = {};
451 | switch (type) {
452 | case 'line':
453 | case 'area':
454 | tooltip.trigger = 'axis';
455 | break;
456 | case 'pie':
457 | case 'donut':
458 | case 'bar':
459 | case 'map':
460 | case 'gauge':
461 | tooltip.trigger = 'item';
462 | break;
463 | }
464 | if (type === 'pie') {
465 | tooltip.formatter = '{a}
{b}: {c} ({d}%)';
466 | }
467 | if (type === 'map') {
468 | tooltip.formatter = '{b}';
469 | }
470 | return angular.extend(tooltip, angular.isObject(config.tooltip) ? config.tooltip : {});
471 | }
472 | function getTitle(data, config, type) {
473 | if (angular.isObject(config.title)) {
474 | return config.title;
475 | }
476 | return isPieChart(type) ? null : {
477 | text: config.title,
478 | subtext: config.subtitle || '',
479 | x: 50
480 | };
481 | }
482 | function formatKMBT(y, formatter) {
483 | if (!formatter) {
484 | formatter = function (v) {
485 | return Math.round(v * 100) / 100;
486 | };
487 | }
488 | y = Math.abs(y);
489 | if (y >= 1000000000000) {
490 | return formatter(y / 1000000000000) + 'T';
491 | } else if (y >= 1000000000) {
492 | return formatter(y / 1000000000) + 'B';
493 | } else if (y >= 1000000) {
494 | return formatter(y / 1000000) + 'M';
495 | } else if (y >= 1000) {
496 | return formatter(y / 1000) + 'K';
497 | } else if (y < 1 && y > 0) {
498 | return formatter(y);
499 | } else if (y === 0) {
500 | return '';
501 | } else {
502 | return formatter(y);
503 | }
504 | }
505 | return {
506 | isPieChart: isPieChart,
507 | isAxisChart: isAxisChart,
508 | isHeatmapChart: isHeatmapChart,
509 | getAxisTicks: getAxisTicks,
510 | getSeries: getSeries,
511 | getLegend: getLegend,
512 | getTooltip: getTooltip,
513 | getTitle: getTitle,
514 | formatKMBT: formatKMBT
515 | };
516 | });
517 | 'use strict';
518 | /**
519 | * theme services
520 | * posible themes: infographic macarons shine dark blue green red gray default
521 | */
522 | angular.module('angular-echarts.theme', []).factory('theme', ['infographic', 'macarons', 'shine', 'dark', 'roma', function (infographic, macarons, shine, dark, roma) {
523 | var themes = {
524 | infographic: infographic,
525 | macarons: macarons,
526 | shine: shine,
527 | dark: dark,
528 | roma: roma,
529 | };
530 |
531 | return {
532 | get: function (name) {
533 | return themes[name] ? themes[name] : {};
534 | },
535 | };
536 |
537 | }]);
538 | 'use strict';
539 | /**
540 | * dark theme
541 | */
542 | angular.module('angular-echarts.theme').factory('dark', function () {
543 | var log = function (msg) {
544 | if (typeof console !== 'undefined') {
545 | console && console.error && console.error(msg);
546 | }
547 | };
548 | if (!echarts) {
549 | log('ECharts is not Loaded');
550 | return;
551 | }
552 | var contrastColor = '#eee';
553 | var axisCommon = function () {
554 | return {
555 | axisLine: { lineStyle: { color: contrastColor } },
556 | axisTick: { lineStyle: { color: contrastColor } },
557 | axisLabel: { textStyle: { color: contrastColor } },
558 | splitLine: {
559 | lineStyle: {
560 | type: 'dashed',
561 | color: '#aaa'
562 | }
563 | },
564 | splitArea: { areaStyle: { color: contrastColor } }
565 | };
566 | };
567 | var colorPalette = ['#dd6b66','#759aa0','#e69d87','#8dc1a9','#ea7e53','#eedd78','#73a373','#73b9bc','#7289ab', '#91ca8c','#f49f42'];
568 | var theme = {
569 | color: colorPalette,
570 | backgroundColor: '#333',
571 | tooltip: {
572 | axisPointer: {
573 | lineStyle: { color: contrastColor },
574 | crossStyle: { color: contrastColor }
575 | }
576 | },
577 | legend: { textStyle: { color: contrastColor } },
578 | textStyle: { color: contrastColor },
579 | title: { textStyle: { color: contrastColor } },
580 | toolbox: { iconStyle: { normal: { borderColor: contrastColor } } },
581 | dataZoom: { textStyle: { color: contrastColor } },
582 | timeline: {
583 | lineStyle: { color: contrastColor },
584 | itemStyle: { normal: { color: colorPalette[1] } },
585 | label: { normal: { textStyle: { color: contrastColor } } },
586 | controlStyle: {
587 | normal: {
588 | color: contrastColor,
589 | borderColor: contrastColor
590 | }
591 | }
592 | },
593 | timeAxis: axisCommon(),
594 | logAxis: axisCommon(),
595 | valueAxis: axisCommon(),
596 | categoryAxis: axisCommon(),
597 | line: { symbol: 'circle' },
598 | graph: { color: colorPalette },
599 | gauge: { title: { textStyle: { color: contrastColor } } },
600 | candlestick: {
601 | itemStyle: {
602 | normal: {
603 | color: '#FD1050',
604 | color0: '#0CF49B',
605 | borderColor: '#FD1050',
606 | borderColor0: '#0CF49B'
607 | }
608 | }
609 | }
610 | };
611 | theme.categoryAxis.splitLine.show = false;
612 | echarts.registerTheme('dark', theme);
613 | return theme;
614 | });
615 | 'use strict';
616 | /**
617 | * infographic theme
618 | */
619 | angular.module('angular-echarts.theme').factory('infographic', function () {
620 | var log = function (msg) {
621 | if (typeof console !== 'undefined') {
622 | console && console.error && console.error(msg);
623 | }
624 | };
625 | if (!echarts) {
626 | log('ECharts is not Loaded');
627 | return;
628 | }
629 | var colorPalette = [
630 | '#C1232B', '#27727B', '#FCCE10', '#E87C25', '#B5C334',
631 | '#FE8463', '#9BCA63', '#FAD860', '#F3A43B', '#60C0DD',
632 | '#D7504B', '#C6E579', '#F4E001', '#F0805A', '#26C0C0'
633 | ];
634 | var theme = {
635 | color: colorPalette,
636 | title: {
637 | textStyle: {
638 | fontWeight: 'normal',
639 | color: '#27727B'
640 | }
641 | },
642 | visualMap: { color: ['#C1232B', '#FCCE10'] },
643 | toolbox: { iconStyle: { normal: { borderColor: colorPalette[0] } } },
644 | tooltip: {
645 | backgroundColor: 'rgba(50,50,50,0.5)',
646 | axisPointer: {
647 | type: 'line',
648 | lineStyle: {
649 | color: '#27727B',
650 | type: 'dashed'
651 | },
652 | crossStyle: { color: '#27727B' },
653 | shadowStyle: { color: 'rgba(200,200,200,0.3)' }
654 | }
655 | },
656 | dataZoom: {
657 | dataBackgroundColor: 'rgba(181,195,52,0.3)',
658 | fillerColor: 'rgba(181,195,52,0.2)',
659 | handleColor: '#27727B'
660 | },
661 | categoryAxis: {
662 | axisLine: { lineStyle: { color: '#27727B' } },
663 | splitLine: { show: false }
664 | },
665 | valueAxis: {
666 | axisLine: { show: false },
667 | splitArea: { show: false },
668 | splitLine: {
669 | lineStyle: {
670 | color: ['#ccc'],
671 | type: 'dashed'
672 | }
673 | }
674 | },
675 | timeline: {
676 | lineStyle: { color: '#27727B' },
677 | controlStyle: {
678 | normal: {
679 | color: '#27727B',
680 | borderColor: '#27727B'
681 | }
682 | },
683 | symbol: 'emptyCircle',
684 | symbolSize: 3
685 | },
686 | line: {
687 | itemStyle: {
688 | normal: {
689 | borderWidth: 2,
690 | borderColor: '#fff',
691 | lineStyle: { width: 3 }
692 | },
693 | emphasis: { borderWidth: 0 }
694 | },
695 | symbol: 'circle',
696 | symbolSize: 3.5
697 | },
698 | candlestick: {
699 | itemStyle: {
700 | normal: {
701 | color: '#C1232B',
702 | color0: '#B5C334',
703 | lineStyle: {
704 | width: 1,
705 | color: '#C1232B',
706 | color0: '#B5C334'
707 | }
708 | }
709 | }
710 | },
711 | graph: { color: colorPalette },
712 | map: {
713 | label: {
714 | normal: { textStyle: { color: '#C1232B' } },
715 | emphasis: { textStyle: { color: 'rgb(100,0,0)' } }
716 | },
717 | itemStyle: {
718 | normal: {
719 | areaColor: '#ddd',
720 | borderColor: '#eee'
721 | },
722 | emphasis: { areaColor: '#fe994e' }
723 | }
724 | },
725 | gauge: {
726 | axisLine: {
727 | lineStyle: {
728 | color: [
729 | [0.2, '#B5C334'],
730 | [0.8, '#27727B'],
731 | [1, '#C1232B']
732 | ]
733 | }
734 | },
735 | axisTick: {
736 | splitNumber: 2,
737 | length: 5,
738 | lineStyle: { color: '#fff' }
739 | },
740 | axisLabel: { textStyle: { color: '#fff' } },
741 | splitLine: {
742 | length: '5%',
743 | lineStyle: { color: '#fff' }
744 | },
745 | title: { offsetCenter: [0, -20] }
746 | }
747 | };
748 | echarts.registerTheme('infographic', theme);
749 | return theme;
750 | });
751 | 'use strict';
752 | /**
753 | * macarons theme
754 | */
755 | angular.module('angular-echarts.theme').factory('macarons', function () {
756 | var log = function (msg) {
757 | if (typeof console !== 'undefined') {
758 | console && console.error && console.error(msg);
759 | }
760 | };
761 | if (!echarts) {
762 | log('ECharts is not Loaded');
763 | return;
764 | }
765 | var colorPalette = [
766 | '#2ec7c9','#b6a2de','#5ab1ef','#ffb980','#d87a80',
767 | '#8d98b3','#e5cf0d','#97b552','#95706d','#dc69aa',
768 | '#07a2a4','#9a7fd1','#588dd5','#f5994e','#c05050',
769 | '#59678c','#c9ab00','#7eb00a','#6f5553','#c14089'
770 | ];
771 | var theme = {
772 | color: colorPalette,
773 | title: {
774 | textStyle: {
775 | fontWeight: 'normal',
776 | color: '#008acd'
777 | }
778 | },
779 | visualMap: {
780 | itemWidth: 15,
781 | color: ['#5ab1ef','#e0ffff']
782 | },
783 | toolbox: { iconStyle: { normal: { borderColor: colorPalette[0] } } },
784 | tooltip: {
785 | backgroundColor: 'rgba(50,50,50,0.5)',
786 | axisPointer: {
787 | type: 'line',
788 | lineStyle: { color: '#008acd' },
789 | crossStyle: { color: '#008acd' },
790 | shadowStyle: { color: 'rgba(200,200,200,0.2)' }
791 | }
792 | },
793 | dataZoom: {
794 | dataBackgroundColor: '#efefff',
795 | fillerColor: 'rgba(182,162,222,0.2)',
796 | handleColor: '#008acd'
797 | },
798 | grid: { borderColor: '#eee' },
799 | categoryAxis: {
800 | axisLine: { lineStyle: { color: '#008acd' } },
801 | splitLine: { lineStyle: { color: ['#eee'] } }
802 | },
803 | valueAxis: {
804 | axisLine: { lineStyle: { color: '#008acd' } },
805 | splitArea: {
806 | show: true,
807 | areaStyle: { color: ['rgba(250,250,250,0.1)','rgba(200,200,200,0.1)'] }
808 | },
809 | splitLine: { lineStyle: { color: ['#eee'] } }
810 | },
811 | timeline: {
812 | lineStyle: { color: '#008acd' },
813 | controlStyle: {
814 | normal: { color: '#008acd' },
815 | emphasis: { color: '#008acd' }
816 | },
817 | symbol: 'emptyCircle',
818 | symbolSize: 3
819 | },
820 | line: {
821 | smooth: true,
822 | symbol: 'emptyCircle',
823 | symbolSize: 3
824 | },
825 | candlestick: {
826 | itemStyle: {
827 | normal: {
828 | color: '#d87a80',
829 | color0: '#2ec7c9',
830 | lineStyle: {
831 | color: '#d87a80',
832 | color0: '#2ec7c9'
833 | }
834 | }
835 | }
836 | },
837 | scatter: {
838 | symbol: 'circle',
839 | symbolSize: 4
840 | },
841 | map: {
842 | label: { normal: { textStyle: { color: '#d87a80' } } },
843 | itemStyle: {
844 | normal: {
845 | borderColor: '#eee',
846 | areaColor: '#ddd'
847 | },
848 | emphasis: { areaColor: '#fe994e' }
849 | }
850 | },
851 | graph: { color: colorPalette },
852 | gauge: {
853 | axisLine: {
854 | lineStyle: {
855 | color: [[0.2, '#2ec7c9'],[0.8, '#5ab1ef'],[1, '#d87a80']],
856 | width: 10
857 | }
858 | },
859 | axisTick: {
860 | splitNumber: 10,
861 | length: 15,
862 | lineStyle: { color: 'auto' }
863 | },
864 | splitLine: {
865 | length: 22,
866 | lineStyle: { color: 'auto' }
867 | },
868 | pointer: { width: 5 }
869 | }
870 | };
871 | echarts.registerTheme('macarons', theme);
872 | return theme;
873 | });
874 | 'use strict';
875 | /**
876 | * blue theme
877 | */
878 | angular.module('angular-echarts.theme').factory('roma', function () {
879 | var log = function (msg) {
880 | if (typeof console !== 'undefined') {
881 | console && console.error && console.error(msg);
882 | }
883 | };
884 | if (!echarts) {
885 | log('ECharts is not Loaded');
886 | return;
887 | }
888 | var colorPalette = ['#E01F54', '#001852', '#f5e8c8', '#b8d2c7', '#c6b38e',
889 | '#a4d8c2', '#f3d999', '#d3758f', '#dcc392', '#2e4783',
890 | '#82b6e9', '#ff6347', '#a092f1', '#0a915d', '#eaf889',
891 | '#6699FF', '#ff6666', '#3cb371', '#d5b158', '#38b6b6'
892 | ];
893 | var theme = {
894 | color: colorPalette,
895 | visualMap: {
896 | color: ['#e01f54', '#e7dbc3'],
897 | textStyle: { color: '#333' }
898 | },
899 | candlestick: {
900 | itemStyle: {
901 | normal: {
902 | color: '#e01f54',
903 | color0: '#001852',
904 | lineStyle: {
905 | width: 1,
906 | color: '#f5e8c8',
907 | color0: '#b8d2c7'
908 | }
909 | }
910 | }
911 | },
912 | graph: { color: colorPalette },
913 | gauge: {
914 | axisLine: {
915 | lineStyle: {
916 | color: [
917 | [0.2, '#E01F54'],
918 | [0.8, '#b8d2c7'],
919 | [1, '#001852']
920 | ],
921 | width: 8
922 | }
923 | }
924 | }
925 | };
926 | echarts.registerTheme('roma', theme);
927 | return echarts;
928 | });
929 | 'use strict';
930 | /**
931 | * shine theme
932 | */
933 | angular.module('angular-echarts.theme').factory('shine', function () {
934 | var log = function (msg) {
935 | if (typeof console !== 'undefined') {
936 | console && console.error && console.error(msg);
937 | }
938 | };
939 | if (!echarts) {
940 | log('ECharts is not Loaded');
941 | return;
942 | }
943 | var colorPalette = [
944 | '#c12e34', '#e6b600', '#0098d9', '#2b821d',
945 | '#005eaa', '#339ca8', '#cda819', '#32a487'
946 | ];
947 | var theme = {
948 | color: colorPalette,
949 | title: { textStyle: { fontWeight: 'normal' } },
950 | visualMap: { color: ['#1790cf', '#a2d4e6'] },
951 | toolbox: { iconStyle: { normal: { borderColor: '#06467c' } } },
952 | tooltip: { backgroundColor: 'rgba(0,0,0,0.6)' },
953 | dataZoom: {
954 | dataBackgroundColor: '#dedede',
955 | fillerColor: 'rgba(154,217,247,0.2)',
956 | handleColor: '#005eaa'
957 | },
958 | timeline: {
959 | lineStyle: { color: '#005eaa' },
960 | controlStyle: {
961 | normal: {
962 | color: '#005eaa',
963 | borderColor: '#005eaa'
964 | }
965 | }
966 | },
967 | candlestick: {
968 | itemStyle: {
969 | normal: {
970 | color: '#c12e34',
971 | color0: '#2b821d',
972 | lineStyle: {
973 | width: 1,
974 | color: '#c12e34',
975 | color0: '#2b821d'
976 | }
977 | }
978 | }
979 | },
980 | graph: { color: colorPalette },
981 | map: {
982 | label: {
983 | normal: { textStyle: { color: '#c12e34' } },
984 | emphasis: { textStyle: { color: '#c12e34' } }
985 | },
986 | itemStyle: {
987 | normal: {
988 | borderColor: '#eee',
989 | areaColor: '#ddd'
990 | },
991 | emphasis: { areaColor: '#e6b600' }
992 | }
993 | },
994 | gauge: {
995 | axisLine: {
996 | show: true,
997 | lineStyle: {
998 | color: [
999 | [0.2, '#2b821d'],
1000 | [0.8, '#005eaa'],
1001 | [1, '#c12e34']
1002 | ],
1003 | width: 5
1004 | }
1005 | },
1006 | axisTick: {
1007 | splitNumber: 10,
1008 | length: 8,
1009 | lineStyle: { color: 'auto' }
1010 | },
1011 | axisLabel: { textStyle: { color: 'auto' } },
1012 | splitLine: {
1013 | length: 12,
1014 | lineStyle: { color: 'auto' }
1015 | },
1016 | pointer: {
1017 | length: '90%',
1018 | width: 3,
1019 | color: 'auto'
1020 | },
1021 | title: { textStyle: { color: '#333' } },
1022 | detail: { textStyle: { color: 'auto' } }
1023 | }
1024 | };
1025 | echarts.registerTheme('shine', theme);
1026 | return theme;
1027 | });})();
--------------------------------------------------------------------------------
/dist/angular-echarts.min.js:
--------------------------------------------------------------------------------
1 | !function(){"use strict";function e(e,o,t,a){return function(o,r,l){function i(e){s=e.width||parseInt(l.width)||f||320,d=e.height||parseInt(l.height)||y||240,g.style.width=s+"px",g.style.height=d+"px"}function n(e,o,a){o=angular.extend({showXAxis:!0,showYAxis:!0,showLegend:!0},o);var r=angular.extend({orient:"top",axisLine:{show:!1}},angular.isObject(o.xAxis)?o.xAxis:{}),l=angular.extend({type:"value",orient:"right",scale:!1,axisLine:{show:!1},axisLabel:{formatter:function(e){return t.formatKMBT(e)}}},angular.isObject(o.yAxis)?o.yAxis:{}),i={title:t.getTitle(e,o,a),tooltip:t.getTooltip(e,o,a),legend:t.getLegend(e,o,a),toolbox:angular.extend({show:!1},angular.isObject(o.toolbox)?o.toolbox:{}),xAxis:t.isHeatmapChart(a)?o.xAxis:[angular.extend(t.getAxisTicks(e,o,a),r)],yAxis:t.isHeatmapChart(a)?o.yAxis:[l],graphic:o.graphic&&(angular.isObject(o.graphic)||angular.isArray(o.graphic))?o.graphic:[],series:t.getSeries(e,o,a),visualMap:o.visualMap?o.visualMap:null};return o.showXAxis||angular.forEach(i.xAxis,function(e){e.axisLine={show:!1},e.axisLabel={show:!1},e.axisTick={show:!1}}),o.showYAxis||angular.forEach(i.yAxis,function(e){e.axisLine={show:!1},e.axisLabel={show:!1},e.axisTick={show:!1}}),o.showLegend&&"gauge"!==a||delete i.legend,t.isAxisChart(a)||t.isHeatmapChart(a)||(delete i.xAxis,delete i.yAxis),o.dataZoom&&(i.dataZoom=angular.extend({show:!0,realtime:!0},o.dataZoom)),o.dataRange&&(i.dataRange=angular.extend({},o.dataRange)),o.polar&&(i.polar=o.polar),o.grid&&(i.grid=o.grid),i}function c(){if(o.data&&o.config){var t;if(i(o.config),u||(u=echarts.init(g,o.config.theme||"shine")),o.config.event&&(Array.isArray(o.config.event)||(o.config.event=[o.config.event]),Array.isArray(o.config.event)&&o.config.event.forEach(function(e){m[e.type]||(m[e.type]=!0,u.on(e.type,function(o){e.fn(o)}))})),angular.isString(o.data)){if(p)return;p=!0,u.showLoading({text:o.config.loading||"奋力加载中...",textStyle:x}),e.get(o.data).then(function(e){p=!1,u.hideLoading(),e.data.data?(t=n(e.data.data,o.config,a),o.config.forceClear&&u.clear(),t.series.length?(u.setOption(t),u.resize()):u.showLoading({text:o.config.errorMsg||"没有数据",textStyle:x})):u.showLoading({text:o.config.emptyMsg||"数据加载失败",textStyle:x})})}else t=n(o.data,o.config,a),o.config.forceClear&&u.clear(),t.series.length?(u.setOption(t),u.resize()):u.showLoading({text:o.config.errorMsg||"没有数据",textStyle:x});o.chartObj=u}}o.config=o.config||{};var s,d,u,g=r.find("div")[0],h=r.parent()[0],f=h.clientWidth,y=h.clientHeight,m={},p=!1,x={color:"red",fontSize:36,fontWeight:900,fontFamily:"Microsoft Yahei, Arial"};o.$watch(function(){return o.config},function(e){e&&c()},!0),o.$watch(function(){return o.data},function(e){e&&c()},!0)}}for(var o=angular.module("angular-echarts",["angular-echarts.theme","angular-echarts.util"]),t=["line","bar","area","pie","donut","gauge","map","radar","heatmap"],a=0,r=t.length;r>a;a++)!function(t){o.directive(t+"Chart",["$http","theme","util",function(o,a,r){return{restrict:"EA",template:'',scope:{config:"=config",data:"=data",chartObj:"=?chartObj"},link:e(o,a,r,t)}}])}(t[a]);angular.module("angular-echarts.util",[]).factory("util",function(){function e(e){return["pie","donut"].indexOf(e)>-1}function o(e){return["map"].indexOf(e)>-1}function t(e){return["line","bar","area"].indexOf(e)>-1}function a(e){return["heatmap"].indexOf(e)>-1}function r(e,o,t){var a=[];return e[0]&&angular.forEach(e[0].datapoints,function(e){a.push(e.x)}),{type:"category",boundaryGap:"bar"===t,data:a}}function l(r,l,i){var n=[];return angular.forEach(r,function(r){var c=[];angular.forEach(r.datapoints,function(e){c.push(e.y)});var s={type:i||"line",name:r.name,data:c};s=angular.extend(s,r),"area"===i&&(s.type="line",s.itemStyle=s.itemStyle||{normal:{areaStyle:{type:"default"}}}),"gauge"===i&&(s=angular.extend(s,{splitNumber:10,axisLine:{lineStyle:{color:[[.2,"#228b22"],[.8,"#48b"],[1,"#ff4500"]],width:8}},axisTick:{splitNumber:10,length:12,lineStyle:{color:"auto"}},axisLabel:{textStyle:{color:"auto"}},splitLine:{show:!0,length:30,lineStyle:{color:"auto"}},pointer:{width:5},title:{show:!0,offsetCenter:[0,"-40%"],textStyle:{fontWeight:"bolder"}},detail:{formatter:"{value}%",textStyle:{color:"auto",fontWeight:"bolder"}}},l.gauge||{})),t(i)||(s.data=[],angular.forEach(r.datapoints,function(e){s.data.push({value:e.y,name:e.x})})),e(i)&&(s.type="pie",s.center=l.center||["40%","50%"],s.radius=l.radius||"60%","donut"===i?(s.radius=l.radius||["50%","70%"],s=angular.extend(s,{itemStyle:{normal:{label:{show:!1},labelLine:{show:!1}},emphasis:{label:{show:!0,position:"center",textStyle:{fontSize:"50",fontWeight:"bold"}}}}},l.donut||{})):"pie"===i&&(s=angular.extend(s,{itemStyle:{normal:{label:{position:"inner",formatter:function(e){return(+e.percent).toFixed()+"%"}},labelLine:{show:!1}},emphasis:{label:{show:!0,formatter:"{b}\n{d}%"}}}},l.pie||{}))),o(i)&&(s.type="map",s=angular.extend(s,r,l.map||{})),l.stack&&(s.stack="total"),"radar"===i&&(s.data=r.data),a(i)&&(s.type="heatmap",s.name=r.name,s.data=r.data,s=angular.extend(s,{label:{normal:{show:!0}},itemStyle:{emphasis:{shadowBlur:10,shadowColor:"rgba(0, 0, 0, 0.5)"}}},l.heatmap||{})),n.push(s)}),n}function i(o,t,a){var r={data:[]};return e(a)?(o[0]&&angular.forEach(o[0].datapoints,function(e){r.data.push(e.x)}),r.orient="verticle",r.x="right",r.y="center"):"map"===a?r={}:(angular.forEach(o,function(e){r.data.push(e.name)}),r.orient="horizontal"),angular.extend(r,t.legend||{})}function n(e,o,t){var a={};switch(t){case"line":case"area":a.trigger="axis";break;case"pie":case"donut":case"bar":case"map":case"gauge":a.trigger="item"}return"pie"===t&&(a.formatter="{a}
{b}: {c} ({d}%)"),"map"===t&&(a.formatter="{b}"),angular.extend(a,angular.isObject(o.tooltip)?o.tooltip:{})}function c(o,t,a){return angular.isObject(t.title)?t.title:e(a)?null:{text:t.title,subtext:t.subtitle||"",x:50}}function s(e,o){return o||(o=function(e){return Math.round(100*e)/100}),e=Math.abs(e),e>=1e12?o(e/1e12)+"T":e>=1e9?o(e/1e9)+"B":e>=1e6?o(e/1e6)+"M":e>=1e3?o(e/1e3)+"K":1>e&&e>0?o(e):0===e?"":o(e)}return{isPieChart:e,isAxisChart:t,isHeatmapChart:a,getAxisTicks:r,getSeries:l,getLegend:i,getTooltip:n,getTitle:c,formatKMBT:s}}),angular.module("angular-echarts.theme",[]).factory("theme",["infographic","macarons","shine","dark","roma",function(e,o,t,a,r){var l={infographic:e,macarons:o,shine:t,dark:a,roma:r};return{get:function(e){return l[e]?l[e]:{}}}}]),angular.module("angular-echarts.theme").factory("dark",function(){var e=function(e){"undefined"!=typeof console&&console&&console.error&&console.error(e)};if(!echarts)return e("ECharts is not Loaded"),void 0;var o="#eee",t=function(){return{axisLine:{lineStyle:{color:o}},axisTick:{lineStyle:{color:o}},axisLabel:{textStyle:{color:o}},splitLine:{lineStyle:{type:"dashed",color:"#aaa"}},splitArea:{areaStyle:{color:o}}}},a=["#dd6b66","#759aa0","#e69d87","#8dc1a9","#ea7e53","#eedd78","#73a373","#73b9bc","#7289ab","#91ca8c","#f49f42"],r={color:a,backgroundColor:"#333",tooltip:{axisPointer:{lineStyle:{color:o},crossStyle:{color:o}}},legend:{textStyle:{color:o}},textStyle:{color:o},title:{textStyle:{color:o}},toolbox:{iconStyle:{normal:{borderColor:o}}},dataZoom:{textStyle:{color:o}},timeline:{lineStyle:{color:o},itemStyle:{normal:{color:a[1]}},label:{normal:{textStyle:{color:o}}},controlStyle:{normal:{color:o,borderColor:o}}},timeAxis:t(),logAxis:t(),valueAxis:t(),categoryAxis:t(),line:{symbol:"circle"},graph:{color:a},gauge:{title:{textStyle:{color:o}}},candlestick:{itemStyle:{normal:{color:"#FD1050",color0:"#0CF49B",borderColor:"#FD1050",borderColor0:"#0CF49B"}}}};return r.categoryAxis.splitLine.show=!1,echarts.registerTheme("dark",r),r}),angular.module("angular-echarts.theme").factory("infographic",function(){var e=function(e){"undefined"!=typeof console&&console&&console.error&&console.error(e)};if(!echarts)return e("ECharts is not Loaded"),void 0;var o=["#C1232B","#27727B","#FCCE10","#E87C25","#B5C334","#FE8463","#9BCA63","#FAD860","#F3A43B","#60C0DD","#D7504B","#C6E579","#F4E001","#F0805A","#26C0C0"],t={color:o,title:{textStyle:{fontWeight:"normal",color:"#27727B"}},visualMap:{color:["#C1232B","#FCCE10"]},toolbox:{iconStyle:{normal:{borderColor:o[0]}}},tooltip:{backgroundColor:"rgba(50,50,50,0.5)",axisPointer:{type:"line",lineStyle:{color:"#27727B",type:"dashed"},crossStyle:{color:"#27727B"},shadowStyle:{color:"rgba(200,200,200,0.3)"}}},dataZoom:{dataBackgroundColor:"rgba(181,195,52,0.3)",fillerColor:"rgba(181,195,52,0.2)",handleColor:"#27727B"},categoryAxis:{axisLine:{lineStyle:{color:"#27727B"}},splitLine:{show:!1}},valueAxis:{axisLine:{show:!1},splitArea:{show:!1},splitLine:{lineStyle:{color:["#ccc"],type:"dashed"}}},timeline:{lineStyle:{color:"#27727B"},controlStyle:{normal:{color:"#27727B",borderColor:"#27727B"}},symbol:"emptyCircle",symbolSize:3},line:{itemStyle:{normal:{borderWidth:2,borderColor:"#fff",lineStyle:{width:3}},emphasis:{borderWidth:0}},symbol:"circle",symbolSize:3.5},candlestick:{itemStyle:{normal:{color:"#C1232B",color0:"#B5C334",lineStyle:{width:1,color:"#C1232B",color0:"#B5C334"}}}},graph:{color:o},map:{label:{normal:{textStyle:{color:"#C1232B"}},emphasis:{textStyle:{color:"rgb(100,0,0)"}}},itemStyle:{normal:{areaColor:"#ddd",borderColor:"#eee"},emphasis:{areaColor:"#fe994e"}}},gauge:{axisLine:{lineStyle:{color:[[.2,"#B5C334"],[.8,"#27727B"],[1,"#C1232B"]]}},axisTick:{splitNumber:2,length:5,lineStyle:{color:"#fff"}},axisLabel:{textStyle:{color:"#fff"}},splitLine:{length:"5%",lineStyle:{color:"#fff"}},title:{offsetCenter:[0,-20]}}};return echarts.registerTheme("infographic",t),t}),angular.module("angular-echarts.theme").factory("macarons",function(){var e=function(e){"undefined"!=typeof console&&console&&console.error&&console.error(e)};if(!echarts)return e("ECharts is not Loaded"),void 0;var o=["#2ec7c9","#b6a2de","#5ab1ef","#ffb980","#d87a80","#8d98b3","#e5cf0d","#97b552","#95706d","#dc69aa","#07a2a4","#9a7fd1","#588dd5","#f5994e","#c05050","#59678c","#c9ab00","#7eb00a","#6f5553","#c14089"],t={color:o,title:{textStyle:{fontWeight:"normal",color:"#008acd"}},visualMap:{itemWidth:15,color:["#5ab1ef","#e0ffff"]},toolbox:{iconStyle:{normal:{borderColor:o[0]}}},tooltip:{backgroundColor:"rgba(50,50,50,0.5)",axisPointer:{type:"line",lineStyle:{color:"#008acd"},crossStyle:{color:"#008acd"},shadowStyle:{color:"rgba(200,200,200,0.2)"}}},dataZoom:{dataBackgroundColor:"#efefff",fillerColor:"rgba(182,162,222,0.2)",handleColor:"#008acd"},grid:{borderColor:"#eee"},categoryAxis:{axisLine:{lineStyle:{color:"#008acd"}},splitLine:{lineStyle:{color:["#eee"]}}},valueAxis:{axisLine:{lineStyle:{color:"#008acd"}},splitArea:{show:!0,areaStyle:{color:["rgba(250,250,250,0.1)","rgba(200,200,200,0.1)"]}},splitLine:{lineStyle:{color:["#eee"]}}},timeline:{lineStyle:{color:"#008acd"},controlStyle:{normal:{color:"#008acd"},emphasis:{color:"#008acd"}},symbol:"emptyCircle",symbolSize:3},line:{smooth:!0,symbol:"emptyCircle",symbolSize:3},candlestick:{itemStyle:{normal:{color:"#d87a80",color0:"#2ec7c9",lineStyle:{color:"#d87a80",color0:"#2ec7c9"}}}},scatter:{symbol:"circle",symbolSize:4},map:{label:{normal:{textStyle:{color:"#d87a80"}}},itemStyle:{normal:{borderColor:"#eee",areaColor:"#ddd"},emphasis:{areaColor:"#fe994e"}}},graph:{color:o},gauge:{axisLine:{lineStyle:{color:[[.2,"#2ec7c9"],[.8,"#5ab1ef"],[1,"#d87a80"]],width:10}},axisTick:{splitNumber:10,length:15,lineStyle:{color:"auto"}},splitLine:{length:22,lineStyle:{color:"auto"}},pointer:{width:5}}};return echarts.registerTheme("macarons",t),t}),angular.module("angular-echarts.theme").factory("roma",function(){var e=function(e){"undefined"!=typeof console&&console&&console.error&&console.error(e)};if(!echarts)return e("ECharts is not Loaded"),void 0;var o=["#E01F54","#001852","#f5e8c8","#b8d2c7","#c6b38e","#a4d8c2","#f3d999","#d3758f","#dcc392","#2e4783","#82b6e9","#ff6347","#a092f1","#0a915d","#eaf889","#6699FF","#ff6666","#3cb371","#d5b158","#38b6b6"],t={color:o,visualMap:{color:["#e01f54","#e7dbc3"],textStyle:{color:"#333"}},candlestick:{itemStyle:{normal:{color:"#e01f54",color0:"#001852",lineStyle:{width:1,color:"#f5e8c8",color0:"#b8d2c7"}}}},graph:{color:o},gauge:{axisLine:{lineStyle:{color:[[.2,"#E01F54"],[.8,"#b8d2c7"],[1,"#001852"]],width:8}}}};return echarts.registerTheme("roma",t),echarts}),angular.module("angular-echarts.theme").factory("shine",function(){var e=function(e){"undefined"!=typeof console&&console&&console.error&&console.error(e)};if(!echarts)return e("ECharts is not Loaded"),void 0;var o=["#c12e34","#e6b600","#0098d9","#2b821d","#005eaa","#339ca8","#cda819","#32a487"],t={color:o,title:{textStyle:{fontWeight:"normal"}},visualMap:{color:["#1790cf","#a2d4e6"]},toolbox:{iconStyle:{normal:{borderColor:"#06467c"}}},tooltip:{backgroundColor:"rgba(0,0,0,0.6)"},dataZoom:{dataBackgroundColor:"#dedede",fillerColor:"rgba(154,217,247,0.2)",handleColor:"#005eaa"},timeline:{lineStyle:{color:"#005eaa"},controlStyle:{normal:{color:"#005eaa",borderColor:"#005eaa"}}},candlestick:{itemStyle:{normal:{color:"#c12e34",color0:"#2b821d",lineStyle:{width:1,color:"#c12e34",color0:"#2b821d"}}}},graph:{color:o},map:{label:{normal:{textStyle:{color:"#c12e34"}},emphasis:{textStyle:{color:"#c12e34"}}},itemStyle:{normal:{borderColor:"#eee",areaColor:"#ddd"},emphasis:{areaColor:"#e6b600"}}},gauge:{axisLine:{show:!0,lineStyle:{color:[[.2,"#2b821d"],[.8,"#005eaa"],[1,"#c12e34"]],width:5}},axisTick:{splitNumber:10,length:8,lineStyle:{color:"auto"}},axisLabel:{textStyle:{color:"auto"}},splitLine:{length:12,lineStyle:{color:"auto"}},pointer:{length:"90%",width:3,color:"auto"},title:{textStyle:{color:"#333"}},detail:{textStyle:{color:"auto"}}}};return echarts.registerTheme("shine",t),t})}();
--------------------------------------------------------------------------------
/docs/china.js:
--------------------------------------------------------------------------------
1 | (function (root, factory) {
2 | if (typeof define === 'function' && define.amd) {
3 | // AMD. Register as an anonymous module.
4 | define(['exports', 'echarts'], factory);
5 | } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') {
6 | // CommonJS
7 | factory(exports, require('echarts'));
8 | } else {
9 | // Browser globals
10 | factory({}, root.echarts);
11 | }
12 | }(this, function (exports, echarts) {
13 | var log = function (msg) {
14 | if (typeof console !== 'undefined') {
15 | console && console.error && console.error(msg);
16 | }
17 | }
18 | if (!echarts) {
19 | log('ECharts is not Loaded');
20 | return;
21 | }
22 | if (!echarts.registerMap) {
23 | log('ECharts Map is not loaded')
24 | return;
25 | }
26 | echarts.registerMap('china', {"type":"FeatureCollection","features":[{"id":"710000","geometry":{"type":"MultiPolygon","coordinates":[["@@°Ü¯Û","@@ƛĴÕƊÉɼģºðʀ\\ƎsÆNŌÔĚänÜƤɊĂǀĆĴĤNJŨxĚĮǂƺòƌâÔ®ĮXŦţƸZûÐƕƑGđ¨ĭMó·ęcëƝɉlÝƯֹÅŃ^Ó·śŃNjƏďíåɛGɉ¿IċããF¥ĘWǬÏĶñÄ","@@\\p|WoYG¿¥Ij@","@@
¡@V^RqBbAnTXeQr©C","@@ÆEEkWqë I"]],"encodeOffsets":[[[122886,24033],[123335,22980],[122375,24193],[122518,24117],[124427,22618]]]},"properties":{"cp":[121.509062,25.044332],"name":"台湾","childNum":5}},{"id":"130000","geometry":{"type":"MultiPolygon","coordinates":[["@@\\aM`ǽÓnUK
Ĝēs¤©yrý§uģcJ»eIP]ªrºc_ħ²G¼s`jΟnüsÂľP","@@U`Ts¿mÄ","@@FOhđ©OiÃ`ww^ÌkÑH«ƇǤŗĺtFu
{Z}Ö@U´
ʚLg®¯Oı°Ãw ^VbÉsmA
ê]]w§RRl£ŭuwNÁ`ÇFēÝčȻuT¡Ĺ¯Õ¯sŗő£YªhVƍ£ƅnëYNgq¼ś¿µı²UºÝUąąŖóxV@tƯJ]eR¾fe|rHA|h~Ėƍl§ÏjVë` ØoÅbbx³^zÃͶSj®AyÂhðk`«P˵EFÛ¬Y¨Ļrõqi¼Wi°§Ð±²°`[À|ĠO@ÆxO\\ta\\p_Zõ^û{ġȧXýĪÓjùÎRb^λj{íděYfíÙTymńŵōHim½éŅaVcř§ax¹XŻácWU£ôãºQ¨÷Ñws¥qEHÙ|šYQoŕÇyáĂ£MðoťÊP¡mWO¡v{ôvîēÜISpÌhp¨ jdeŔQÖjX³àĈ[n`Yp@UcM`RKhEbpŞlNut®EtqnsÁgAiúoHqCXhfgu~ÏWP½¢G^}¯ÅīGCÑ^ãziMáļMTÃƘrMc|O_¯Ŏ´|morDkO\\mĆJfl@c̬¢aĦtRıÒXòë¬WP{ŵǫƝ
īÛ÷ąV×qƥV¿aȉd³BqPBmaËđŻģmÅ®V¹d^KKonYg¯XhqaLdu¥ÍpDž¡KąÅkĝęěhq}HyÃ]¹ǧ£
Í÷¿qágPmoei¤o^á¾ZEY^
Ný{nOl±Í@Mċèk§daNaÇį¿]øRiiñEūiDZàUtėGyl}ÓM}jpEC~¡FtoQiHkk{ILgĽxqÈƋÄdeVDJj£J|ÅdzÂFt~KŨ¸IÆv|¢r}èonb}`RÎÄn°ÒdÞ²^®lnÐèĄlðÓ×]ªÆ}LiñÖ`^°Ç¶p®đDcŋ`ZÔ¶êqvFÆN®ĆTH®¦O¾IbÐã´BĐɢŴÆíȦpĐÞXR·nndO¤OÀĈƒQgµFo|gȒęSWb©osx|hYhgŃfmÖĩnºTÌSp¢dYĤ¶UĈjlǐpäðëx³kÛfw²Xjz~ÂqbTÑěŨ@|oMzv¢ZrÃVw¬ŧˏf°ÐTªqs{S¯r æÝl¼ÖĞ džiGĘJ¼lr}~K¨ŸƐÌWö¼Þ°nÞoĦL|C~D©|q]SvKÑcwpÏÏĿćènĪWlĄkT}¬Tp~®Hgd˒ĺBVtEÀ¢ôPĎƗè@~kü\\rÊĔÖæW_§¼F´©òDòjYÈrbĞāøŀG{ƀ|¦ðrb|ÀH`pʞkvGpuARhÞÆǶgĘTǼƹS£¨¡ù³ŘÍ]¿ÂyôEP xX¶¹ÜO¡gÚ¡IwÃé¦ÅBÏ|ǰ
N«úmH¯âbęU~xĈbȒ{^xÖlD¸dɂ~"]],"encodeOffsets":[[[120023,41045],[121616,39981],[122102,42307]]]},"properties":{"cp":[114.502461,38.045474],"name":"河北","childNum":3}},{"id":"140000","geometry":{"type":"Polygon","coordinates":["@@ħÜ_ªlìwGkÛÃǏokćiµVZģ¡coTS˹ĪmnÕńehZg{gtwªpXaĚThȑp{¶Eh®RćƑP¿£PmcªaJyý{ýȥoÅîɡųAďä³aÏJ½¥PGąSMsWz½µÛYÓŖgxoOkĒCoȵ]¯_²ÕjāK~©ÅØ^ÔkïçămÏk]±cݯÑÃmQÍ~_apm
~ç¡qu{JÅŧ·Ls}EyÁÆcI{¤IiCfUcƌÃp§]ě«vD@¡SÀµMÅwuYY¡DbÑc¡h×]nkoQdaMç~eDÛtT©±@¥ù@É¡ZcW|WqOJmĩl«ħşvOÓ«IqăV¥D[mI~Ó¢cehiÍ]Ɠ~ĥqX·eƷn±}v[ěďŕ]_œ`¹§ÕōIo©bs^}Ét±ū«³p£ÿ¥WÑxçÁ«h×u×¥ř¾dÒ{ºvĴÎêÌɊ²¶ü¨|ÞƸµȲLLúÉƎ¤ϊęĔV`_bªS^|dzY|dz¥pZbÆ£¶ÒK}tĦÔņƠPYznÍvX¶Ěn ĠÔzý¦ª÷ÑĸÙUȌ¸dòÜJð´ìúNM¬XZ´¤ŊǸ_tldI{¦ƀðĠȤ¥NehXnYGR° ƬDj¬¸|CĞKqºfƐiĺ©ª~ĆOQª ¤@ìǦɌ²æBÊTĞHƘÁĪËĖĴŞȀÆÿȄlŤĒötνî¼ĨXh|ªM¤ÐzÞĩÒSrao³"],"encodeOffsets":[[117016,41452]]},"properties":{"cp":[112.549248,37.857014],"name":"山西","childNum":1}},{"id":"150000","geometry":{"type":"MultiPolygon","coordinates":[["@@ǪƫÌÛM
Ă[`ÕCn}¶Vc
ês¯PqFB
|S³C|kñHdiÄ¥sʼnÅ
PóÑÑE^ÅPpy_YtShQ·aHwsOnʼnÃs©iqjUSiº]ïW«gW¡ARëśijĘ
ů`çõh]y»ǃǛҤxÒm~zf}pf|ÜroÈzrKÈĵSƧżĠu~è¬vîS¼ĂhĖMÈÄw\\fŦ°W ¢¾luŸDw\\Ŗĝ","@@GVu»Aylßí¹ãe]Eāò³C¹ð¾²iÒAdkò^P²CǜңDŽ z¼g^èöŰ_IJĕê}gÁnUI«m
]jvV¼euhwqAaW_µj
»çjioQR¹ēÃßt@r³[ÛlćË^ÍÉáGOUÛOB±XkŹ£k|e]olkVͼÕqtaÏõjgÁ£§U^RLËnX°ÇBz^~wfvypV ¯ƫĉ˭ȫƗŷɿÿĿƑ˃ĝÿÃǃßËőó©ǐȍŒĖM×ÍEyxþp]ÉvïèvƀnÂĴÖ@V~Ĉ³MEĸÅĖtējyÄDXÄxGQuv_i¦aBçw˛wD©{tāmQ{EJ§KPśƘƿ¥@sCTÉ}ɃwƇy±gÑ}T[÷kÐ禫
SÒ¥¸ëBX½HáŵÀğtSÝÂa[ƣ°¯¦Pï¡]£ġÒk®G²èQ°óMq}EóƐÇ\\@áügQÍu¥FTÕ¿Jû]|mvāÎYua^WoÀa·ząÒot×¶CLƗi¯¤mƎHNJ¤îìɾŊìTdåwsRÖgĒųúÍġäÕ}Q¶¿A[¡{d×uQAMxVvMOmăl«ct[wº_ÇÊjb£ĦS_éQZ_lwgOiýe`YYJq¥IÁdz£ÙË[ÕªuƏ³ÍTs·bÁĽäė[b[ŗfãcn¥îC¿÷µ[ŏÀQōĉm¿Á^£mJVmL[{Ï_£F¥Ö{ŹA}
×Wu©ÅaųijƳhB{·TQqÙIķËZđ©Yc|M¡
LeVUóK_QWk_ĥ¿ãZ»X\\ĴuUèlG®ěłTĠğDŃGÆÍz]±
ŭ©Å]ÅÐ}UË¥©TċïxgckfWgi\\ÏĒ¥HkµEë{»ÏetcG±ahUiñiWsɁ·cCÕk]wȑ|ća}w
VaĚá G°ùnM¬¯{ÈÐÆA¥ÄêJxÙ¢hP¢ÛºµwWOóFÁz^ÀŗÎú´§¢T¤ǻƺSėǵhÝÅQgvBHouʝl_o¿Ga{ïq{¥|ſĿHĂ÷aĝÇqZñiñC³ª
»E`¨åXēÕqÉû[l}ç@čƘóO¿¡FUsAʽīccocÇS}£IS~ălkĩXçmĈ
ŀÐoÐdxÒuL^T{r@¢ÍĝKén£kQyÅõËXŷƏL§~}kq»IHėDžjĝ»ÑÞoå°qTt|r©ÏS¯·eŨĕx«È[eM¿yupN~¹ÏyN£{©għWí»Í¾səšDž_ÃĀɗ±ąijĉʍŌŷSÉA±åǥɋ@ë£R©ąP©}ĹªƏj¹erLDĝ·{i«ƫC½ÉshVz
GS|úþXgp{ÁX¿ć{ƱȏñZáĔyoÁhA}ŅĆfdʼn_¹Y°ėǩÑ¡H¯¶oMQqð¡Ë|Ñ`ƭŁX½·óÛxğįÅcQs«tȋDžFù^it«Č¯[hAi©á¥ÇĚ×l|¹y¯Kȝqgů{ñǙµïċĹzŚȭ¶¡oŽäÕG\\ÄT¿Òõr¯LguÏYęRƩɷŌO\\İТæ^Ŋ IJȶȆbÜGĝ¬¿ĚVĎgª^íu½jÿĕęjık@Ľ]ėl¥ËĭûÁėéV©±ćn©ȇÍq¯½YÃÔʼnÉNÑÅÝy¹NqáʅDǡËñƁYÅy̱os§ȋµʽǘǏƬɱàưN¢ƔÊuľýľώȪƺɂļxZĈ}ÌʼnŪĺœĭFЛĽ̅ȣͽÒŵìƩÇϋÿȮǡŏçƑůĕ~ǼȳÐUfdIxÿ\\G zâɏÙOº·pqy£@qþ@Ǟ˽IBäƣzsÂZÁàĻdñ°ŕzéØűzșCìDȐĴĺf®Àľưø@ɜÖÞKĊŇƄ§͑těï͡VAġÑÑ»d³öǍÝXĉĕÖ{þĉu¸ËʅğU̎éhɹƆ̗̮ȘNJ֥ड़ࡰţાíϲäʮW¬®ҌeרūȠkɬɻ̼ãüfƠSצɩςåȈHϚÎKdzͲOðÏȆƘ¼CϚǚ࢚˼ФÔ¤ƌĞ̪Qʤ´¼mȠJˀƲÀɠmɆDŽĜƠ´ǠN~ʢĜ¶ƌĆĘźʆȬ˪ĚǏĞGȖƴƀj`ĢçĶāàŃºēĢĖćYÀŎüôQÐÂŎŞdžŞêƖoˆDĤÕºÑǘÛˤ³̀gńƘĔÀ^ªƂ`ªt¾äƚêĦ¼ÐĔǎ¨Ȕ»͠^ˮÊȦƤøxRrŜH¤¸ÂxDÄ|ø˂˜ƮЬɚwɲFjĔ²Äw°dždÀÉ_ĸdîàŎjÊêTЪŌŜWÈ|tqĢUB~´°ÎFCU¼pĀēƄN¦¾O¶łKĊOjĚj´ĜYp{¦SĚÍ\\TתV÷Ší¨ÅDK°ßtŇĔK¨ǵÂcḷ̌ĚǣȄĽFlġUĵŇȣFʉɁMğįʏƶɷØŭOǽ«ƽū¹Ʊő̝Ȩ§ȞʘĖiɜɶʦ}¨֪ࠜ̀ƇǬ¹ǨE˦ĥªÔêFxúQEr´Wrh¤Ɛ \\talĈDJÜ|[Pll̚¸ƎGú´P¬W¦^¦H]prRn|or¾wLVnÇIujkmon£cX^Bh`¥V¦U¤¸}xRj[^xN[~ªxQ[`ªHÆÂExx^wN¶Ê|¨ìMrdYpoRzNyÀDs~bcfÌ`L¾n|¾T°c¨È¢ar¤`[|òDŞĔöxElÖdHÀI`Ď\\Àì~ÆR¼tf¦^¢ķ¶eÐÚMptgjɡČÅyġLûŇV®ÄÈƀϰP|ªVVªj¬ĚÒêp¬E|ŬÂ_~¼rƐK f{ĘFĒƌXưăkÃĄ}nµo×q£çkX{uĩ«āíÓUŅÝVUŌ]Ť¥lyň[oi{¦Lĸ
Ħ^ôâJ¨^UZðÚĒL¿Ìf£K£ʺoqNwğc`uetOj×°KJ±qÆġmĚŗos¬
qehqsuH{¸kH¡
ÊRǪÇƌbȆ¢´äÜ¢NìÉʖ¦â©Ɨؗ"]],"encodeOffsets":[[[128500,52752],[127089,51784]]]},"properties":{"cp":[111.670801,40.818311],"name":"内蒙古","childNum":2}},{"id":"210000","geometry":{"type":"MultiPolygon","coordinates":[["@@L@@s]","@@MnNm","@@dc","@@eÀC@b","@@f
XwkbrÄ`qg","@@^jtWQ","@@~ Y[c","@@I`ĖN^_¿ZÁM","@@Ïxnj{q_×^Gigp","@@iX¶B
Y","@@Y
Z","@@L_yG`b","@@^WqCTZ","@@\\[§t|]","@@m`p[","@@@é^BntaÊU]x ¯ÄPIJ°hʙK³VÕ@Y~|EvĹsǦL^pòŸÒG Ël]xxÄ_fT¤Ď¤cPC¨¸TVjbgH²sdÎdHt`B²¬GJję¶[ÐhjeXdlwhðSȦªVÊÏÆZÆŶ®²^ÎyÅHńĚDMħĜŁHkçvV[ij¼WYÀäĦ`XlR`ôLUVfK¢{NZdĒªYĸÌÚJRr¸SA|ƴgŴĴÆbvªØX~źB|¦ÕE¤Ð`\\|KUnnI]¤ÀÂĊnŎR®Ő¿¶\\ÀøíDm¦ÎbŨabaĘ\\ľã¸atÎSƐ´©v\\ÖÚÌǴ¤Â¨JKrZ_ZfjþhPkx`YRIjJcVf~sCN¤ EhæmsHy¨SðÑÌ\\\\ĐRÊwS¥fqŒßýáĞÙÉÖ[^¯ǤŲê´\\¦¬ĆPM¯£»uïpùzExanµyoluqe¦W^£ÊL}ñrkqWňûPUP¡ôJoo·U}£[·¨@XĸDXmÛݺGUCÁª½{íĂ^cjk¶Ã[q¤LÉö³cux«|Zd²BWÇ®Yß½ve±ÃCý£W{Ú^q^sÑ·¨ËMr¹·C¥GDrí@wÕKţëV·i}xËÍ÷i©ĝɝǡ]{c±OW³Ya±_ç©HĕoƫŇqr³Lys[ñ³¯OSďOMisZ±ÅFC¥Pq{Ã[Pg}\\¿ghćO
k^ĩÃXaĕËĥMoEqqZûěʼn³F¦oĵhÕP{¯~TÍlªNßYÐ{Ps{ÃVUeĎwk±ʼnVÓ½ŽJãÇÇ»Jm°dhcÀffdF~ĀeĖd`sx² ®EĦ¦dQÂd^~ăÔH¦\\LKpĄVez¤NP ǹÓRÆąJSha[¦´ÂghwmBШźhI|VV|p] ¼èNä¶ÜBÖ¼L`¼bØæKVpoúNZÞÒKxpw|ÊEMnzEQIZZNBčÚFÜçmĩWĪñtÞĵÇñZ«uD±|ƏlǗw·±PmÍada CLǑkùó¡³Ï«QaċÏOÃ¥ÕđQȥċƭy³ÁA"]],"encodeOffsets":[[[123686,41445],[126019,40435],[124393,40128],[126117,39963],[125322,40140],[126686,40700],[126041,40374],[125584,40168],[125509,40217],[125453,40165],[125362,40214],[125280,40291],[125774,39997],[125976,40496],[125822,39993],[122731,40949]]]},"properties":{"cp":[123.429096,41.796767],"name":"辽宁","childNum":16}},{"id":"220000","geometry":{"type":"Polygon","coordinates":["@@ñr½ÉKāGÁ¤ia Éȹ`\\xs¬dĆkNnuNUwNx¶c¸|\\¢
GªóĄ~RãÖÎĢùđŴÕhQxtcæëSɽʼníëlj£ƍG£nj°KƘµDsØÑpyƸ®¿bXp]vbÍZuĂ{n^IüÀSÖ¦EvRÎûh@â[ƏÈô~FNr¯ôçR±HÑlĢ^¤¢OðætxsŒ]ÞÁTĠs¶¿âÆGW¾ìA¦·TѬè¥ÏÐJ¨¼ÒÖ¼ƦɄxÊ~StD@Ă¼Ŵ¡jlºWvÐzƦZвCH AxiukdGgetqmcÛ£Ozy¥cE}|
¾cZ
k¿uŐã[oxGikfeäT@
SUwpiÚFM©£è^Ú`@v¶eňf heP¶täOlÃUgÞzŸU`l}ÔÆUvØ_Ō¬Öi^ĉi§²ÃB~¡ĈÚEgc|DC_Ȧm²rBx¼MÔ¦ŮdĨÃâYxƘDVÇĺĿg¿cwÅ\\¹¥Yĭl¤OvLjM_a W`zļMž·\\swqÝSAqŚij¯°kRē°wx^ĐkǂÒ\\]nrĂ}²ĊŲÒøãh·M{yMzysěnĒġV·°G³¼XÀ¤¹i´o¤ŃÈ`ÌDzÄUĞd\\iÖmÈBĤÜɲDEh LG¾ƀľ{WaYÍÈĢĘÔRîĐj}ÇccjoUb½{h§Ǿ{KƖµÎ÷GĄØŜçưÌs«lyiē«`å§H¥Ae^§GK}iã\\c]v©ģZmÃ|[M}ģTɟĵÂÂ`ÀçmFK¥ÚíÁbX³ÌQÒHof{]ept·GŋĜYünĎųVY^ydõkÅZW«WUa~U·SbwGçǑiW^qFuNĝ·EwUtW·Ýďæ©PuqEzwAVXRãQ`©GY
YhcUGorBd}ģÉb¡·µMicF«Yƅ»
é\\ɹ~ǙG³mØ©BšuT§Ĥ½¢Ã_ýL¡ûsT\\rke\\PnwAKy}ywdSefµ]UhĿD@mÿvaÙNSkCun
cÿ`lWėVâ¦÷~^fÏ~vwHCį`xqTlW«ï¸skmßEGqd¯R
©Ý¯¯S\\cZ¹iűƏCuƍÓXoR}M^o£
R}oªUF
uuXHlEÅÏ©¤ßgXþ¤D²ÄufàÀXXȱAc{Yw¬dvõ´KÊ£\\rµÄlidā]|DÂVH¹Þ®ÜWnCķ W§@\\¸~¤Vp¸póIO¢VOŇürXql~òÉK]¤¥Xrfkvzpm¶bwyFoúv𼤠N°ąO¥«³[éǣű]°Õ\\ÚÊĝôîŇÔaâBYlďQ[ Ë[ïÒ¥RI|`j]P"],"encodeOffsets":[[126831,44503]]},"properties":{"cp":[125.3245,43.886841],"name":"吉林","childNum":1}},{"id":"230000","geometry":{"type":"MultiPolygon","coordinates":[["@@UµNÿ¥īèçHÍøƕ¶Lǽ|g¨|a¾pVidd~ÈiíďÓQġėÇZÎXb½|ſÃH½KFgɱCģÛÇAnjÕc[VĝDZÃËÇ_ £ń³pj£º¿»WH´¯U¸đĢmtĜyzzNN|g¸÷äűѱĉā~mq^[ǁÑďlw]¯xQĔ¯l°řĴrBÞTxr[tޏĻN_yX`biNKu
P£kZĮ¦[ºxÆÀdhĹŀUÈƗCwáZħÄŭcÓ¥»NAw±qȥnD`{ChdÙFć}¢A±Äj¨]ĊÕjŋ«×`VuÓÅ~_kŷVÝyhVkÄãPsOµfgeŇ
µf@u_Ù ÙcªNªÙEojVxT@ãSefjlwH\\pŏäÀvlY½d{F~¦dyz¤PÜndsrhfHcvlwjF£G±DÏƥYyÏu¹XikĿ¦ÏqƗǀOŜ¨LI|FRĂn sª|C˜zxAè¥bfudTrFWÁ¹Am|ĔĕsķÆF´N}ć
UÕ@Áijſmuçuð^ÊýowFzØÎĕNőǏȎôªÌŒDŽàĀÄ˄ĞŀƒʀĀƘŸˮȬƬĊ°Uzouxe]}
AyÈW¯ÌmKQ]Īºif¸ÄX|sZt|½ÚUÎ lk^p{f¤lºlÆW A²PVÜPHÊâ]ÎĈÌÜk´\\@qàsĔÄQºpRij¼èi`¶bXrBgxfv»uUi^v~J¬mVp´£´VWrnP½ì¢BX¬hðX¹^TjVriªjtŊÄmtPGx¸bgRsT`ZozÆO]ÒFôÒOÆŊvÅpcGêsx´DR{AEOr°x|íb³Wm~DVjºéNNËܲɶGxŷCSt}]ûōSmtuÇÃĕNāg»íT«u}ç½BĵÞʣ¥ëÊ¡MÛ³ãȅ¡ƋaǩÈÉQG¢·lG|tvgrrf«ptęŘnÅĢrI²¯LiØsPf_vĠdxM prʹL¤¤eËÀđKïÙVY§]Ióáĥ]ķK¥j|pŇ\\kzţ¦šnņäÔVĂîά|vW®l¤èØrxm¶ă~lÄƯĄ̈́öȄEÔ¤ØQĄĄ»ƢjȦOǺ¨ìSŖÆƬyQv`cwZSÌ®ü±DŽ]ŀç¬B¬©ńzƺŷɄeeOĨSfm ĊƀP̎ēz©ĊÄÕÊmgÇsJ¥ƔŊśæÎÑqv¿íUOµªÂnĦÁ_½ä@êí
£P}Ġ[@gġ}gɊ×ûÏWXá¢užƻÌsNͽƎÁ§čŐAēeL³àydl¦ĘVçŁpśdžĽĺſÊQíÜçÛġÔsĕ¬Ǹ¯YßċġHµ ¡eå`ļrĉŘóƢFìĎWøxÊkƈdƬv|I|·©NqńRŀ¤éeŊŀàŀU²ŕƀBQ£Ď}L¹Îk@©ĈuǰųǨÚ§ƈnTËÇéƟÊcfčŤ^XmHĊĕË«W·ċëx³ǔķÐċJāwİ_ĸȀ^ôWr°oú¬Ħ
ŨK~ȰCĐ´Ƕ£fNÎèâw¢XnŮeÂÆĶ¾¾xäLĴĘlļO¤ÒĨA¢Êɚ¨®ØCÔ ŬGƠƦYĜĘÜƬDJg_ͥœ@čŅĻA¶¯@wÎqC½Ĉ»NăëKďÍQÙƫ[«ÃígßÔÇOÝáWñuZ¯ĥŕā¡ÑķJu¤E 寰WKɱ_d_}}vyõu¬ï¹ÓU±½@gÏ¿rýDg
Cdµ°MFYxw¿CG£Rƛ½Õ{]L§{qqą¿BÇƻğëܭNJË|c²}Fµ}ÙRsÓpg±QNqǫŋRwŕnéÑÉK«SeYR
ŋ@{¤SJ}D Ûǖ֍]gr¡µŷjqWÛham³~S«Ü[","@@ƨĶTLÇyqpÇÛqe{~oyen}s`qiXGù]Ëp½©lÉÁp]Þñ´FĂ^fäîºkàz¼BUv¬D"]],"encodeOffsets":[[[134456,44547],[127123,51780]]]},"properties":{"cp":[126.642464,45.756967],"name":"黑龙江","childNum":2}},{"id":"320000","geometry":{"type":"Polygon","coordinates":["@@Õg^vÁbnÀ`Jnĝ¬òM¶ĘTÖŒbe¦¦{¸ZâćNp©Hp|`mjhSEb\\afv`sz^lkljÄtg¤D¾X¿À|ĐiZȀåB·î}GL¢õcßjayBFµÏC^ĭcÙt¿sğH]j{s©HM¢QnDÀ©DaÜÞ·jgàiDbPufjDk`dPOîhw¡ĥ¥GP²ĐobºrYî¶aHŢ´ ]´rılw³r_{£DB_Ûdåuk|Ũ¯F Cºyr{XFye³Þċ¿ÂkĭB¿MvÛpm`rÚã@ƹhågËÖƿxnlč¶Åì½Ot¾dJlVJĂǀŞqvnO^JZż·Q}êÍÅmµÒ]ƍ¦Dq}¬R^èĂ´ŀĻĊIÔtIJyQŐĠMNtR®òLhĚs©»}OÓGZz¶A\\jĨFäOĤHYJvÞHNiÜaĎÉnFQlNM¤B´ĄNöɂtpŬdZÅglmuÇUšŞÚb¤uŃJŴu»¹ĄlȖħŴw̌ŵ²ǹǠ͛hĭłƕrçü±Yrřl¥i`ã__¢ćSÅr[Çq^ùzWmOĈaŐÝɞï²ʯʊáĘijĒǭPħ͍ôƋÄÄÍīçÛɈǥ£ÛmY`ó£Z«§°Ó³QafusNıDž_k}¢m[ÝóDµ¡RLčiXyÅNïă¡¸iĔÏNÌķoıdōîåŤûHcs}~Ûwbù¹£¦ÓCtOPrE^ÒogĉIµÛÅʹK
¤½phMú`mR¸¦PƚgÉLRs`£¯ãhD¨|³¤C"],"encodeOffsets":[[121451,32518]]},"properties":{"cp":[118.767413,32.041544],"name":"江苏","childNum":1}},{"id":"330000","geometry":{"type":"MultiPolygon","coordinates":[["@@jX^n
","@@sfdM","@@qP\\xz[_i","@@o\\VzRZ}mECy","@@R¢FX}°[m]","@@Cb\\}","@@e|v\\laus","@@v~s{","@@QxÂF©}","@@¹nvÞs©m","@@rQgYIh","@@bi«ZX","@@p[}ILd","@@À¿|","@@¹dnb
","@@rS}[Kl","@@g~h}","@@FlCk","@@ůTG°ĄLHm°UF","@@OdRe","@@v[u\\","@@FjâL~wyoo~sµLZ","@@¬e¹aH","@@\\nÔ¡q]L³ë\\ÿ®QÌ","@@ÊA©]ª","@@Kxv{","@@@hlIk_","@@pWcrxp","@@Md|_iA","@@¢
X£½z\\ðpN","@@hlÜ[LykAvyfw^E ","@@fp¤MusH","@@®_ma~LÁ¬`","@@@°¡mÛGĕ¨§Ianá[ýƤjfæÐNäGp","@@iMt\\","@@Zc[b","@@X®±GrưZæĉm","@@Z~dOSo|A¿qZv","@@@`EN£p","@@|s","@@@nDi","@@n
a£¾uYL¯Qª
mĉÅdMgÇjcº«ę¬K´B«Âącoċ\\xK`cįŧ«®á[~ıxu·ÅKsËÉc¢Ù\\ĭƛëbf¹ģSĜkáƉÔĈZB{aMµfzʼnfÓÔŹŁƋǝÊĉ{ğč±g³ne{çií´S¬\\ßðK¦w\\iqªĭiAuAµ_W¥ƣO\\lċĢttC¨£t`PZäuXßBsĻyekOđġĵHuXBµ]×\\°®¬F¢¾pµ¼kŘó¬Wät¸|@L¨¸µrºù³Ù~§WIZW®±Ð¨ÒÉx`²pĜrOògtÁZ{üÙ[|ûKwsPlU[}¦Rvn`hsª^nQ´ĘRWb_ rtČFIÖkĦPJ¶ÖÀÖJĈĄTĚòC ²@Pú
Øz©PCÈÚDZhŖl¬â~nm¨f©iļ«mntqÒTÜÄjL®EÌFª²iÊxبIÈhhst[Ôx}dtüGæţŔïĬaĸpMËÐj碷ðĄÆMzjWKĎ¢Q¶À_ê_@ıi«pZgf¤Nrq]§ĂN®«H±yƳí¾×ŊďŀĐÏŴǝĂíÀBŖÕªÁŐTFqĉ¯³ËCĕģi¨hÜ·ñt»¯Ï","@@ºwZRkĕWK "]],"encodeOffsets":[[[125785,31436],[125729,31431],[125513,31380],[125329,30690],[125223,30438],[125115,30114],[124815,29155],[124419,28746],[124095,28635],[124005,28609],[125000,30713],[125111,30698],[125078,30682],[125150,30684],[124014,28103],[125008,31331],[125411,31468],[125329,31479],[125369,31139],[125626,30916],[125417,30956],[125254,30976],[125199,30997],[125095,31058],[125083,30915],[124885,31015],[125218,30798],[124867,30838],[124755,30788],[124802,30809],[125267,30657],[125218,30578],[125200,30562],[125192,30787],[124968,30474],[125167,30396],[125115,30363],[124955,29879],[124714,29781],[124762,29462],[124325,28754],[124863,30077],[125366,31477]]]},"properties":{"cp":[120.153576,30.287459],"name":"浙江","childNum":43}},{"id":"340000","geometry":{"type":"MultiPolygon","coordinates":[["@@^iuLV\\","@@e©Edh","@@´CE¶zAXêeödK¡~H¸íæAȽd{ďÅÀ½W®£ChÃsikkly]_teu[bFaTign{]GqªoĈMYá|·¥f¥őaSÕėNµñĞ«Im_m¿Âa]uĜp
Z_§{Cäg¤°r[_YjÆOdý[I[á·¥Q_nùgL¾mzˆDÜÆ¶ĊJhpc¹O]iŠ]¥ jtsggDÑ¡w×jÉ©±EFËKiÛÃÕYv
sm¬njĻª§emná}k«ŕgđ²ÙDÇ¤í¡ªOy×Où±@DñSęćăÕIÕ¿IµĥOlJÕÍRÍ|JìĻÒåyķrĕq§ÄĩsWÆßF¶X®¿mw
RIÞfßoG³¾©uyHį{Ɓħ¯AFnuP
ÍÔzVdàôº^Ðæd´oG¤{S¬ćxã}ŧ×Kǥĩ«ÕOEзÖdÖsƘѨ[Û^Xr¢¼§xvÄÆµ`K§ tÒ´Cvlo¸fzŨð¾NY´ı~ÉĔē
ßúLÃÃ_ÈÏ|]ÂÏHlg`ben¾¢pUh~ƴ˶_r sĄ~cƈ]|r c~`¼{À{ȒiJjz`îÀT¥Û³
]u}f
ïQl{skloNdjäËzDvčoQďHI¦rbrHĖ~BmlNRaĥTX\\{fÁKÁ®TLÂÄMtÊgĀDĄXƔvDcÎJbt[¤D@®hh~kt°ǾzÖ@¾ªdbYhüóV´ŮŒ¨Üc±r@J|àuYÇÔG·ĚąĐlŪÚpSJ¨ĸLvÞcPæķŨ®mÐálsgd×mQ¨ųƩޤIÎs°KZpĄ|XwWdϵmkǀwÌÕæhºgBĝâqÙĊzÖgņtÀÁĂÆáhEz|WzqD¹°Eŧl{ævÜcA`¤C`|´qxIJkq^³³GšµbíZ
¹qpa±ď OH¦Ħx¢gPícOl_iCveaOjCh߸iÝbÛªCC¿mRV§¢A|tbkĜEÀtîm^g´fÄ"]],"encodeOffsets":[[[121722,32278],[119475,30423],[121606,33646]]]},"properties":{"cp":[117.283042,31.86119],"name":"安徽","childNum":3}},{"id":"350000","geometry":{"type":"MultiPolygon","coordinates":[["@@zht´}[","@@aj^~ĆGå","@@edH
se","@@@vPGsyQ","@@sBzddW[O","@@S¨Qy","@@NVucW","@@qptB@q","@@¸[iu","@@Q\\pD[_","@@jSwUappI","@@eXª~","@@AjvFoo","@@fT_Çí\\v|ba¦jZÆy|®","@@IjLg","@@wJIx«¼AoNe{M¥","@@K±¡ÓČ~N¾","@@k¡¹Eh~c®uDqZì¡I~Māe£bN¨gZý¡a±Öcp©PhI¢Qq
ÇGj|¥U g[Ky¬ŏv@OptÉEF\\@ åA¬V{XģĐBy
cpě
¼³Ăp·¤¥ohqqÚ¡ŅLs^á§qlÀhH¨MCe»åÇGD¥zPO£čÙkJA¼ßėuĕeûÒiÁŧS[¡Uûŗ½ùěcݧSùĩąSWó«íęACµeRåǃRCÒÇZÍ¢ź±^dlstjD¸ZpuÔâÃH¾oLUêÃÔjjēò´ĄWƛ
^Ñ¥Ħ@ÇòmOw¡õyJyD}¢ďÑÈġfZda©º²z£NjD°Ötj¶¬ZSÎ~¾c°¶ÐmxO¸¢Pl´SL|¥AȪĖMņIJg®áIJČĒü` QF¬h|ĂJ@zµ |ê³È ¸UÖŬŬÀCtrĸr]ðM¤ĶIJHtÏ AĬkvsq^aÎbvdfÊòSD´Z^xPsĂrvƞŀjJd×ŘÉ ®AΦĤdxĆqAZRÀMźnĊ»İÐZ YXæJyĊ²·¶q§·K@·{sXãô«lŗ¶»o½E¡«¢±¨Y®Ø¶^AvWĶGĒĢPlzfļtàAvWYãO_¤sD§ssČġ[kƤPX¦`¶®BBvĪjv©jx[L¥àï[F
¼ÍË»ğV`«Ip}ccÅĥZEãoP
´B@D¸m±z«Ƴ¿å³BRضWlâþäą`]Z£Tc ĹGµ¶Hm@_©k¾xĨôȉðX«½đCIbćqK³ÁÄš¬OAwã»aLʼnËĥW[ÂGIÂNxij¤D¢îĎÎB§°_JGs¥E@
¤uć
PåcuMuw¢BI¿]zG¹guĮI"]],"encodeOffsets":[[[123250,27563],[122541,27268],[123020,27189],[122916,27125],[122887,26845],[122808,26762],[122568,25912],[122778,26197],[122515,26757],[122816,26587],[123388,27005],[122450,26243],[122578,25962],[121255,25103],[120987,24903],[122339,25802],[121042,25093],[122439,26024]]]},"properties":{"cp":[119.306239,26.075302],"name":"福建","childNum":18}},{"id":"360000","geometry":{"type":"Polygon","coordinates":["@@ÖP¬ǦĪØLŨä~Ĉw«|TH£pc³Ïå¹]ĉđxe{ÎÓvOEm°BƂĨİ|Gvz½ª´HàpeJÝQxnÀWEµàXÅĪt¨ÃĖrÄwÀFÎ|Ă¡WÕ¸cf¥XaęST±m[r«_gmQu~¥V\\OkxtL E¢Ú^~ýØkbēqoě±_Êw§Ñ²ÏƟė¼mĉŹ¿NQ
YBąrwģcÍ¥BŗÊcØiIƝĿuqtāwO]³YCñTeÉcaubÍ]trluī
BÐGsĵıN£ï^ķqsq¿DūūVÕ·´Ç{éĈýÿOER_đûIċâJhŅıNȩĕB
¦K{Tk³¡OP·wnµÏd¯}½TÍ«YiµÕsC¯iM¤¦¯P|ÿUHvhe¥oFTuõ\\OSsMòđƇiaºćXĊĵà·çhƃ÷Ç{ígu^đgm[ÙxiIN¶Õ»lđÕwZSÆv©_ÈëJbVkĔVÀ¤P¾ºÈMÖxlò~ªÚàGĂ¢B±ÌKyñ`w²¹·
`gsÙfIěxŕeykpudjuTfb·hh¿Jd[\\LáƔĨƐAĈepÀÂMD~ņªe^\\^§ý©j×cZبzdÒa¶lÒJìõ`oz÷@¤u޸´ôęöY¼HČƶajlÞƩ¥éZ[|h}^U ¥pĄžƦO lt¸Æ Q\\aÆ|CnÂOjtĚĤdÈF`¶@Ðë ¦ōÒ¨SêvHĢÛ@[Æ
QoxHW[ŰîÀt¦DŽ~NĠ¢lĄtZoCƞÔºCxrpČNpj¢{f_Y`_eq®Aot`@oDXfkp¨|s¬\\DÄSfè©Hn¬
^DhÆyøJhØxĢĀLÊƠPżċĄwĮ¶"],"encodeOffsets":[[118923,30536]]},"properties":{"cp":[115.892151,28.676493],"name":"江西","childNum":1}},{"id":"370000","geometry":{"type":"MultiPolygon","coordinates":[["@@Xjd]mE","@@itnq","@@Dl@k","@@TGw","@@K¬U","@@Wd`c","@@PtMs","@@LnXlc","@@ppVu]Qn","@@cdzAU_","@@udRhnCE
","@@oIpP","@@M{ĿčwbxƨîKÎMĮ]ZF½Y]â£ph¶¨râøÀÎǨ¤^ºÄGz~grĚĜlĞÆLĆdž¢Îo¦cvKbgr°WhmZp L]LºcUÆnżĤÌĒbAnrOA´ȊcÀbƦUØrĆUÜøĬƞŶǬĴóò_Ä«ªdÎÉnb²ĦhņBĖįĦåXćì@L¯´ywƕCéõė ƿ¸lµZæyj|BíÂKNNnoƈfÈMZwnŐNàúÄsTJULîVjǎ¾ĒØDz²XPn±ŴPè¸ŔLƔÜƺ_TüÃĤBBċÈöA´faM¨{«M`¶d¡ôÖ°mȰBÔjj´PM|c^d¤u¤Û´ä«ƢfPk¶Môl]Lb}su^ke{lC
MrDÇ]NÑFsmoõľHyGă{{çrnÓEƕZGª¹Fj¢ÿ©}ÌCǷë¡ąuhÛ¡^KxC`C\\bÅxì²ĝÝ¿_NīCȽĿåB¥¢·IŖÕy\\¹kxãČáKµË¤ÁçFQ¡KtŵƋ]CgÏAùSedcÚźuYfyMmhUWpSyGwMPqŀÁ¼zK¶GY§Ë@´śÇµƕBm@IogZ¯uTMx}CVKï{éƵP_K«pÛÙqċtkkù]gTğwoɁsMõ³ăAN£MRkmEÊčÛbMjÝGu
IZGPģãħE[iµBEuDPÔ~ª¼ęt]ûG§¡QMsğNPŏįzs£Ug{đJĿļā³]ç«Qr~¥CƎÑ^n¶ÆéÎR~ݏYI] PumŝrƿIā[xedzL¯v¯s¬ÁY
~}
ťuŁgƋpÝĄ_ņī¶ÏSR´ÁP~¿Cyċßdwk´SsX|t`Ä ÈðAªìÎT°¦Dda^lĎDĶÚY°`ĪŴǒàŠv\\ebZHŖR¬ŢƱùęOÑM³FÛaj"]],"encodeOffsets":[[[123806,39303],[123821,39266],[123742,39256],[123702,39203],[123649,39066],[123847,38933],[123580,38839],[123894,37288],[123043,36624],[123344,38676],[123522,38857],[123628,38858],[118267,36772]]]},"properties":{"cp":[117.000923,36.675807],"name":"山东","childNum":13}},{"id":"410000","geometry":{"type":"MultiPolygon","coordinates":[["@@dXD}~Hgq~ÔN~zkĘHVsDzßjŬŢ`Pûàl¢\\ÀEhİgÞē X¼`khÍLùµP³swIÓzeŠĠð´E®ÚPtºIŊʺL«šŕQGYfa[şußǑĩų_Z¯ĵÙčC]kbc¥CS¯ëÍB©ïÇÃ_{sWTt³xlàcČzÀD}ÂOQ³ÐTĬµƑпŸghłŦv~}ÂZ«¤lPÇ£ªÝŴÅR§ØnhctâknÏľŹUÓÝdKuķI§oTũÙďkęĆH¸Ó\\Ä¿PcnS{wBIvÉĽ[GqµuŇôYgûZca©@½Õǽys¯}lgg@C\\£asIdÍuCQñ[L±ęk·ţb¨©kK»KC²òGKmĨS`UQnk}AGēsqaJ¥ĐGRĎpCuÌy ã iMcplk|tRkðev~^´¦ÜSí¿_iyjI|ȑ|¿_»d}q^{Ƈdă}tqµ`ŷ飩V¡om½ZÙÏÁRD|JOÈpÀRsI{ùÓjuµ{t}uËRivGçJFjµåkWê´MÂHewixGw½Yŷpµú³XU½ġyłåkÚwZX·l¢Á¢KzOÎÎjc¼htoDHr
|J½}JZ_¯iPq{tę½ĕ¦Zpĵø«kQ
Ť]MÛfaQpě±ǽ¾]uFu÷nčįADp}AjmcEÇaª³o³ÆÍSƇĈÙDIzçñİ^KNiÞñ[aA²zzÌ÷D|[íijgfÕÞd®|`Ć~oĠƑô³ŊD×°¯CsøÂ«ìUMhTº¨¸ǝêWÔDruÂÇZ£ĆPZW~ØØv¬gèÂÒw¦X¤Ā´oŬ¬²Ês~]®tªapŎJ¨Öº_ŔfŐ\\Đ\\Ĝu~m²Ƹ¸fWĦrƔ}Î^gjdfÔ¡J}\\n C¦þWxªJRÔŠu¬ĨĨmFdM{\\d\\YÊ¢ú@@¦ª²SÜsC}fNècbpRmlØ^gd¢aÒ¢CZZxvƶN¿¢T@uC¬^ĊðÄn|lIlXhun[","@@hzUq"]],"encodeOffsets":[[[116744,37216],[116480,33048]]]},"properties":{"cp":[113.665412,34.757975],"name":"河南","childNum":2}},{"id":"420000","geometry":{"type":"MultiPolygon","coordinates":[["@@ASd","@@ls{d","@@¾«}{ra®pîÃ\\{øCËyyB±b\\òÝjKL ]ĎĽÌJyÚCƈćÎT´Å´pb©ÈdFin~BCo°BĎÃømv®E^vǾ½Ĝ²RobÜeN^ĺ£R¬lĶ÷YoĖ¥Ě¾|sOr°jY`~I¾®I{GqpCgyl{£ÍÍyPL¡¡¸kWxYlÙæŁĢz¾V´W¶ùŸo¾ZHxjwfxGNÁ³Xéæl¶EièIH ujÌQ~v|sv¶Ôi|ú¢FhQsğ¦SiŠBgÐE^ÁÐ{čnOÂÈUÎóĔÊēIJ}Z³½Mŧïeyp·uk³DsѨL¶_Åuèw»¡WqÜ]\\Ò§tƗcÕ¸ÕFÏǝĉăxŻČƟOKÉġÿ×wg÷IÅzCg]m«ªGeçÃTC«[t§{loWeC@ps_Bprf_``Z|ei¡oċMqow¹DƝÓDYpûsYkıǃ}s¥ç³[§cY§HK«Qy]¢wwö¸ïx¼ņ¾Xv®ÇÀµRĠÐHM±cÏdƒǍũȅȷ±DSyúĝ£ŤĀàtÖÿï[îb\\}pĭÉI±Ñy
¿³x¯No|¹HÏÛmjúË~TuęjCöAwě¬Rđl¯ ÑbŇTĿ_[IčĄʿnM¦ğ\\É[T·k¹©oĕ@A¾wya¥Y\\¥Âaz¯ãÁ¡k¥ne£ÛwE©Êō¶˓uoj_U¡cF¹[WvP©whuÕyBF`RqJUw\\i¡{jEPïÿ½fć
QÑÀQ{°fLÔ~wXgītêݾĺHd³fJd]HJ²
EoU¥HhwQsƐ»Xmg±çve]DmÍPoCc¾_hhøYrŊU¶eD°Č_N~øĹĚ·`z]Äþp¼
äÌQv\\rCé¾TnkžŐÚÜa¼ÝƆ̶Ûo
d
ĔňТJqPb ¾|J¾fXƐîĨ_Z¯À}úƲN_ĒÄ^ĈaŐyp»CÇÄKñL³ġM²wrIÒŭxjb[n«øæà ^²h¯ÚŐªÞ¸Y²ĒVø}Ā^İ´LÚm¥ÀJÞ{JVųÞŃx×sxxƈē ģMřÚðòIfĊŒ\\Ʈ±ŒdʧĘDvČ_Àæ~Dċ´A®µ¨ØLV¦êHÒ¤"]],"encodeOffsets":[[[113712,34000],[115612,30507],[113649,34054]]]},"properties":{"cp":[114.298572,30.584355],"name":"湖北","childNum":3}},{"id":"430000","geometry":{"type":"MultiPolygon","coordinates":[["@@nFZw","@@ãÆá½ÔXrCO
ËRïÿĩTooQyÓ[ŅBE¬ÎÓXaį§Ã¸G °ITxpúxÚij¥Ï̾edÄ©ĸG
àGhM¤Â_U}Ċ}¢pczfþg¤ÇôAV","@@ȴÚĖÁĐiOĜ«BxDõĚivSÌ}iùÜnкG{p°M°yÂÒzJ²Ì ÂcXëöüiáÿñőФùTz²CȆȸǎŪƑÐc°dPÎğ˶[Ƚu¯½WM¡ÉB·rínZÒ `¨GA¾\\pēXhÃRCüWGġu
Té§ŎÑ©êLM³}_EÇģc®ęisÁPDmÅ{b[RÅs·kPŽƥóRoOV~]{g\\êYƪ¦kÝbiċƵGZ»Ěõ
ó·³vŝ£ø@pyö_ëIkѵbcѧy
×dYتiþUjҳC}ÁN»hĻħƏâƓKA·³CQ±µ§¿AUƑ¹AtćOwD]JUÖgk¯b£ylZFËѱH}EbóľA¡»Ku¦·³åş¥ùBD^{ÌC´¦ŷJ£^[ª¿ğ|ƅ
N
skóā¹¿ï]ă~÷O§@Vm¡Qđ¦¢Ĥ{ºjÔª¥nf´~Õo×ÛąGû¥cÑ[Z¶ŨβSÊǔƐƀAÚŌ¦Qؼrŭ«}NÏürʬmjr@ĘrTW SsdHzƓ^ÇÂyUi¯DÅYlŹu{hT}mĉ¹¥ěDÿë©ıÓ[Oº£¥ótł¹MÕƪ`P
DiÛU¾ÅâìUñBÈ£ýhedy¡oċ`pfmjP~kZa
ZsÐd°wj§@Ĵ®w~^kÀÅKvNmX\\¨aŃqvíó¿F¤¡@ũÑVw}S@j}¾«pĂrªg àÀ²NJ¶¶Dô
K|^ª°LX¾ŴäPα£EXd^¶IJÞÜ~u¸ǔMRhsR
e`ÄofIÔ\\Ø ićymnú¨cj ¢»GČìƊÿШXeĈ¾Oð Fi ¢|[jVxrIQ_EzAN¦zLU`cªxOTu RLĪpUĪȴ^ŎµªÉFx
Üf¤ºgIJèy°Áb[¦Zb¦z½xBĖ@ªpºjS´rVźOd©ʪiĎăJP`"]],"encodeOffsets":[[[115640,30489],[112577,27316],[114113,30649]]]},"properties":{"cp":[112.982279,28.19409],"name":"湖南","childNum":3}},{"id":"440000","geometry":{"type":"MultiPolygon","coordinates":[["@@QdAsa","@@lxDRm","@@sbhNLo","@@Ă ý","@@WltOY[","@@Kr]S","@@e~AS}","@@I|Mym","@@Û³LS²Q","@@nvºBë¥cÕº","@@zdÛJm","@@°³","@@a yAª¸ËJIxØ@ĀHÉÕZofo
o","@@sŗÃÔėAƁZÄ ~°ČPºb","@@¶ÝÌvmĞh¹Ĺ","@@HdSjĒ¢D}war
u«ZqadY{K","@@el\\LqqO","@@~rMmX","@@f^E","@@øPªoj÷ÍÝħXČx°Q¨ıXJp","@@gÇƳmxatfu","@@EÆC½","@@¸B_¶ekWvSivc}p}Ăº¾NĎyj¦Èm th_®Ä}»âUzL˲Aā¡ßH©Ùñ}wkNÕ¹ÇO½¿£ēUlaUìIǪ`uTÅxYĒÖ¼kÖµMjJÚwn\\hĒv]îh|ÈƄøèg¸Ķß ĉĈWb¹ƀdéĘNTtP[öSvrCZaGubo´ŖÒÇĐ~¡zCI
özx¢PnÈñ @ĥÒ¦]ƜX³ăĔñiiÄÓVépKG½ÄÓávYoC·sitiaÀyŧΡÈYDÑům}ý|m[węõĉZÅxUO}÷N¹³ĉo_qtăqwµŁYÙǝŕ¹tïÛUïmRCº
ĭ|µÕÊK½Rē ó]GªęAxNqSF|ām¡diď×YïYWªʼnOeÚtĐ«zđ¹T
āúEáÎÁWwíHcòßÎſ¿Çdğ·ùT×Çūʄ¡XgWÀLJğ·¿ÃOj YÇ÷Sğ³kzőõmĝ[³¡VÙæÅöM̳¹pÁaËýý©D©ÜJŹƕģGą¤{Ùū
ÇO²«BƱéAÒĥ¡«BhlmtÃPµyU¯ucd·w_bŝcīímGOGBȅŹãĻFŷŽŕ@Óoo¿ē±ß}}ÓF÷tIJWÈCőâUâǙIğʼn©IijE×
Á³AĥDĈ±ÌÜÓĨ£L]ĈÙƺZǾĆĖMĸĤfÎĵlŨnÈĐtFFĤêk¶^k°f¶g}®Faf`vXŲxl¦ÔÁ²¬Ð¦pqÊ̲iXØRDÎ}Ä@ZĠsx®AR~®ETtĄZƈfŠŠHâÒÐAµ\\S¸^wĖkRzalŜ|E¨ÈNĀňZTpBh£\\ĎƀuXĖtKL¶G|»ĺEļĞ~ÜĢÛĊrOÙîvd]n¬VÊĜ°RÖpMƀ¬HbwEÀ©\\
¤]ŸI®¥D³|Ë]CúAЦ
æ´¥¸Lv¼¢ĽBaôF~®²GÌÒEYzk¤°ahlVÕI^CxĈPsBƒºVÀB¶¨R²´D","@@OR"]],"encodeOffsets":[[[117381,22988],[116552,22934],[116790,22617],[116973,22545],[116444,22536],[116931,22515],[116496,22490],[116453,22449],[113301,21439],[118726,21604],[118709,21486],[113210,20816],[115482,22082],[113171,21585],[113199,21590],[115232,22102],[115739,22373],[115134,22184],[113056,21175],[119573,21271],[119957,24020],[115859,22356],[116680,26053],[116561,22649]]]},"properties":{"cp":[113.280637,23.125178],"name":"广东","childNum":24}},{"id":"450000","geometry":{"type":"MultiPolygon","coordinates":[["@@H TI¡U","@@Ɣ_LÊFZg
čPkini«qÇczÍY®¬Ů»qR×ō©DÕ§ƙǃŵTÉĩ±ıdÑnYYIJvNĆĆØÜ Öp}e³¦m©iÓ|¹ħņ|ª¦QF¢Â¬ʖovg¿em^ucäāmÇÖåB¡Õçĝ}FϼĹ{µHKsLSđƃrč¤[AgoSŇYMÿ§Ç{FśbkylQxĕ]T·¶[B
ÑÏGáşşƇe
ăYSsFQ}BwtYğÃ@~
CÍQ ×Wj˱rÉ¥oÏ ±«ÓÂ¥kwWűue_bE~µh¯ecl¯Ïr¯EģJğ}w³Ƈē`ãògK_ÛsUʝćğ¶höO¤Ǜn³c`¡yię[ďĵűMę§]XÎ_íÛ]éÛUćİÕBƣ±
dy¹T^dûÅÑŦ·PĻþÙ`K¦
¢ÍeĥR¿³£[~äu¼dltW¸oRM¢ď\\z}Æzdvň{ÎXF¶°Â_ÒÂÏL©ÖTmu¼ãlīkiqéfA·Êµ\\őDc¥ÝFyÔćcűH_hLÜêĺШc}rn`½Ì@¸¶ªVLhŒ\\Ţĺk~Ġið°|gtTĭĸ^xvKVGréAébUuMJVÃO¡
qĂXËSģãlýà_juYÛÒBG^éÖ¶§EGÅzěƯ¤EkN[kdåucé¬dnYpAyČ{`]þ±X\\ÞÈk¡ĬjàhÂƄ¢Hè ŔâªLĒ^Öm¶ħĊAǦė¸zÚGn£¾rªŀÜt¬@ÖÚSx~øOŒŶÐÂæȠ\\ÈÜObĖw^oÞLf¬°bI lTØBÌF£Ć¹gñĤaYt¿¤VSñK¸¤nM¼JE±½¸ñoÜCƆæĪ^ĚQÖ¦^f´QüÜÊz¯lzUĺš@ìp¶n]sxtx¶@~ÒĂJb©gk{°~c°`Ô¬rV\\la¼¤ôá`¯¹LCÆbxEræOv[H[~|aB£ÖsºdAĐzNÂðsÞÆ
Ĥªbab`ho¡³F«èVZs\\\\ÔRzpp®SĪº¨ÖºN
ijd`a¦¤F³¢@`¢ĨĀìhYvlĆº¦Ċ~nS|gźv^kGÆÀè·"]],"encodeOffsets":[[[111707,21520],[113706,26955]]]},"properties":{"cp":[108.320004,22.82402],"name":"广西","childNum":2}},{"id":"460000","geometry":{"type":"Polygon","coordinates":["@@¦Ŝil¢XƦƞòïè§ŞCêɕrŧůÇąĻõ·ĉ³œ̅kÇm@ċȧŧĥĽʉƅſȓÒ˦ŝE}ºƑ[ÍĜȋ gÎfǐÏĤ¨êƺ\\Ɔ¸ĠĎvʄȀоjNðĀÒRZdžzÐĊ¢DÀɘZ"],"encodeOffsets":[[112750,20508]]},"properties":{"cp":[110.33119,20.031971],"name":"海南","childNum":1}},{"id":"510000","geometry":{"type":"MultiPolygon","coordinates":[["@@LqSn","@@ĆOìÛÐ@ĞǔNY{¤Á§d
i´ezÝúØãwIþËQǦÃqÉSJ»ĂéʔõÔƁİlƞ¹§ĬqtÀƄmÀêErĒtD®ċæcQE®³^ĭ¥©l}äQtoŖÜqÆkµªÔĻĴ¡@Ċ°B²Èw^^RsºT£ڿQPJvÄz^Đ¹Æ¯fLà´GC²dtĀRt¼¤ĦOðğfÔðDŨŁĞƘïPÈ®âbMüÀXZ ¸£@Å»»QÉ]dsÖ×_Í_ÌêŮPrĔĐÕGĂeZÜîĘqBhtO ¤tE[h|YÔZśÎs´xº±Uñt|OĩĠºNbgþJy^dÂY Į]Řz¦gC³R`Āz¢Aj¸CL¤RÆ»@Ŏk\\Ç´£YW}z@Z}öoû¶]´^NÒ}èNªPÍy¹`S°´ATeVamdUĐwʄvĮÕ\\uÆŗ¨Yp¹àZÂmWh{á}WØǍÉüwga§ßAYrÅÂQĀÕ¬LŐý®Xøxª½Ű¦¦[þ`ÜUÖ´òrÙŠ°²ÄkijnDX{U~ET{ļº¦PZcjF²Ė@pg¨B{u¨ŦyhoÚD®¯¢ WòàFΤ¨GDäz¦kŮPġqË¥À]eâÚ´ªKxīPÖ|æ[xäJÞĥsNÖ½I¬nĨY´®ÐƐmDŝuäđđEb
ee_v¡}ìęNJē}qÉåT¯µRs¡M@}ůaa¯wvƉåZw\\Z{åû`[±oiJDŦ]ĕãïrG réÏ·~ąSfy×Í·ºſƽĵȁŗūmHQ¡Y¡®ÁÃ×t«T¤JJJyJÈ`Ohߦ¡uËhIyCjmÿw
ZG
TiSsOB²fNmsPa{M{õE^Hj}gYpaeu¯oáwHjÁ½M¡pMuåmni{fk\\oÎqCwEZ¼KĝAy{m÷LwO×SimRI¯rKõBS«sFe]fµ¢óY_ÆPRcue°Cbo×bd£ŌIHgtrnyPt¦foaXďxlBowz_{ÊéWiêEGhܸºuFĈIxf®Y½ĀǙ]¤EyF²ċw¸¿@g¢§RGv»áW`ÃĵJwi]t¥wO½a[×]`ÃiüL¦LabbTÀåc}ÍhÆh®BHî|îºÉk¤Sy£ia©taį·Ɖ`ō¥UhO
ĝLk}©Fos´JmµlŁu
ønÑJWΪYÀïAetTŅÓGË«bo{ıwodƟ½OġܵxàNÖ¾P²§HKv¾]|BÆåoZ`¡Ø`ÀmºĠ~ÌЧnÇ
¿¤]wğ@srğu~Io[é±¹ ¿ſđÓ@qg¹zƱřaí°KtǤV»Ã[ĩǭƑ^ÇÓ@áťsZÏÅĭƋěpwDóÖáŻneQËq·GCœýS]x·ýq³OÕ¶Qzßti{řáÍÇWŝŭñzÇWpç¿JXĩè½cFÂLiVjx}\\NŇĖ¥GeJA¼ÄHfÈu~¸Æ«dE³ÉMA|bÒ
ćhG¬CMõƤąAvüVéŀ_V̳ĐwQj´·ZeÈÁ¨X´Æ¡Qu·»ÕZ³ġqDoy`L¬gdp°şp¦ėìÅĮZ°Iähzĵf²å ĚÑKpIN|Ñz]ń
·FU×é»R³MÉ»GM«kiér}Ã`¹ăÞmÈnÁîRǀ³ĜoİzŔwǶVÚ£À]ɜ»ĆlƂ²Ġ
þTº·àUȞÏʦ¶I«dĽĢdĬ¿»Ĕ×h\\c¬ä²GêëĤł¥ÀǿżÃÆMº}BÕĢyFVvwxBèĻĒ©Ĉt@Ğû¸£B¯¨ˋäßkķ½ªôNÔ~t¼Ŵu^s¼{TA¼ø°¢İªDè¾Ň¶ÝJ®Z´ğ~Sn|ªWÚ©òzPOȸbð¢|øĞA"]],"encodeOffsets":[[[108815,30935],[100197,35028]]]},"properties":{"cp":[104.065735,30.659462],"name":"四川","childNum":2}},{"id":"520000","geometry":{"type":"MultiPolygon","coordinates":[["@@G\\lY£cj","@@q|mc¯vÏV","@@hÑ£IsNgßHHªķÃh_¹¡ĝħń¦uÙùgS¯JH|sÝÅtÁïyMDč»eÕtA¤{b\\}G®u\\åPFqwÅaD
K°ºâ_£ùbµmÁÛĹM[q|hlaªāI}ѵ@swtwm^oµD鼊yVky°ÉûÛR
³e¥]RÕěħ[ƅåÛDpJiVÂF²I
»mN·£LbÒYbWsÀbpkiTZĄă¶Hq`
ĥ_J¯ae«KpÝx]aĕÛPÇȟ[ÁåŵÏő÷Pw}TÙ@Õs«ĿÛq©½m¤ÙH·yǥĘĉBµĨÕnđ]K©œáGçş§ÕßgǗĦTèƤƺ{¶ÉHÎd¾ŚÊ·OÐjXWrãLyzÉAL¾ę¢bĶėy_qMĔąro¼hĊw¶øV¤w²Ĉ]ÊKx|`ź¦ÂÈdrcÈbe¸`I¼čTF´¼Óýȃr¹ÍJ©k_șl³´_pĐ`oÒh¶pa^ÓĔ}D»^Xy`d[Kv
JPhèhCrĂĚÂ^Êƌ wZLĠ£ÁbrzOIlMMĪŐžËr×ÎeŦtw|¢mKjSǘňĂStÎŦEtqFT¾E쬬ôxÌO¢ K³ŀºäYPVgŎ¦Ŋm޼VZwVlz¤
£Tl®ctĽÚó{GAÇge~Îd¿æaSba¥KKûj®_Ä^\\ؾbP®¦x^sxjĶI_Ä Xâ¼Hu¨Qh¡À@Ëô}±GNìĎlT¸
`V~R°tbÕĊ`¸úÛtÏFDu[MfqGH·¥yAztMFe|R_GkChZeÚ°tov`xbDnÐ{E}ZèxNEÞREn[Pv@{~rĆAB§EO¿|UZ~ìUf¨J²ĂÝÆsªB`s¶fvö¦Õ~dÔq¨¸º»uù[[§´sb¤¢zþF¢Æ
ÀhÂW\\ıËIÝo±ĭŠ£þÊs}¡R]ěDg´VG¢j±®èºÃmpU[Á뺰rÜbNu¸}º¼`niºÔXĄ¤¼ÔdaµÁ_Ã
ftQQgR·Ǔv}Ý×ĵ]µWc¤F²OĩųãW½¯K©
]{LóµCIµ±Mß¿h©āq¬o½~@i~TUxð´ĐhwÀEîôuĶb[§nWuMÆJl½]vuıµb"]],"encodeOffsets":[[[112158,27383],[112105,27474],[112095,27476]]]},"properties":{"cp":[106.713478,26.578343],"name":"贵州","childNum":3}},{"id":"530000","geometry":{"type":"Polygon","coordinates":["@@[ùx½}ÑRHYīĺûsÍniEoã½Ya²ė{c¬ĝgĂsAØÅwďõzFjw}«Dx¿}Uũlê@HÅF¨ÇoJ´Ónũuą¡Ã¢pÒÅØ TF²xa²ËXcÊlHîAßËŁkŻƑŷÉ©hWæßUËs¡¦}teèÆ¶StÇÇ}Fd£jĈZĆÆ¤Tč\\D}O÷£U§~ŃGåŃDĝ¸Tsd¶¶Bª¤u¢ŌĎo~t¾ÍŶÒtD¦ÚiôözØX²ghįh½Û±¯ÿm·zR¦Ɵ`ªŊÃh¢rOÔ´£Ym¼èêf¯ŪĽncÚbw\\zlvWªâ ¦gmĿBĹ£¢ƹřbĥkǫßeeZkÙIKueT»sVesbaĕ ¶®dNĄÄpªy¼³BE®lGŭCǶwêżĔÂepÍÀQƞpC¼ŲÈAÎô¶RäQ^Øu¬°_Èôc´¹ò¨P΢hlϦ´ĦÆ´sâÇŲPnÊD^¯°Upv}®BP̪jǬxSöwlfòªvqĸ|`HviļndĜĆhňem·FyÞqóSᝳX_ĞçêtryvL¤§z¦c¦¥jnŞklD¤øz½ĜàĂŧMÅ|áƆàÊcðÂFÜáŢ¥\\\\ºİøÒÐJĴîD¦zK²ǏÎEh~CDhMn^ÌöÄ©ČZÀaüfɭyœpį´ěFűk]Ôě¢qlÅĆÙa¶~ÄqêljN¬¼HÊNQ´ê¼VظE^ŃÒyM{JLoÒęæe±Ķygã¯JYÆĭĘëo¥Šo¯hcK«z_prC´ĢÖY¼ v¸¢RÅW³Â§fǸYi³xR´ďUË`êĿUûuĆBƣöNDH«ĈgÑaB{ÊNF´¬c·Åv}eÇÃGB»If¦HňĕM
~[iwjUÁKE¾dĪçWIèÀoÈXòyŞŮÈXâÎŚj|àsRyµÖPr´þ ¸^wþTDŔHr¸RÌmfżÕâCôoxĜƌÆĮÐYtâŦÔ@]ÈǮƒ\\μģUsȯLbîƲŚºyhr@ĒÔƀÀ²º\\êpJ}ĠvqtĠ@^xÀ£È¨mËÏğ}n¹_¿¢×Y_æpÅA^{½Lu¨GO±Õ½ßM¶wÁĢÛPƢ¼pcIJx|ap̬HÐŊSfsðBZ¿©XÏÒKk÷Eû¿S
rEFsÕūkóVǥʼniTL¡n{uxţÏhôŝ¬ğōNNJkyPaqÂğ¤K®YxÉƋÁ]āęDqçgOgILu\\_gz]W¼~CÔē]bµogpÑ_oď`´³Țkl`IªºÎȄqÔþ»E³ĎSJ»_f·adÇqÇc¥Á_Źw{L^ɱćxU£µ÷xgĉp»ĆqNē`rĘzaĵĚ¡K½ÊBzyäKXqiWPÏɸ½řÍcÊG|µƕƣGË÷k°_^ý|_zċBZocmø¯hhcæ\\lMFlư£ĜÆyHF¨µêÕ]HA
àÓ^it `þßäkĤÎT~Wlÿ¨ÔPzUCNVv [jâôDôď[}z¿msSh¯{jïğl}šĹ[őgK©U·µË@¾m_~q¡f¹
ÅË^»f³ø}Q¡Ö˳gͱ^Ç
\\ëÃA_¿bWÏ[¶ƛé£F{īZgm@|kHǭƁć¦UĔť×ëǟ
eċ¼ȡȘÏíBÉ£āĘPªij¶ʼnÿy©nď£G¹¡I±LÉĺÑdĉÜW¥}gÁ{aqÃ¥aıęÏZÁ`"],"encodeOffsets":[[104636,22969]]},"properties":{"cp":[102.712251,25.040609],"name":"云南","childNum":1}},{"id":"540000","geometry":{"type":"Polygon","coordinates":["@@ÂhľxŖxÒVºÅâAĪÝȆµę¯Ňa±r_w~uSÕňqOj]ɄQ
£Z
UDûoY»©M[L¼qãË{VÍçWVi]ë©Ä÷àyƛhÚU°adcQ~Mx¥caÛcSyFÖkuRýq¿ÔµQĽ³aG{¿FµëªéĜÿª@¬·K·àariĕĀ«V»ŶĴūgèLǴŇƶaftèBŚ£^âǐÝ®M¦ÁǞÿ¬LhJ¾óƾƺcxwf]Y
´¦|QLn°adĊ
\\¨oǀÍŎ´ĩĀd`tÊQŞŕ|¨C^©Ĉ¦¦ÎJĊ{ëĎjª²rÐl`¼Ą[t|¦Stè¾PÜK¸dƄı]s¤î_v¹ÎVòŦj£Əsc¬_Ğ´|٦Av¦w`ăaÝaa¢e¤ı²©ªSªÈMĄwÉØŔì@T¤Ę\\õª@þo´xA sÂtŎKzó²Çȵ¢r^nĊƬ×üG¢³ {âĊ]G~bÀgVjzlhǶfOfdªB]pjTOtĊn¤}®¦Č¥d¢¼»ddY¼t¢eȤJ¤}Ǿ¡°§¤AÐlc@ĝsªćļđAçwxUuzEÖġ~AN¹ÄÅȀݦ¿ģŁéì±H
ãd«g[ؼēÀcīľġ¬cJµ
ÐʥVȝ¸ßS¹ý±ğkƁ¼ą^ɛ¤Ûÿb[}¬ōõÃ]ËNm®g@Bg}ÍF±ǐyL¥íCIijÏ÷Ñį[¹¦[âšEÛïÁÉdƅß{âNÆāŨß¾ě÷yC£k´ÓH@¹TZ¥¢į·ÌAЧ®Zc
v½Z¹|ÅWZqgW|ieZÅYVÓqdqbc²R@c¥Rã»GeeƃīQ}J[ÒK
¬Ə|oėjġĠÑN¡ð¯EBčnwôɍėª²CλŹġǝʅįĭạ̃ūȹ]ΓͧgšsgȽóϧµǛęgſ¶ҍć`ĘąŌJÞä¤rÅň¥ÖÁUětęuůÞiĊÄÀ\\Æs¦ÓRb|Â^řÌkÄŷ¶½÷f±iMÝ@ĥ°G¬ÃM¥n£Øąğ¯ß§aëbéüÑOčk£{\\eµª×MÉfm«Ƒ{Å×Gŏǩãy³©WÑăû··Qòı}¯ãIéÕÂZ¨īès¶ZÈsæĔTŘvgÌsN@îá¾ó@ÙwU±ÉT廣TđWxq¹Zobs[ׯcĩvėŧ³BM|¹kªħ¥TzNYnÝßpęrñĠĉRS~½ěVVµõ«M££µBĉ¥áºae~³AuĐh`ܳç@BÛïĿa©|z²Ý¼D£àč²ŸIûI āóK¥}rÝ_Á´éMaň¨~ªSĈ½½KÙóĿeƃÆB·¬ën×W|Uº}LJrƳlŒµ`bÔ`QÐÓ@s¬ñIÍ@ûws¡åQÑßÁ`ŋĴ{ĪTÚÅTSijYo|Ç[ǾµMW¢ĭiÕØ¿@Mh
pÕ]jéò¿OƇĆƇpêĉâlØwěsǩĵ¸c
bU¹ř¨WavquSMzeo_^gsÏ·¥Ó@~¯¿RiīB\\qTGªÇĜçPoÿfñòą¦óQīÈáPābß{ZŗĸIæÅhnszÁCËìñÏ·ąĚÝUm®óL·ăUÈíoù´Êj°ŁŤ_uµ^°ìÇ@tĶĒ¡ÆM³Ģ«İĨÅ®ğRāðggheÆ¢zÊ©Ô\\°ÝĎz~ź¤PnMĪÖB£kné§żćĆKǰ¼L¶èâz¨u¦¥LDĘz¬ýÎmĘd¾ßFzhg²Fy¦ĝ¤ċņbÎ@yĄæm°NĮZRÖíJ²öLĸÒ¨Y®ƌÐVàtt_ÚÂyĠz]ŢhzĎ{ÂĢXc|ÐqfO¢¤ögÌHNPKŖUú´xx[xvĐCûĀìÖT¬¸^}Ìsòd´_KgžLĴ
ÀBon|H@Êx¦BpŰŌ¿fµƌA¾zLjRx¶FkĄźRzŀ~¶[´HnªVƞuĒȨƎcƽÌm¸ÁÈM¦x͊ëÀxdžBú^´W£dkɾĬpw˂ØɦļĬIŚÊnŔa¸~J°îlɌxĤÊÈðhÌ®gT´øàCÀ^ªerrƘd¢İP|Ė ŸWªĦ^¶´ÂLaT±üWƜǀRÂŶUńĖ[QhlLüAÜ\\qRĄ©"],"encodeOffsets":[[90849,37210]]},"properties":{"cp":[91.132212,29.660361],"name":"西藏","childNum":1}},{"id":"610000","geometry":{"type":"Polygon","coordinates":["@@¸ÂW¢xRFq§uF@N¢XLRMº[ğȣſï|¥Jkc`sʼnǷ£Y³WN«ùMëï³ÛIg÷±mTșÚÒķø©þ¥yÓğęmWµÎumZyOŅƟĥÓ~sÑL¤µaÅ
Y¦ocyZ{y c]{Ta©`U_Ěē£ωÊƍKùK¶ȱÝƷ§{û»ÅÁȹÍéuij|¹cÑdìUYOuFÕÈYvÁCqÓTǢí§·S¹NgV¬ë÷Át°DدC´ʼnƒópģ}ąiEË
FéGU¥×K
§¶³BČ}C¿åċ`wġB·¤őcƭ²ő[Å^axwQO
ñJÙïŚĤNĔwƇÄńwĪo[_KÓª³ÙnKÇěÿ]ďă_d©·©Ýŏ°Ù®g]±ß×¥¬÷m\\iaǑkěX{¢|ZKlçhLtŇîŵœè[É@ƉĄEtƇϳħZ«mJ
×¾MtÝĦ£IwÄå\\Õ{OwĬ©LÙ³ÙTª¿^¦rÌĢŭO¥lãyC§HÍ£ßEñX¡°ÙCgpťzb`wIvA|¥hoĕ@E±iYd¥OÿµÇvPW|mCĴŜǂÒW¶¸AĜh^Wx{@¬F¸¡ķn£P|ªĴ@^ĠĈæbÔc¶lYi
^MicϰÂ[ävï¶gv@ÀĬ·lJ¸sn|¼u~a]ÆÈtŌºJpþ£KKf~¦UbyäIĺãnÔ¿^ŵMThĠܤko¼Ŏìąǜh`[tRd²IJ_XPrɲlXiL§à¹H°Ȧqº®QCbAŌJ¸ĕÚ³ĺ§ `d¨YjiZvRĺ±öVKkjGȊÄePĞZmļKÀ[`ösìhïÎoĬdtKÞ{¬èÒÒBÔpIJÇĬJŊ¦±J«[©ārHµàåVKe§|P²ÇÓ·vUzgnN¾yI@oHĆÛķhxen¡QQ±ƝJǖRbzy¸ËÐl¼EºpĤ¼x¼½~Ğà@ÚüdK^mÌSjp²ȮµûGĦ}Ħðǚ¶òƄjɂz°{ºØkÈęâ¦jªBg\\ċ°s¬]jú EȌdž¬stRÆdĠİwܸôW¾ƮłÒ_{Ìû¼jº¹¢GǪÒ¯ĘZ`ºŊecņą~BÂgzpâēòYƲȐĎ"],"encodeOffsets":[[113634,40474]]},"properties":{"cp":[108.948024,34.263161],"name":"陕西","childNum":1}},{"id":"620000","geometry":{"type":"MultiPolygon","coordinates":[["@@Vu_^","@@ųEĠtt~nkh`Q¦ÅÄÜdwAb×ĠąJ¤DüègĺqBqj°lI¡Ĩ¶ĖIHdjÎB°aZ¢KJO[|A£Dx}NìHUnrk kp¼Y kMJn[aGáÚÏ[½rc}aQxOgsPMnUsncZ
sKúvAtÞġ£®ĀYKdnFw¢JE°Latf`¼h¬we|Æbj}GA·~W`¢MC¤tL©IJ°qdfObÞĬ¹ttu`^ZúE`[@Æsîz®¡CƳƜG²R¢RmfwĸgÜą G@pzJM½mhVy¸uÈÔO±¨{LfæU¶ßGĂq\\ª¬²I¥IʼnÈīoıÓÑAçÑ|«LÝcspīðÍg
të_õ\\ĉñLYnĝgRǡÁiHLlõUĹ²uQjYi§Z_c¨´ĹĖÙ·ŋI
aBDR¹ȥr¯GºßK¨jWkɱOqWij\\aQ\\sg_ĆǛōëp»£lğÛgSŶN®À]ÓämĹãJaz¥V}Le¤Lýo¹IsŋÅÇ^bz
³tmEÁ´a¹cčecÇNĊãÁ\\č¯dNj]jZµkÓdaćå]ğij@ ©O{¤ĸm¢E·®«|@Xwg]A챝XǁÑdzªcwQÚŝñsÕ³ÛV_ý¥\\ů¥©¾÷w©WÕÊĩhÿÖÁRo¸V¬âDb¨hûxÊ×nj~Zâg|XÁnßYoº§ZÅŘv[ĭÖʃuďxcVbnUSf
B¯³_TzºÎO©çMÑ~M³]µ^püµÄY~y@X~¤Z³[Èōl@®Å¼£QK·Di¡ByÿQ_´D¥hŗy^ĭÁZ]cIzýah¹MĪğPs{ò²Vw¹t³ŜË[Ñ}X\\gsF£sPAgěp×ëfYHāďÖqēŭOÏëdLü\\it^c®Rʺ¶¢H°mrY£B¹čIoľu¶uI]vģSQ{UŻÅ}QÂ|̰ƅ¤ĩŪU ęĄÌZÒ\\v²PĔ»ƢNHĂyAmƂwVm`]ÈbH`Ì¢²ILvĜH®¤Dlt_¢JJÄämèÔDëþgºƫaʎÌrêYi~ ÎݤNpÀA¾Ĕ¼b
ð÷®üszMzÖĖQdȨýv§Tè|ªHþa¸|Ð ƒwKĢx¦ivr^ÿ ¸l öæfƟĴ·PJv}n\\h¹¶v·À|\\ƁĚN´ĜçèÁz]ġ¤²¨QÒŨTIlªťØ}¼˗ƦvÄùØE«FïËIqōTvāÜŏíÛßÛVj³âwGăÂíNOPìyV³ʼnĖýZso§HÑiYw[ß\\X¦¥c]ÔƩÜ·«jÐqvÁ¦m^ċ±R¦ƈťĚgÀ»IïĨʗƮ°ƝĻþÍAƉſ±tÍEÕÞāNUÍ¡\\ſčåÒʻĘm ƭÌŹöʥëQ¤µÇcƕªoIýIÉ_mkl³ăƓ¦j¡YzŇi}Msßõīʋ }ÁVm_[n}eıUĥ¼ªI{ΧDÓƻėojqYhĹT©oūĶ£]ďxĩǑMĝq`B´ƃ˺Чç~²ņj@¥@đ´ί}ĥtPńǾV¬ufÓÉCtÓ̻
¹£G³]ƖƾŎĪŪĘ̖¨ʈĢƂlɘ۪üºňUðǜȢƢż̌ȦǼĤŊɲĖÂKqĘʼn¼ĔDzņɾªǀÞĈĂD½ĄĎÌŗĞrôñnN¼â¾ʄľԆ|DŽ֦ज़ȗlj̘̭ɺƅêgV̍ʆĠ·ÌĊv|ýĖÕWĊǎÞ´õ¼cÒÒBĢ͢UĜð͒s¨ňƃLĉÕÝ@ɛƯ÷¿ĽĹeȏijëCȚDŲyê×Ŗyò¯ļcÂßY
tÁƤyAã˾J@ǝrý@¤
rz¸oP¹ɐÚyáHĀ[Jw
cVeȴÏ»ÈĖ}ƒŰŐèȭǢόĀƪÈŶë;Ñ̆ȤМľĮEŔĹŊũ~ËUă{ĻƹɁύȩþĽvĽƓÉ@ēĽɲßǐƫʾǗĒpäWÐxnsÀ^ƆwW©¦cÅ¡Ji§vúF¶¨c~c¼īeXǚ\\đ¾JwÀďksãAfÕ¦L}waoZD½Ml«]eÒÅaɲáo½FõÛ]ĻÒ¡wYR£¢rvÓ®y®LFLzĈôe]gx}|KK}xklL]c¦£fRtív¦PŨ£","@@M T¥"]],"encodeOffsets":[[[108619,36299],[108594,36341],[108600,36306]]]},"properties":{"cp":[103.823557,36.058039],"name":"甘肃","childNum":3}},{"id":"630000","geometry":{"type":"MultiPolygon","coordinates":[["@@InJo","@@CƽOŃĦsΰ~dz¦@@Ņi±è}ШƄ˹A³r_ĞǒNĪĐw¤^ŬĵªpĺSZgrpiƼĘÔ¨C|ÍJ©Ħ»®VIJ~f\\m `UnÂ~ʌĬàöNt~ňjy¢ZiƔ¥Ąk´nl`JÊJþ©pdƖ®È£¶ìRʦźõƮËnʼėæÑƀĎ[¢VÎĂMÖÝÎF²sƊƀÎBļýƞ¯ʘƭðħ¼Jh¿ŦęΌƇ¥²Q]Č¥nuÂÏri¸¬ƪÛ^Ó¦d¥[Wà
x\\ZjÒ¨GtpþYŊĕ´zUOëPîMĄÁxH´áiÜUàîÜŐĂÛSuŎrJð̬EFÁú×uÃÎkrĒ{V}İ«O_ÌËĬ©ÓŧSRѱ§Ģ£^ÂyèçěM³Ƃę{[¸¿u
ºµ[gt£¸OƤĿéYõ·kĀq]juw¥DĩƍõÇPéĽG©ã¤G
uȧþRcÕĕNyyûtøï»a½ē¿BMoį£Íj}éZËqbʍƬh¹ìÿÓAçãnIáI`ks£CGěUy×Cy
@¶ʡÊBnāzGơMē¼±O÷õJËĚăVĪũƆ£¯{ËL½ÌzżVR|ĠTbuvJvµhĻĖHAëáa
OÇðñęNw
œľ·LmI±íĠĩPÉ×®ÿscB³±JKßĊ«`
ađ»·QAmOVţéÿ¤¹SQt]]Çx±¯A@ĉij¢Óļ©l¶ÅÛrŕspãRk~¦ª]Į´FRådČsCqđéFn¿ÅƃmÉx{W©ºƝºįkÕƂƑ¸wWūЩÈF£\\tÈ¥ÄRÈýÌJ lGr^×äùyÞ³fjc¨£ÂZ|ǓMĝÏ@ëÜőRĝ÷¡{aïȷPu°ËXÙ{©TmĠ}Y³ÞIňµç½©C¡į÷¯B»|St»]vųs»}MÓ ÿʪƟǭA¡fs»PY¼c¡»¦cċ¥£~msĉPSi^o©AecPeǵkgyUi¿h}aHĉ^|á´¡HØûÅ«ĉ®]m¡qċ¶±ÈyôōLÁstB®wn±ă¥HSòė£Së@לÊăxÇN©©T±ª£IJ¡fb®Þbb_Ą¥xu¥B{łĝ³«`dƐt¤ťiñÍUuºí`£^tƃIJc·ÛLO½sç¥Ts{ă\\_»kϱq©čiìĉ|ÍI¥ć¥]ª§D{ŝŖÉR_sÿc³ĪōƿΧp[ĉc¯bKmR¥{³Ze^wx¹dƽŽôIg §Mĕ ƹĴ¿ǣÜÍ]Ý]snåA{eƭ`ǻŊĿ\\ijŬűYÂÿ¬jĖqßb¸L«¸©@ěĀ©ê¶ìÀEH|´bRľÓ¶rÀQþvl®ÕETzÜdb hw¤{LRdcb¯ÙVgƜßzÃôì®^jUèXÎ|UäÌ»rK\\ªN¼pZCüVY¤ɃRi^rPŇTÖ}|br°qňb̰ªiƶGQ¾²x¦PmlŜ[Ĥ¡ΞsĦÔÏâ\\ªÚŒU\\f
¢N²§x|¤§xĔsZPòʛ²SÐqF`ªVÞŜĶƨVZÌL`¢dŐIqr\\oäõF礻Ŷ×h¹]ClÙ\\¦ďÌį¬řtTӺƙgQÇÓHţĒ´ÃbEÄlbʔC|CŮkƮ[ʼ¬ň´KŮÈΰÌζƶlðļATUvdTGº̼ÔsÊDÔveMg"]],"encodeOffsets":[[[105308,37219],[95370,40081]]]},"properties":{"cp":[101.778916,36.623178],"name":"青海","childNum":2}},{"id":"640000","geometry":{"type":"Polygon","coordinates":["@@KëÀęĞ«Oęȿȕı]ʼn¡åįÕÔ«ǴõƪĚQÐZhv K°öqÀÑS[ÃÖHƖčËnL]ûc
Ùß@ĝ¾}w»»oģF¹»kÌÏ·{zP§B¢íyÅt@@á]Yv_ssģ¼ißĻL¾ġsKD£¡N_
X¸}B~HaiÅf{«x»ge_bsKF¯¡IxmELcÿZ¤ĢÝsuBLùtYdmVtNmtOPhRw~bd
¾qÐ\\âÙH\\bImlNZ»loqlVmGā§~QCw¤{A\\PKNY¯bFkC¥sks_Ã\\ă«¢ħkJi¯rrAhĹûç£CUĕĊ_ÔBixÅÙĄnªÑaM~ħpOu¥sîeQ¥¤^dkKwlL~{L~hw^ófćKyEKzuÔ¡qQ¤xZÑ¢^ļöܾEp±âbÊÑÆ^fk¬
NC¾YpxbK~¥eÖäBlt¿Đx½I[ĒǙWf»Ĭ}d§dµùEuj¨IÆ¢¥dXªƅx¿]mtÏwßRĶX¢͎vÆzƂZò®ǢÌʆCrâºMÞzÆMÒÊÓŊZľr°Î®Ȉmª²ĈUªĚîøºĮ¦ÌĘk^FłĬhĚiĀ˾iİbjË"],"encodeOffsets":[[109366,40242]]},"properties":{"cp":[106.278179,38.46637],"name":"宁夏","childNum":1}},{"id":"650000","geometry":{"type":"Polygon","coordinates":["@@QØĔ²X¨~ǘBºjʐߨvKƔX¨vĊO÷¢i@~cĝe_«E}QxgɪëÏÃ@sÅyXoŖ{ô«ŸuX
êÎf`C¹ÂÿÐGĮÕĞXŪōŸMźÈƺQèĽôe|¿ƸJR¤ĘEjcUóº¯Ĩ_ŘÁMª÷Ð¥OéÈ¿ÖğǤǷÂFÒzÉx[]Ĥĝœ¦EP}ûƥé¿İƷTėƫœŕƅƱB»Đ±ēO
¦E}`cȺrĦáŖuÒª«IJπdƺÏØZƴwʄ¤ĖGĐǂZĶèH¶}ÚZצʥĪï|ÇĦMŔ»İĝLjì¥Βba¯¥ǕǚkĆŵĦɑĺƯxūД̵nơʃĽá½M»òmqóŘĝč˾ăC
ćāƿÝɽ©DZŅ»ēėŊLrÁ®ɱĕģʼnǻ̋ȥơŻǛȡVï¹Ň۩ûkɗġƁ§ʇė̕ĩũƽō^ƕUv£ƁQïƵkŏ½ΉÃŭdzLŇʻ«ƭ\\lŭD{ʓDkaFÃÄa³ŤđÔGRÈƚhSӹŚsİ«ĐË[¥ÚDkº^Øg¼ŵ¸£EÍöůʼnT¡c_ËKYƧUśĵÝU_©rETÏʜ±OñtYwē¨{£¨uM³x½şL©Ùá[ÓÐĥ Νtģ¢\\śnkOw¥±T»ƷFɯàĩÞáB¹Æ
ÑUwŕĽw]kE½Èå~Æ÷QyěCFmĭZīŵVÁƿQƛûXS²b½KϽĉS©ŷXĕ{ĕK·¥Ɨcqq©f¿]ßDõU³hgËÇïģÉɋwk¯í}I·œbmÉřīJɥĻˁ×xoɹīlc
¤³Xù]DžA¿w͉ì¥wÇN·ÂËnƾƍdǧđ®ƝvUm©³G\\}µĿQyŹlăµEwLJQ½yƋBe¶ŋÀůo¥AÉw@{Gpm¿AijŽKLh³`ñcËtW±»ÕSëüÿďDu\\wwwù³VLŕOMËGh£õP¡erÏd{ġWÁ
č|yšg^ğyÁzÙs`s|ÉåªÇ}m¢Ń¨`x¥ù^}Ì¥H«YªƅAйn~ź¯f¤áÀzgÇDIÔ´AňĀÒ¶ûEYospõD[{ù°]uJqU|Soċxţ[õÔĥkŋÞŭZ˺óYËüċrw ÞkrťË¿XGÉbřaDü·Ē÷Aê[ÄäI®BÕĐÞ_¢āĠpÛÄȉĖġDKwbmÄNôfƫVÉvidzHQµâFùœ³¦{YGd¢ĚÜO {Ö¦ÞÍÀP^bƾl[vt×ĈÍE˨¡Đ~´î¸ùÎhuè`¸HÕŔVºwĠââWò@{ÙNÝ´ə²ȕn{¿¥{l÷eé^eďXj©î\\ªÑòÜìc\\üqÕ[Č¡xoÂċªbØø|¶ȴZdÆÂońéG\\¼C°ÌÆn´nxÊOĨŪƴĸ¢¸òTxÊǪMīĞÖŲÃɎOvʦƢ~FRěò¿ġ~åŊúN¸qĘ[Ĕ¶ÂćnÒPĒÜvúĀÊbÖ{Äî¸~Ŕünp¤ÂH¾ĄYÒ©ÊfºmÔĘcDoĬMŬS¤s²ʘÚžȂVŦ èW°ªB|IJXŔþÈJĦÆæFĚêYĂªĂ]øªŖNÞüAfɨJ¯ÎrDDĤ`mz\\§~D¬{vJ«lµĂb¤pŌŰNĄ¨ĊXW|ų ¿¾ɄĦƐMTòP÷fØĶK¢ȝ˔Sô¹òEð`Ɩ½ǒÂň×äı§ĤƝ§C~¡hlåǺŦŞkâ~}FøàIJaĞfƠ¥Ŕd®U¸źXv¢aƆúŪtŠųƠjdƺƺÅìnrh\\ĺ¯äɝĦ]èpĄ¦´LƞĬ´ƤǬ˼Ēɸ¤rºǼ²¨zÌPðŀbþ¹ļD¢¹\\ĜÑŚ¶ZƄ³âjĦoâȴLÊȮĐĚăÀêZǚŐ¤qȂ\\L¢ŌİfÆs|zºeªÙæ§{Ā´ƐÚ¬¨Ĵà²łhʺKÞºÖTiƢ¾ªì°`öøu®Ê¾ãÖ"],"encodeOffsets":[[88824,50096]]},"properties":{"cp":[87.617733,43.792818],"name":"新疆","childNum":1}},{"id":"110000","geometry":{"type":"Polygon","coordinates":["@@RºaYÕQaúÍÔiþĩȨWĢü|Ėu[qb[swP@ÅğP¿{\\¯Y²·Ñ¨j¯X\\¯MSvU¯YIŕY{[fkVÁûtŷmiÍt_H»Ĩ±d`¹{bw
Yr³S]§§o¹qGtm_SŧoaFLgQN_dV@Zom_ć\\ßW´ÕiœRcfi
o§ËgToÛJíĔóu
|wP¤XnO¢ÉŦ¯pNÄā¤zâŖÈRpŢZÚ{GrFt¦Òx§ø¹RóäV¤XdżâºWbwڍUd®bêņ¾jnŎGŃŶnzÚScîĚZen¬"],"encodeOffsets":[[119421,42013]]},"properties":{"cp":[116.405285,39.904989],"name":"北京","childNum":1}},{"id":"120000","geometry":{"type":"Polygon","coordinates":["@@ŬgX§Ü«E
¶F̬O_ïlÁgz±AXeµÄĵ{¶]gitgIj·¥ì_iU¨ÐƎk}ĕ{gBqGf{¿aU^fIư³õ{YıëNĿk©ïËZukāAīlĕĥs¡bġ«@dekąI[nlPqCnp{ō³°`{PNdƗqSÄĻNNâyj]äÒD ĬH°Æ]~¡HO¾X}ÐxgpgWrDGpù^LrzWxZ^¨´T\\|~@IzbĤjeĊªz£®ĔvěLmV¾Ô_ÈNW~zbĬvG²ZmDM~~"],"encodeOffsets":[[120237,41215]]},"properties":{"cp":[117.190182,39.125596],"name":"天津","childNum":1}},{"id":"310000","geometry":{"type":"MultiPolygon","coordinates":[["@@ɧư¬EpƸÁx]","@@©²","@@MA","@@QpªKWT
§¨","@@bŝÕÕEȣÚƥêImɇǦèÜĠÚÄÓŴ·ʌÇ","@@Sô¤r]ìƬįǜûȬɋŭ×^sYɍDŋŽąñCG²«ªč@h_p¯A{oloY¬j@IJ`gQÚpptǀ^MIJvtbe´Rh@oj¨","@@ÆLH{a}Eo¦"]],"encodeOffsets":[[[124702,32062],[124547,32200],[124808,31991],[124726,32110],[124903,32376],[124065,32166],[124870,31965]]]},"properties":{"cp":[121.472644,31.231706],"name":"上海","childNum":7}},{"id":"500000","geometry":{"type":"Polygon","coordinates":["@@TÂÛ`Ùƅően½SêqDu[Rå͹÷eXÍy¸_ĺę}÷`M¯ċfCVµqʼn÷Zgg^d½pDOÎCn^uf²ènh¼WtƏxRGg¦
pVFI±G^Ic´ecGĹÞ½sëÆNä̤KÓe¯|R¸§LÜkPoïƭNï¶}Gywdiù©nkĈzj@Óc£»Wă¹Óf§c[µo·Ó|MvÛaq½«è\\ÂoVnÓØÍ²«bq¿ehCĜ^Q~ Évýş¤²ĮpEĶyhsŊwH½¿gÅ¡ýE¡ya£³t\\¨\\vú¹¼©·Ñr_oÒý¥et³]Et©uÖ¥±ă©KVeë]}wVPÀFA¨ąB}qTjgRemfFmQFÝ
MyùnÑAmÑCawu_p¯sfÛ_gI_pNysB¦zG¸rHeN\\CvEsÐñÚkcDÖĉsaQ¯}_UzÁē}^R Äd^ÍĸZ¾·¶`wećJE¹vÛ·HgéFXjÉê`|ypxkAwWĐpb¥eOsmzwqChóUQl¥F^lafanòsrEvfQdÁUVfÎvÜ^eftET¬ôA\\¢sJnQTjPØxøK|nBzĞ»LY
FDxÓvr[ehľvN¢o¾NiÂxGpâ¬zbfZo~hGi]öF||NbtOMn eA±tPTLjpYQ|SHYĀxinzDJÌg¢và¥Pg_ÇzIIII£®S¬Øs쥨^LnGIJļIJƤjÎƀƾ¹¸ØÎezĆT¸}êÐqHðqĖä¥^CÆIj²p
\\_ æüY|[YxƊæu°xb®
Űb@~¢NQt°¶Sæ Ê~rljĔëĚ¢~uf`faĔJåĊnÔ]jƎćÊ@£¾a®£Ű{ŶĕFègLk{Y|¡ĜWƔtƬJÑxq±ĢN´òKLÈüD|s`ŋć]Ã`đMùƱ¿~Y°ħ`ƏíW½eI½{aOIrÏ¡ĕŇapµÜƃġ²"],"encodeOffsets":[[111728,31311]]},"properties":{"cp":[106.504962,29.533155],"name":"重庆","childNum":1}},{"id":"810000","geometry":{"type":"MultiPolygon","coordinates":[["@@AlFi","@@mp","@@EpHo","@@rMUwAS¬]","@@ea¢pl¸Eõ¹hj[]ÔCÎ@lj¡uBX
´AI¹
[yDU]W`çwZkmc
MpÅv}IoJlcafŃK°ä¬XJmÐ đhI®æÔtSHnEÒrÄc"]],"encodeOffsets":[[[117111,23002],[117072,22876],[117045,22887],[116882,22747],[116975,23082]]]},"properties":{"cp":[114.173355,22.320048],"name":"香港","childNum":5}},{"id":"820000","geometry":{"type":"Polygon","coordinates":["@@áw{Îr"],"encodeOffsets":[[116285,22746]]},"properties":{"cp":[113.54909,22.198951],"name":"澳门","childNum":1}}],"UTF8Encoding":true});
27 | }));
--------------------------------------------------------------------------------
/docs/data.json:
--------------------------------------------------------------------------------
1 | {
2 | "data": [
3 | {
4 | "name": "page.load",
5 | "datapoints": [
6 | { "x": 2001, "y": 1012 },
7 | { "x": 2002, "y": 1023 },
8 | { "x": 2003, "y": 1045 },
9 | { "x": 2004, "y": 1062 },
10 | { "x": 2005, "y": 1032 },
11 | { "x": 2006, "y": 1040 },
12 | { "x": 2007, "y": 1023 },
13 | { "x": 2008, "y": 1090 },
14 | { "x": 2009, "y": 1012 },
15 | { "x": 2010, "y": 1012 }
16 | ]
17 | },
18 | {
19 | "name": "page.firstPaint",
20 | "datapoints": [
21 | { "x": 2108, "y": 3019 },
22 | { "x": 2009, "y": 3020 },
23 | { "x": 2210, "y": 3321 },
24 | { "x": 2011, "y": 3022 },
25 | { "x": 2412, "y": 3023 },
26 | { "x": 2813, "y": 3024 },
27 | { "x": 2014, "y": 3625 },
28 | { "x": 2015, "y": 3026 },
29 | { "x": 2816, "y": 3027 },
30 | { "x": 2017, "y": 3828 }
31 | ]
32 | }
33 | ]
34 | }
35 |
--------------------------------------------------------------------------------
/docs/docs.js:
--------------------------------------------------------------------------------
1 | (function () {
2 | 'use strict';
3 |
4 | var pageload = {
5 | name: 'page.load',
6 | datapoints: [
7 | { x: 2001, y: 1012 },
8 | { x: 2002, y: 1023 },
9 | { x: 2003, y: 1045 },
10 | { x: 2004, y: 1062 },
11 | { x: 2005, y: 1032 },
12 | { x: 2006, y: 1040 },
13 | { x: 2007, y: 1023 },
14 | { x: 2008, y: 1090 },
15 | { x: 2009, y: 1012 },
16 | { x: 2010, y: 1012 }
17 | ]
18 | };
19 |
20 | var firstPaint = {
21 | name: 'page.firstPaint',
22 | datapoints: [
23 | { x: 2001, y: 22 },
24 | { x: 2002, y: 13 },
25 | { x: 2003, y: 35 },
26 | { x: 2004, y: 52 },
27 | { x: 2005, y: 32 },
28 | { x: 2006, y: 40 },
29 | { x: 2007, y: 63 },
30 | { x: 2008, y: 80 },
31 | { x: 2009, y: 20 },
32 | { x: 2010, y: 25 }
33 | ]
34 | };
35 |
36 | function updateData($interval) {
37 | $interval(function () {
38 | pageload.datapoints.push({ x: pageload.datapoints[pageload.datapoints.length - 1].x + 1, y: Math.round(Math.random() * 2000) });
39 | firstPaint.datapoints.push({ x: firstPaint.datapoints[firstPaint.datapoints.length - 1].x + 1, y: Math.round(Math.random() * 100) });
40 | pageload.datapoints.shift();
41 | firstPaint.datapoints.shift();
42 | }, 3000);
43 | }
44 |
45 | var app = angular.module('docs', ['angular-echarts']);
46 |
47 | app.controller('LineChartController', function ($scope, $interval) {
48 |
49 | $scope.config = {
50 | // title: 'Line Chart',
51 | // subtitle: 'Line Chart Subtitle',
52 | debug: true,
53 | showXAxis: true,
54 | showYAxis: true,
55 | showLegend: true,
56 | stack: false
57 | };
58 |
59 | $scope.data = [ pageload ];
60 | $scope.multiple = [pageload, firstPaint ];
61 |
62 | // CAUTION: 这行必须放在这里,不然 angular 感知不到数据变化
63 | updateData($interval);
64 | });
65 |
66 | app.controller('BarChartController', function ($scope) {
67 |
68 | $scope.config = {
69 | title: 'Bar Chart',
70 | subtitle: 'Bar Chart Subtitle',
71 | debug: true,
72 | stack: true
73 | };
74 |
75 | $scope.data = [ pageload ];
76 | $scope.multiple = [pageload, firstPaint ];
77 |
78 | });
79 |
80 | app.controller('HorizontalBarChartController', function ($scope) {
81 |
82 | $scope.config = {
83 | title: 'Bar Chart',
84 | subtitle: 'Bar Chart Subtitle',
85 | debug: true,
86 | stack: true,
87 | xAxis: {
88 | type: 'value',
89 | min: 0
90 | },
91 | yAxis: {
92 | type: 'category',
93 | data: []
94 | }
95 | };
96 |
97 | $scope.data = [ pageload ];
98 | $scope.multiple = [pageload, firstPaint ];
99 |
100 | });
101 |
102 | app.controller('AreaChartController', function ($scope) {
103 |
104 | $scope.config = {
105 | title: 'Area Chart',
106 | subtitle: 'Area Chart Subtitle',
107 | yAxis: { scale: true },
108 | debug: true,
109 | stack: true
110 | };
111 |
112 | $scope.data = [ pageload ];
113 | $scope.multiple = [pageload, firstPaint ];
114 |
115 | });
116 |
117 | app.controller('PieChartController', function ($scope) {
118 |
119 | $scope.config = {
120 | title: 'Pie Chart',
121 | subtitle: 'Pie Chart Subtitle',
122 | debug: true
123 | };
124 |
125 | $scope.data = [ pageload ];
126 | });
127 |
128 | app.controller('GaugeChartController', function ($scope) {
129 |
130 | $scope.config = {
131 | debug: true
132 | };
133 |
134 | $scope.data = [ pageload ];
135 | });
136 |
137 | app.controller('RadarChartController', function ($scope) {
138 |
139 | $scope.config = {
140 | width: 600,
141 | height: 450,
142 | polar : [
143 | {
144 | indicator : [
145 | { text: '销售(sales)', max: 6000},
146 | { text: '管理(Administration)', max: 16000},
147 | { text: '信息技术(Information Techology)', max: 30000},
148 | { text: '客服(Customer Support)', max: 38000},
149 | { text: '研发(Development)', max: 52000},
150 | { text: '市场(Marketing)', max: 25000}
151 | ]
152 | }
153 | ]
154 | };
155 |
156 | $scope.data = [
157 | {
158 | name: '预算 vs 开销(Budget vs spending)',
159 | type: 'radar',
160 | data : [
161 | {
162 | value : [4300, 10000, 28000, 35000, 50000, 19000],
163 | name : '预算分配(Allocated Budget)'
164 | },
165 | {
166 | value : [5000, 14000, 28000, 31000, 42000, 21000],
167 | name : '实际开销(Actual Spending)'
168 | }
169 | ]
170 | }
171 | ];
172 | });
173 |
174 | app.controller('MapChartController', function ($scope) {
175 | $scope.config = {
176 | height: 600,
177 | title: {
178 | text: 'iphone销量',
179 | subtext: '纯属虚构',
180 | left: 'center'
181 | },
182 | tooltip : {
183 | trigger: 'item'
184 | },
185 | legend: {
186 | orient: 'vertical',
187 | left: 'left',
188 | data:['iphone3','iphone4','iphone5']
189 | },
190 | visualMap: {
191 | min: 0,
192 | max: 2500,
193 | left: 'left',
194 | top: 'bottom',
195 | text:['高','低'], // 文本,默认为数值文本
196 | calculable : true
197 | },
198 | toolbox: {
199 | show: true,
200 | orient : 'vertical',
201 | left: 'right',
202 | top: 'center',
203 | feature : {
204 | mark : {show: true},
205 | dataView : {show: true, readOnly: false},
206 | restore : {show: true},
207 | saveAsImage : {show: true}
208 | }
209 | },
210 | };
211 |
212 | $scope.data = [
213 | {
214 | name: 'iphone3',
215 | type: 'map',
216 | mapType: 'china',
217 | roam: false,
218 | label: {
219 | normal: {
220 | show: false
221 | },
222 | emphasis: {
223 | show: true
224 | }
225 | },
226 | data:[
227 | {name: '北京',value: Math.round(Math.random()*1000)},
228 | {name: '天津',value: Math.round(Math.random()*1000)},
229 | {name: '上海',value: Math.round(Math.random()*1000)},
230 | {name: '重庆',value: Math.round(Math.random()*1000)},
231 | {name: '河北',value: Math.round(Math.random()*1000)},
232 | {name: '河南',value: Math.round(Math.random()*1000)},
233 | {name: '云南',value: Math.round(Math.random()*1000)},
234 | {name: '辽宁',value: Math.round(Math.random()*1000)},
235 | {name: '黑龙江',value: Math.round(Math.random()*1000)},
236 | {name: '湖南',value: Math.round(Math.random()*1000)},
237 | {name: '安徽',value: Math.round(Math.random()*1000)},
238 | {name: '山东',value: Math.round(Math.random()*1000)},
239 | {name: '新疆',value: Math.round(Math.random()*1000)},
240 | {name: '江苏',value: Math.round(Math.random()*1000)},
241 | {name: '浙江',value: Math.round(Math.random()*1000)},
242 | {name: '江西',value: Math.round(Math.random()*1000)},
243 | {name: '湖北',value: Math.round(Math.random()*1000)},
244 | {name: '广西',value: Math.round(Math.random()*1000)},
245 | {name: '甘肃',value: Math.round(Math.random()*1000)},
246 | {name: '山西',value: Math.round(Math.random()*1000)},
247 | {name: '内蒙古',value: Math.round(Math.random()*1000)},
248 | {name: '陕西',value: Math.round(Math.random()*1000)},
249 | {name: '吉林',value: Math.round(Math.random()*1000)},
250 | {name: '福建',value: Math.round(Math.random()*1000)},
251 | {name: '贵州',value: Math.round(Math.random()*1000)},
252 | {name: '广东',value: Math.round(Math.random()*1000)},
253 | {name: '青海',value: Math.round(Math.random()*1000)},
254 | {name: '西藏',value: Math.round(Math.random()*1000)},
255 | {name: '四川',value: Math.round(Math.random()*1000)},
256 | {name: '宁夏',value: Math.round(Math.random()*1000)},
257 | {name: '海南',value: Math.round(Math.random()*1000)},
258 | {name: '台湾',value: Math.round(Math.random()*1000)},
259 | {name: '香港',value: Math.round(Math.random()*1000)},
260 | {name: '澳门',value: Math.round(Math.random()*1000)}
261 | ]
262 | },
263 | {
264 | name: 'iphone4',
265 | type: 'map',
266 | mapType: 'china',
267 | label: {
268 | normal: {
269 | show: false
270 | },
271 | emphasis: {
272 | show: true
273 | }
274 | },
275 | data:[
276 | {name: '北京',value: Math.round(Math.random()*1000)},
277 | {name: '天津',value: Math.round(Math.random()*1000)},
278 | {name: '上海',value: Math.round(Math.random()*1000)},
279 | {name: '重庆',value: Math.round(Math.random()*1000)},
280 | {name: '河北',value: Math.round(Math.random()*1000)},
281 | {name: '安徽',value: Math.round(Math.random()*1000)},
282 | {name: '新疆',value: Math.round(Math.random()*1000)},
283 | {name: '浙江',value: Math.round(Math.random()*1000)},
284 | {name: '江西',value: Math.round(Math.random()*1000)},
285 | {name: '山西',value: Math.round(Math.random()*1000)},
286 | {name: '内蒙古',value: Math.round(Math.random()*1000)},
287 | {name: '吉林',value: Math.round(Math.random()*1000)},
288 | {name: '福建',value: Math.round(Math.random()*1000)},
289 | {name: '广东',value: Math.round(Math.random()*1000)},
290 | {name: '西藏',value: Math.round(Math.random()*1000)},
291 | {name: '四川',value: Math.round(Math.random()*1000)},
292 | {name: '宁夏',value: Math.round(Math.random()*1000)},
293 | {name: '香港',value: Math.round(Math.random()*1000)},
294 | {name: '澳门',value: Math.round(Math.random()*1000)}
295 | ]
296 | },
297 | {
298 | name: 'iphone5',
299 | type: 'map',
300 | mapType: 'china',
301 | label: {
302 | normal: {
303 | show: false
304 | },
305 | emphasis: {
306 | show: true
307 | }
308 | },
309 | data:[
310 | {name: '北京',value: Math.round(Math.random()*1000)},
311 | {name: '天津',value: Math.round(Math.random()*1000)},
312 | {name: '上海',value: Math.round(Math.random()*1000)},
313 | {name: '广东',value: Math.round(Math.random()*1000)},
314 | {name: '台湾',value: Math.round(Math.random()*1000)},
315 | {name: '香港',value: Math.round(Math.random()*1000)},
316 | {name: '澳门',value: Math.round(Math.random()*1000)}
317 | ]
318 | }
319 | ];
320 | });
321 |
322 | app.controller('HeatmapChartController', function ($scope, $interval) {
323 | //Adapted from https://ecomfe.github.io/echarts-examples/public/editor.html?c=heatmap-cartesian
324 | var hours = ['12a', '1a', '2a', '3a', '4a', '5a', '6a',
325 | '7a', '8a', '9a','10a','11a',
326 | '12p', '1p', '2p', '3p', '4p', '5p',
327 | '6p', '7p', '8p', '9p', '10p', '11p'];
328 | var days = ['Saturday', 'Friday', 'Thursday',
329 | 'Wednesday', 'Tuesday', 'Monday', 'Sunday'];
330 |
331 | var data = [[0,0,5],[0,1,1],[0,2,0],[0,3,0],[0,4,0],[0,5,0],[0,6,0],[0,7,0],[0,8,0],[0,9,0],[0,10,0],[0,11,2],[0,12,4],[0,13,1],[0,14,1],[0,15,3],[0,16,4],[0,17,6],[0,18,4],[0,19,4],[0,20,3],[0,21,3],[0,22,2],[0,23,5],[1,0,7],[1,1,0],[1,2,0],[1,3,0],[1,4,0],[1,5,0],[1,6,0],[1,7,0],[1,8,0],[1,9,0],[1,10,5],[1,11,2],[1,12,2],[1,13,6],[1,14,9],[1,15,11],[1,16,6],[1,17,7],[1,18,8],[1,19,12],[1,20,5],[1,21,5],[1,22,7],[1,23,2],[2,0,1],[2,1,1],[2,2,0],[2,3,0],[2,4,0],[2,5,0],[2,6,0],[2,7,0],[2,8,0],[2,9,0],[2,10,3],[2,11,2],[2,12,1],[2,13,9],[2,14,8],[2,15,10],[2,16,6],[2,17,5],[2,18,5],[2,19,5],[2,20,7],[2,21,4],[2,22,2],[2,23,4],[3,0,7],[3,1,3],[3,2,0],[3,3,0],[3,4,0],[3,5,0],[3,6,0],[3,7,0],[3,8,1],[3,9,0],[3,10,5],[3,11,4],[3,12,7],[3,13,14],[3,14,13],[3,15,12],[3,16,9],[3,17,5],[3,18,5],[3,19,10],[3,20,6],[3,21,4],[3,22,4],[3,23,1],[4,0,1],[4,1,3],[4,2,0],[4,3,0],[4,4,0],[4,5,1],[4,6,0],[4,7,0],[4,8,0],[4,9,2],[4,10,4],[4,11,4],[4,12,2],[4,13,4],[4,14,4],[4,15,14],[4,16,12],[4,17,1],[4,18,8],[4,19,5],[4,20,3],[4,21,7],[4,22,3],[4,23,0],[5,0,2],[5,1,1],[5,2,0],[5,3,3],[5,4,0],[5,5,0],[5,6,0],[5,7,0],[5,8,2],[5,9,0],[5,10,4],[5,11,1],[5,12,5],[5,13,10],[5,14,5],[5,15,7],[5,16,11],[5,17,6],[5,18,0],[5,19,5],[5,20,3],[5,21,4],[5,22,2],[5,23,0],[6,0,1],[6,1,0],[6,2,0],[6,3,0],[6,4,0],[6,5,0],[6,6,0],[6,7,0],[6,8,0],[6,9,0],[6,10,1],[6,11,0],[6,12,2],[6,13,1],[6,14,3],[6,15,4],[6,16,0],[6,17,0],[6,18,0],[6,19,0],[6,20,1],[6,21,2],[6,22,2],[6,23,6]];
332 |
333 | data = data.map(function (item) {
334 | return [item[1], item[0], item[2] || '-'];
335 | });
336 |
337 | $scope.data = [
338 | {
339 | name: 'Punch Card',
340 | data: data
341 | }
342 | ];
343 |
344 | $scope.config = {
345 | title: 'Heatmap Chart',
346 | subtitle: 'Heatmap Subtitle',
347 | tooltip: {
348 | position: 'top'
349 | },
350 | animation: false,
351 | grid: {
352 | height: '50%',
353 | y: '10%'
354 | },
355 | xAxis: {
356 | type: 'category',
357 | data: hours,
358 | splitArea: {
359 | show: true
360 | }
361 | },
362 | yAxis: {
363 | type: 'category',
364 | data: days,
365 | splitArea: {
366 | show: true
367 | }
368 | },
369 | visualMap: {
370 | min: 0,
371 | max: 10,
372 | calculable: true,
373 | orient: 'horizontal',
374 | left: 'center',
375 | bottom: '15%'
376 | },
377 | };
378 |
379 | });
380 |
381 | app.controller('AjaxChartController', function ($scope, $interval) {
382 |
383 | $scope.config = {
384 | debug: true,
385 | showXAxis: false,
386 | };
387 |
388 | $scope.data = './docs/data.json';
389 |
390 | $interval(function () {
391 | $scope.data = './docs/data.json';
392 | }, 3000);
393 | });
394 |
395 | })();
396 |
397 |
--------------------------------------------------------------------------------
/gulpfile.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var gulp = require('gulp');
4 | var plugins = require('gulp-load-plugins')();
5 | var browserSync = require('browser-sync');
6 |
7 | /**
8 | * Run a webserver (with LiveReload)
9 | */
10 | gulp.task('server', function() {
11 | plugins.connect.server({
12 | root: '.',
13 | fallback: './index.html',
14 | port: 8080,
15 | livereload: true
16 | });
17 | });
18 |
19 | /**
20 | * Keep multiple browsers & devices in sync when building websites.
21 | */
22 | gulp.task('browser-sync', function() {
23 |
24 | browserSync.init({
25 | server: {
26 | baseDir: "./"
27 | }
28 | });
29 |
30 | });
31 |
32 | /**
33 | * Watching file change & rebuild
34 | */
35 | gulp.task('watch', function () {
36 |
37 | gulp.watch(['src/**/*.js', 'docs/**/*.[js,html]'], ['build']);
38 |
39 | });
40 |
41 | /**
42 | * build Tasks
43 | */
44 | gulp.task('build', function () {
45 |
46 | // cleanup previous builds
47 | gulp.src('dist/*.js', {read: false})
48 | .pipe(plugins.clean());
49 |
50 | // build js
51 | gulp.src(['src/directive.js', 'src/util.js', 'src/theme.js', 'src/theme/*.js'])
52 | .pipe(plugins.removeUseStrict())
53 | .pipe(plugins.concat('angular-echarts.js'))
54 | .pipe(plugins.wrap('(function () {<%= contents %>})();'))
55 | .pipe(gulp.dest('dist'))
56 | .pipe(plugins.rename({ suffix: '.min'}))
57 | .pipe(plugins.uglify({ outSourceMap: true, mangle: true, report: 'gzip' }))
58 | .pipe(plugins.size({ showFiles: true }))
59 | .pipe(gulp.dest('dist'));
60 |
61 | });
62 |
63 | /**
64 | * developing: rebuild after coding
65 | */
66 | gulp.task('default', ['build', 'browser-sync', 'watch', 'server']);
67 |
68 | /**
69 | * publish: build then bump version
70 | */
71 | gulp.task('publish', ['build'], function () {
72 |
73 | // bump bower, npm versions
74 | gulp.src(['package.json', 'bower.json'])
75 | .pipe(plugins.bump())
76 | .pipe(gulp.dest('.'));
77 |
78 | });
79 |
80 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | angular echarts directives
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
58 |
59 |
60 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular-echarts",
3 | "version": "1.0.3",
4 | "description": "angular baidu echart directives",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "repository": {
10 | "type": "git",
11 | "url": "git://github.com/wangshijun/angular-echarts.git"
12 | },
13 | "keywords": [
14 | "angular",
15 | "baidu",
16 | "echarts"
17 | ],
18 | "author": "wangshijun",
19 | "license": "MIT",
20 | "bugs": {
21 | "url": "https://github.com/wangshijun/angular-echarts/issues"
22 | },
23 | "homepage": "https://github.com/wangshijun/angular-echarts",
24 | "devDependencies": {
25 | "browser-sync": "^2.9.11",
26 | "event-stream": "~3.1.5",
27 | "gulp": "~3.8.6",
28 | "gulp-bump": "~0.1.8",
29 | "gulp-cache": "~0.1.3",
30 | "gulp-clean": "~0.2.4",
31 | "gulp-concat": "~2.2.0",
32 | "gulp-connect": "^2.3.1",
33 | "gulp-jshint": "~1.6.0",
34 | "gulp-load-plugins": "~0.5.1",
35 | "gulp-remove-use-strict": "0.0.2",
36 | "gulp-rename": "~1.2.0",
37 | "gulp-size": "~0.3.0",
38 | "gulp-uglify": "~0.3.0",
39 | "gulp-util": "~2.2.14",
40 | "gulp-wrap": "^0.3.0",
41 | "jshint-stylish": "~0.2.0"
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/src/directive.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | /**
4 | * generate directive link function
5 | *
6 | * @param {Service} $http, http service to make ajax requests from angular
7 | * @param {String} type, chart type
8 | */
9 | function getLinkFunction($http, theme, util, type) {
10 | return function (scope, element, attrs) {
11 | scope.config = scope.config || {};
12 |
13 | var ndWrapper = element.find('div')[0],
14 | ndParent = element.parent()[0],
15 | parentWidth = ndParent.clientWidth,
16 | parentHeight = ndParent.clientHeight,
17 | width, height, chart;
18 | var chartEvent = {};
19 |
20 | function getSizes(config) {
21 | width = config.width || parseInt(attrs.width) || parentWidth || 320;
22 | height = config.height || parseInt(attrs.height) || parentHeight || 240;
23 |
24 | ndWrapper.style.width = width + 'px';
25 | ndWrapper.style.height = height + 'px';
26 | }
27 |
28 | function getOptions(data, config, type) {
29 | // merge default config
30 | config = angular.extend({
31 | showXAxis: true,
32 | showYAxis: true,
33 | showLegend: true
34 | }, config);
35 |
36 | var xAxis = angular.extend({
37 | orient: 'top',
38 | axisLine: { show: false }
39 | }, angular.isObject(config.xAxis) ? config.xAxis : {});
40 |
41 | var yAxis = angular.extend({
42 | type: 'value',
43 | orient: 'right',
44 | scale: false,
45 | axisLine: {
46 | show: false
47 | },
48 | axisLabel: {
49 | formatter: function (v) {
50 | return util.formatKMBT(v);
51 | }
52 | }
53 | }, angular.isObject(config.yAxis) ? config.yAxis : {});
54 |
55 | // basic config
56 | var options = {
57 | title: util.getTitle(data, config, type),
58 | tooltip: util.getTooltip(data, config, type),
59 | legend: util.getLegend(data, config, type),
60 | toolbox: angular.extend({ show: false }, angular.isObject(config.toolbox) ? config.toolbox : {}),
61 | xAxis: util.isHeatmapChart(type)? config.xAxis : [ angular.extend(util.getAxisTicks(data, config, type), xAxis) ],
62 | yAxis: util.isHeatmapChart(type)? config.yAxis :[ yAxis ],
63 | graphic: config.graphic && (angular.isObject(config.graphic) || angular.isArray(config.graphic)) ? config.graphic : [],
64 | series: util.getSeries(data, config, type),
65 | visualMap: config.visualMap ? config.visualMap : null
66 | };
67 |
68 | if (!config.showXAxis) {
69 | angular.forEach(options.xAxis, function (axis) {
70 | axis.axisLine = { show: false };
71 | axis.axisLabel = { show: false };
72 | axis.axisTick = { show: false };
73 | });
74 | }
75 |
76 | if (!config.showYAxis) {
77 | angular.forEach(options.yAxis, function (axis) {
78 | axis.axisLine = { show: false };
79 | axis.axisLabel = { show: false };
80 | axis.axisTick = { show: false };
81 | });
82 | }
83 |
84 | if (!config.showLegend || type === 'gauge') {
85 | delete options.legend;
86 | }
87 |
88 | if (!util.isAxisChart(type) && !util.isHeatmapChart(type)) {
89 | delete options.xAxis;
90 | delete options.yAxis;
91 | }
92 |
93 | if (config.dataZoom) {
94 | options.dataZoom = angular.extend({
95 | show : true,
96 | realtime : true
97 | }, config.dataZoom);
98 | }
99 |
100 | if (config.dataRange) {
101 | options.dataRange = angular.extend({}, config.dataRange);
102 | }
103 |
104 | if (config.polar) {
105 | options.polar = config.polar;
106 | }
107 |
108 | if (config.grid) {
109 | options.grid = config.grid;
110 | }
111 |
112 | return options;
113 | }
114 |
115 | var isAjaxInProgress = false;
116 | var textStyle = { color: 'red', fontSize: 36, fontWeight: 900, fontFamily: 'Microsoft Yahei, Arial' };
117 |
118 | function setOptions() {
119 | if (!scope.data || !scope.config) {
120 | return;
121 | }
122 |
123 | var options;
124 |
125 | getSizes(scope.config);
126 |
127 | if (!chart) {
128 | chart = echarts.init(ndWrapper, scope.config.theme || 'shine');
129 | }
130 |
131 | if (scope.config.event) {
132 | if (!Array.isArray(scope.config.event)) {
133 | scope.config.event = [scope.config.event];
134 | }
135 |
136 | if (Array.isArray(scope.config.event)) {
137 | scope.config.event.forEach(function (ele) {
138 | if(!chartEvent[ele.type]) {
139 | chartEvent[ele.type] = true;
140 | chart.on(ele.type, function (param) {
141 | ele.fn(param);
142 | });
143 | }
144 | });
145 | }
146 | }
147 |
148 | // string type for data param is assumed to ajax datarequests
149 | if (angular.isString(scope.data)) {
150 | if (isAjaxInProgress) { return; }
151 | isAjaxInProgress = true;
152 |
153 | // show loading
154 | chart.showLoading({ text: scope.config.loading || '奋力加载中...', textStyle: textStyle });
155 |
156 | // fire data request
157 | $http.get(scope.data).then(function (response) {
158 | isAjaxInProgress = false;
159 | chart.hideLoading();
160 |
161 | if (response.data.data) {
162 | options = getOptions(response.data.data, scope.config, type);
163 | if (scope.config.forceClear) {
164 | chart.clear();
165 | }
166 | if (options.series.length) {
167 | chart.setOption(options);
168 | chart.resize();
169 | } else {
170 | chart.showLoading({ text: scope.config.errorMsg || '没有数据', textStyle: textStyle });
171 | }
172 | } else {
173 | chart.showLoading({ text: scope.config.emptyMsg || '数据加载失败', textStyle: textStyle });
174 | }
175 | });
176 |
177 | // if data is avaliable, render immediately
178 | } else {
179 | options = getOptions(scope.data, scope.config, type);
180 | if (scope.config.forceClear) {
181 | chart.clear();
182 | }
183 | if (options.series.length) {
184 | chart.setOption(options);
185 | chart.resize();
186 | } else {
187 | chart.showLoading({ text: scope.config.errorMsg || '没有数据', textStyle: textStyle });
188 | }
189 | }
190 | scope.chartObj = chart;
191 | }
192 |
193 | // update when charts config changes
194 | scope.$watch(function () { return scope.config; }, function (value) {
195 | if (value) { setOptions(); }
196 | }, true);
197 |
198 | scope.$watch(function () { return scope.data; }, function (value) {
199 | if (value) { setOptions(); }
200 | }, true);
201 |
202 | };
203 | }
204 |
205 | /**
206 | * add directives
207 | */
208 | var app = angular.module('angular-echarts', ['angular-echarts.theme', 'angular-echarts.util']);
209 | var types = ['line', 'bar', 'area', 'pie', 'donut', 'gauge', 'map', 'radar', 'heatmap'];
210 | for (var i = 0, n = types.length; i < n; i++) {
211 | (function (type) {
212 | app.directive(type + 'Chart', ['$http', 'theme', 'util', function ($http, theme, util) {
213 | return {
214 | restrict: 'EA',
215 | template: '',
216 | scope: {
217 | config: '=config',
218 | data: '=data',
219 | chartObj: '=?chartObj'
220 | },
221 | link: getLinkFunction($http, theme, util, type)
222 | };
223 | }]);
224 | })(types[i]);
225 | }
226 |
227 |
--------------------------------------------------------------------------------
/src/theme.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | /**
4 | * theme services
5 | * posible themes: infographic macarons shine dark blue green red gray default
6 | */
7 | angular.module('angular-echarts.theme', []).factory('theme', ['infographic', 'macarons', 'shine', 'dark', 'roma', function (infographic, macarons, shine, dark, roma) {
8 | var themes = {
9 | infographic: infographic,
10 | macarons: macarons,
11 | shine: shine,
12 | dark: dark,
13 | roma: roma,
14 | };
15 |
16 | return {
17 | get: function (name) {
18 | return themes[name] ? themes[name] : {};
19 | },
20 | };
21 |
22 | }]);
23 |
--------------------------------------------------------------------------------
/src/theme/dark.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | /**
4 | * dark theme
5 | */
6 | angular.module('angular-echarts.theme').factory('dark', function () {
7 |
8 | var log = function (msg) {
9 | if (typeof console !== 'undefined') {
10 | console && console.error && console.error(msg);
11 | }
12 | };
13 | if (!echarts) {
14 | log('ECharts is not Loaded');
15 | return;
16 | }
17 | var contrastColor = '#eee';
18 | var axisCommon = function () {
19 | return {
20 | axisLine: {
21 | lineStyle: {
22 | color: contrastColor
23 | }
24 | },
25 | axisTick: {
26 | lineStyle: {
27 | color: contrastColor
28 | }
29 | },
30 | axisLabel: {
31 | textStyle: {
32 | color: contrastColor
33 | }
34 | },
35 | splitLine: {
36 | lineStyle: {
37 | type: 'dashed',
38 | color: '#aaa'
39 | }
40 | },
41 | splitArea: {
42 | areaStyle: {
43 | color: contrastColor
44 | }
45 | }
46 | };
47 | };
48 |
49 | var colorPalette = ['#dd6b66','#759aa0','#e69d87','#8dc1a9','#ea7e53','#eedd78','#73a373','#73b9bc','#7289ab', '#91ca8c','#f49f42'];
50 | var theme = {
51 | color: colorPalette,
52 | backgroundColor: '#333',
53 | tooltip: {
54 | axisPointer: {
55 | lineStyle: {
56 | color: contrastColor
57 | },
58 | crossStyle: {
59 | color: contrastColor
60 | }
61 | }
62 | },
63 | legend: {
64 | textStyle: {
65 | color: contrastColor
66 | }
67 | },
68 | textStyle: {
69 | color: contrastColor
70 | },
71 | title: {
72 | textStyle: {
73 | color: contrastColor
74 | }
75 | },
76 | toolbox: {
77 | iconStyle: {
78 | normal: {
79 | borderColor: contrastColor
80 | }
81 | }
82 | },
83 | dataZoom: {
84 | textStyle: {
85 | color: contrastColor
86 | }
87 | },
88 | timeline: {
89 | lineStyle: {
90 | color: contrastColor
91 | },
92 | itemStyle: {
93 | normal: {
94 | color: colorPalette[1]
95 | }
96 | },
97 | label: {
98 | normal: {
99 | textStyle: {
100 | color: contrastColor
101 | }
102 | }
103 | },
104 | controlStyle: {
105 | normal: {
106 | color: contrastColor,
107 | borderColor: contrastColor
108 | }
109 | }
110 | },
111 | timeAxis: axisCommon(),
112 | logAxis: axisCommon(),
113 | valueAxis: axisCommon(),
114 | categoryAxis: axisCommon(),
115 |
116 | line: {
117 | symbol: 'circle'
118 | },
119 | graph: {
120 | color: colorPalette
121 | },
122 | gauge: {
123 | title: {
124 | textStyle: {
125 | color: contrastColor
126 | }
127 | }
128 | },
129 | candlestick: {
130 | itemStyle: {
131 | normal: {
132 | color: '#FD1050',
133 | color0: '#0CF49B',
134 | borderColor: '#FD1050',
135 | borderColor0: '#0CF49B'
136 | }
137 | }
138 | }
139 | };
140 | theme.categoryAxis.splitLine.show = false;
141 | echarts.registerTheme('dark', theme);
142 |
143 | return theme;
144 | });
145 |
--------------------------------------------------------------------------------
/src/theme/infographic.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | /**
4 | * infographic theme
5 | */
6 | angular.module('angular-echarts.theme').factory('infographic', function() {
7 |
8 | var log = function(msg) {
9 | if (typeof console !== 'undefined') {
10 | console && console.error && console.error(msg);
11 | }
12 | };
13 | if (!echarts) {
14 | log('ECharts is not Loaded');
15 | return;
16 | }
17 |
18 | var colorPalette = [
19 | '#C1232B', '#27727B', '#FCCE10', '#E87C25', '#B5C334',
20 | '#FE8463', '#9BCA63', '#FAD860', '#F3A43B', '#60C0DD',
21 | '#D7504B', '#C6E579', '#F4E001', '#F0805A', '#26C0C0'
22 | ];
23 |
24 | var theme = {
25 |
26 | color: colorPalette,
27 |
28 | title: {
29 | textStyle: {
30 | fontWeight: 'normal',
31 | color: '#27727B'
32 | }
33 | },
34 |
35 | visualMap: {
36 | color: ['#C1232B', '#FCCE10']
37 | },
38 |
39 | toolbox: {
40 | iconStyle: {
41 | normal: {
42 | borderColor: colorPalette[0]
43 | }
44 | }
45 | },
46 |
47 | tooltip: {
48 | backgroundColor: 'rgba(50,50,50,0.5)',
49 | axisPointer: {
50 | type: 'line',
51 | lineStyle: {
52 | color: '#27727B',
53 | type: 'dashed'
54 | },
55 | crossStyle: {
56 | color: '#27727B'
57 | },
58 | shadowStyle: {
59 | color: 'rgba(200,200,200,0.3)'
60 | }
61 | }
62 | },
63 |
64 | dataZoom: {
65 | dataBackgroundColor: 'rgba(181,195,52,0.3)',
66 | fillerColor: 'rgba(181,195,52,0.2)',
67 | handleColor: '#27727B'
68 | },
69 |
70 | categoryAxis: {
71 | axisLine: {
72 | lineStyle: {
73 | color: '#27727B'
74 | }
75 | },
76 | splitLine: {
77 | show: false
78 | }
79 | },
80 |
81 | valueAxis: {
82 | axisLine: {
83 | show: false
84 | },
85 | splitArea: {
86 | show: false
87 | },
88 | splitLine: {
89 | lineStyle: {
90 | color: ['#ccc'],
91 | type: 'dashed'
92 | }
93 | }
94 | },
95 |
96 | timeline: {
97 | lineStyle: {
98 | color: '#27727B'
99 | },
100 | controlStyle: {
101 | normal: {
102 | color: '#27727B',
103 | borderColor: '#27727B'
104 | }
105 | },
106 | symbol: 'emptyCircle',
107 | symbolSize: 3
108 | },
109 |
110 | line: {
111 | itemStyle: {
112 | normal: {
113 | borderWidth: 2,
114 | borderColor: '#fff',
115 | lineStyle: {
116 | width: 3
117 | }
118 | },
119 | emphasis: {
120 | borderWidth: 0
121 | }
122 | },
123 | symbol: 'circle',
124 | symbolSize: 3.5
125 | },
126 |
127 | candlestick: {
128 | itemStyle: {
129 | normal: {
130 | color: '#C1232B',
131 | color0: '#B5C334',
132 | lineStyle: {
133 | width: 1,
134 | color: '#C1232B',
135 | color0: '#B5C334'
136 | }
137 | }
138 | }
139 | },
140 |
141 | graph: {
142 | color: colorPalette
143 | },
144 |
145 | map: {
146 | label: {
147 | normal: {
148 | textStyle: {
149 | color: '#C1232B'
150 | }
151 | },
152 | emphasis: {
153 | textStyle: {
154 | color: 'rgb(100,0,0)'
155 | }
156 | }
157 | },
158 | itemStyle: {
159 | normal: {
160 | areaColor: '#ddd',
161 | borderColor: '#eee'
162 | },
163 | emphasis: {
164 | areaColor: '#fe994e'
165 | }
166 | }
167 | },
168 |
169 | gauge: {
170 | axisLine: {
171 | lineStyle: {
172 | color: [
173 | [0.2, '#B5C334'],
174 | [0.8, '#27727B'],
175 | [1, '#C1232B']
176 | ]
177 | }
178 | },
179 | axisTick: {
180 | splitNumber: 2,
181 | length: 5,
182 | lineStyle: {
183 | color: '#fff'
184 | }
185 | },
186 | axisLabel: {
187 | textStyle: {
188 | color: '#fff'
189 | }
190 | },
191 | splitLine: {
192 | length: '5%',
193 | lineStyle: {
194 | color: '#fff'
195 | }
196 | },
197 | title: {
198 | offsetCenter: [0, -20]
199 | }
200 | }
201 | };
202 |
203 | echarts.registerTheme('infographic', theme);
204 |
205 | return theme;
206 | });
207 |
--------------------------------------------------------------------------------
/src/theme/macarons.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | /**
4 | * macarons theme
5 | */
6 | angular.module('angular-echarts.theme').factory('macarons', function () {
7 |
8 | var log = function (msg) {
9 | if (typeof console !== 'undefined') {
10 | console && console.error && console.error(msg);
11 | }
12 | };
13 | if (!echarts) {
14 | log('ECharts is not Loaded');
15 | return;
16 | }
17 |
18 | var colorPalette = [
19 | '#2ec7c9','#b6a2de','#5ab1ef','#ffb980','#d87a80',
20 | '#8d98b3','#e5cf0d','#97b552','#95706d','#dc69aa',
21 | '#07a2a4','#9a7fd1','#588dd5','#f5994e','#c05050',
22 | '#59678c','#c9ab00','#7eb00a','#6f5553','#c14089'
23 | ];
24 |
25 |
26 | var theme = {
27 | color: colorPalette,
28 |
29 | title: {
30 | textStyle: {
31 | fontWeight: 'normal',
32 | color: '#008acd'
33 | }
34 | },
35 |
36 | visualMap: {
37 | itemWidth: 15,
38 | color: ['#5ab1ef','#e0ffff']
39 | },
40 |
41 | toolbox: {
42 | iconStyle: {
43 | normal: {
44 | borderColor: colorPalette[0]
45 | }
46 | }
47 | },
48 |
49 | tooltip: {
50 | backgroundColor: 'rgba(50,50,50,0.5)',
51 | axisPointer : {
52 | type : 'line',
53 | lineStyle : {
54 | color: '#008acd'
55 | },
56 | crossStyle: {
57 | color: '#008acd'
58 | },
59 | shadowStyle : {
60 | color: 'rgba(200,200,200,0.2)'
61 | }
62 | }
63 | },
64 |
65 | dataZoom: {
66 | dataBackgroundColor: '#efefff',
67 | fillerColor: 'rgba(182,162,222,0.2)',
68 | handleColor: '#008acd'
69 | },
70 |
71 | grid: {
72 | borderColor: '#eee'
73 | },
74 |
75 | categoryAxis: {
76 | axisLine: {
77 | lineStyle: {
78 | color: '#008acd'
79 | }
80 | },
81 | splitLine: {
82 | lineStyle: {
83 | color: ['#eee']
84 | }
85 | }
86 | },
87 |
88 | valueAxis: {
89 | axisLine: {
90 | lineStyle: {
91 | color: '#008acd'
92 | }
93 | },
94 | splitArea : {
95 | show : true,
96 | areaStyle : {
97 | color: ['rgba(250,250,250,0.1)','rgba(200,200,200,0.1)']
98 | }
99 | },
100 | splitLine: {
101 | lineStyle: {
102 | color: ['#eee']
103 | }
104 | }
105 | },
106 |
107 | timeline : {
108 | lineStyle : {
109 | color : '#008acd'
110 | },
111 | controlStyle : {
112 | normal : { color : '#008acd'},
113 | emphasis : { color : '#008acd'}
114 | },
115 | symbol : 'emptyCircle',
116 | symbolSize : 3
117 | },
118 |
119 | line: {
120 | smooth : true,
121 | symbol: 'emptyCircle',
122 | symbolSize: 3
123 | },
124 |
125 | candlestick: {
126 | itemStyle: {
127 | normal: {
128 | color: '#d87a80',
129 | color0: '#2ec7c9',
130 | lineStyle: {
131 | color: '#d87a80',
132 | color0: '#2ec7c9'
133 | }
134 | }
135 | }
136 | },
137 |
138 | scatter: {
139 | symbol: 'circle',
140 | symbolSize: 4
141 | },
142 |
143 | map: {
144 | label: {
145 | normal: {
146 | textStyle: {
147 | color: '#d87a80'
148 | }
149 | }
150 | },
151 | itemStyle: {
152 | normal: {
153 | borderColor: '#eee',
154 | areaColor: '#ddd'
155 | },
156 | emphasis: {
157 | areaColor: '#fe994e'
158 | }
159 | }
160 | },
161 |
162 | graph: {
163 | color: colorPalette
164 | },
165 |
166 | gauge : {
167 | axisLine: {
168 | lineStyle: {
169 | color: [[0.2, '#2ec7c9'],[0.8, '#5ab1ef'],[1, '#d87a80']],
170 | width: 10
171 | }
172 | },
173 | axisTick: {
174 | splitNumber: 10,
175 | length :15,
176 | lineStyle: {
177 | color: 'auto'
178 | }
179 | },
180 | splitLine: {
181 | length :22,
182 | lineStyle: {
183 | color: 'auto'
184 | }
185 | },
186 | pointer : {
187 | width : 5
188 | }
189 | }
190 | };
191 |
192 | echarts.registerTheme('macarons', theme);
193 |
194 | return theme;
195 | });
196 |
--------------------------------------------------------------------------------
/src/theme/roma.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | /**
4 | * blue theme
5 | */
6 | angular.module('angular-echarts.theme').factory('roma', function() {
7 | var log = function(msg) {
8 | if (typeof console !== 'undefined') {
9 | console && console.error && console.error(msg);
10 | }
11 | };
12 | if (!echarts) {
13 | log('ECharts is not Loaded');
14 | return;
15 | }
16 |
17 | var colorPalette = ['#E01F54', '#001852', '#f5e8c8', '#b8d2c7', '#c6b38e',
18 | '#a4d8c2', '#f3d999', '#d3758f', '#dcc392', '#2e4783',
19 | '#82b6e9', '#ff6347', '#a092f1', '#0a915d', '#eaf889',
20 | '#6699FF', '#ff6666', '#3cb371', '#d5b158', '#38b6b6'
21 | ];
22 |
23 | var theme = {
24 | color: colorPalette,
25 |
26 | visualMap: {
27 | color: ['#e01f54', '#e7dbc3'],
28 | textStyle: {
29 | color: '#333'
30 | }
31 | },
32 |
33 | candlestick: {
34 | itemStyle: {
35 | normal: {
36 | color: '#e01f54',
37 | color0: '#001852',
38 | lineStyle: {
39 | width: 1,
40 | color: '#f5e8c8',
41 | color0: '#b8d2c7'
42 | }
43 | }
44 | }
45 | },
46 |
47 | graph: {
48 | color: colorPalette
49 | },
50 |
51 | gauge: {
52 | axisLine: {
53 | lineStyle: {
54 | color: [
55 | [0.2, '#E01F54'],
56 | [0.8, '#b8d2c7'],
57 | [1, '#001852']
58 | ],
59 | width: 8
60 | }
61 | }
62 | }
63 | };
64 |
65 | echarts.registerTheme('roma', theme);
66 |
67 | return echarts;
68 | });
69 |
--------------------------------------------------------------------------------
/src/theme/shine.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | /**
4 | * shine theme
5 | */
6 | angular.module('angular-echarts.theme').factory('shine', function() {
7 | var log = function(msg) {
8 | if (typeof console !== 'undefined') {
9 | console && console.error && console.error(msg);
10 | }
11 | };
12 | if (!echarts) {
13 | log('ECharts is not Loaded');
14 | return;
15 | }
16 |
17 | var colorPalette = [
18 | '#c12e34', '#e6b600', '#0098d9', '#2b821d',
19 | '#005eaa', '#339ca8', '#cda819', '#32a487'
20 | ];
21 |
22 | var theme = {
23 |
24 | color: colorPalette,
25 |
26 | title: {
27 | textStyle: {
28 | fontWeight: 'normal'
29 | }
30 | },
31 |
32 | visualMap: {
33 | color: ['#1790cf', '#a2d4e6']
34 | },
35 |
36 | toolbox: {
37 | iconStyle: {
38 | normal: {
39 | borderColor: '#06467c'
40 | }
41 | }
42 | },
43 |
44 | tooltip: {
45 | backgroundColor: 'rgba(0,0,0,0.6)'
46 | },
47 |
48 | dataZoom: {
49 | dataBackgroundColor: '#dedede',
50 | fillerColor: 'rgba(154,217,247,0.2)',
51 | handleColor: '#005eaa'
52 | },
53 |
54 | timeline: {
55 | lineStyle: {
56 | color: '#005eaa'
57 | },
58 | controlStyle: {
59 | normal: {
60 | color: '#005eaa',
61 | borderColor: '#005eaa'
62 | }
63 | }
64 | },
65 |
66 | candlestick: {
67 | itemStyle: {
68 | normal: {
69 | color: '#c12e34',
70 | color0: '#2b821d',
71 | lineStyle: {
72 | width: 1,
73 | color: '#c12e34',
74 | color0: '#2b821d'
75 | }
76 | }
77 | }
78 | },
79 |
80 | graph: {
81 | color: colorPalette
82 | },
83 |
84 | map: {
85 | label: {
86 | normal: {
87 | textStyle: {
88 | color: '#c12e34'
89 | }
90 | },
91 | emphasis: {
92 | textStyle: {
93 | color: '#c12e34'
94 | }
95 | }
96 | },
97 | itemStyle: {
98 | normal: {
99 | borderColor: '#eee',
100 | areaColor: '#ddd'
101 | },
102 | emphasis: {
103 | areaColor: '#e6b600'
104 | }
105 | }
106 | },
107 |
108 | gauge: {
109 | axisLine: {
110 | show: true,
111 | lineStyle: {
112 | color: [
113 | [0.2, '#2b821d'],
114 | [0.8, '#005eaa'],
115 | [1, '#c12e34']
116 | ],
117 | width: 5
118 | }
119 | },
120 | axisTick: {
121 | splitNumber: 10,
122 | length: 8,
123 | lineStyle: {
124 | color: 'auto'
125 | }
126 | },
127 | axisLabel: {
128 | textStyle: {
129 | color: 'auto'
130 | }
131 | },
132 | splitLine: {
133 | length: 12,
134 | lineStyle: {
135 | color: 'auto'
136 | }
137 | },
138 | pointer: {
139 | length: '90%',
140 | width: 3,
141 | color: 'auto'
142 | },
143 | title: {
144 | textStyle: {
145 | color: '#333'
146 | }
147 | },
148 | detail: {
149 | textStyle: {
150 | color: 'auto'
151 | }
152 | }
153 | }
154 | };
155 |
156 | echarts.registerTheme('shine', theme);
157 |
158 | return theme;
159 | });
160 |
--------------------------------------------------------------------------------
/src/util.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | /**
4 | * util services
5 | */
6 | angular.module('angular-echarts.util', []).factory('util', function () {
7 |
8 | function isPieChart(type) {
9 | return ['pie', 'donut'].indexOf(type) > -1;
10 | }
11 |
12 | function isMapChart(type) {
13 | return ['map'].indexOf(type) > -1;
14 | }
15 |
16 | function isAxisChart(type) {
17 | return ['line', 'bar', 'area'].indexOf(type) > -1;
18 | }
19 |
20 | function isHeatmapChart(type) {
21 | return ['heatmap'].indexOf(type) > -1;
22 | }
23 |
24 | /**
25 | * get x axis ticks from the 1st serie
26 | */
27 | function getAxisTicks(data, config, type) {
28 | var ticks = [];
29 | if (data[0]) {
30 | angular.forEach(data[0].datapoints, function (datapoint) {
31 | ticks.push(datapoint.x);
32 | });
33 | }
34 |
35 | return {
36 | type: 'category',
37 | boundaryGap: type === 'bar',
38 | data: ticks,
39 | };
40 | }
41 |
42 | /**
43 | * get series config
44 | *
45 | * @param {Array} data serie data
46 | * @param {Object} config options
47 | * @param {String} chart type
48 | */
49 | function getSeries(data, config, type) {
50 | var series = [];
51 | angular.forEach(data, function (serie) {
52 | // datapoints for line, area, bar chart
53 | var datapoints = [];
54 | angular.forEach(serie.datapoints, function (datapoint) {
55 | datapoints.push(datapoint.y);
56 | });
57 |
58 | var conf = {
59 | type: type || 'line',
60 | name: serie.name,
61 | data: datapoints,
62 | };
63 | conf = angular.extend(conf, serie);
64 |
65 | // area chart is actually line chart with special itemStyle
66 | if (type === 'area') {
67 | conf.type = 'line';
68 | conf.itemStyle = conf.itemStyle || {
69 | normal: { areaStyle: { type: 'default'}}
70 | };
71 | }
72 |
73 | // gauge chart need many special config
74 | if (type === 'gauge') {
75 | conf = angular.extend(conf, {
76 | splitNumber: 10, // 分割段数,默认为5
77 | axisLine: { // 坐标轴线
78 | lineStyle: { // 属性lineStyle控制线条样式
79 | color: [[0.2, '#228b22'], [0.8, '#48b'], [1, '#ff4500']],
80 | width: 8
81 | }
82 | },
83 | axisTick: { // 坐标轴小标记
84 | splitNumber: 10, // 每份split细分多少段
85 | length :12, // 属性length控制线长
86 | lineStyle: { // 属性lineStyle控制线条样式
87 | color: 'auto'
88 | }
89 | },
90 | axisLabel: { // 坐标轴文本标签,详见axis.axisLabel
91 | textStyle: { // 其余属性默认使用全局文本样式,详见TEXTSTYLE
92 | color: 'auto'
93 | }
94 | },
95 | splitLine: { // 分隔线
96 | show: true, // 默认显示,属性show控制显示与否
97 | length :30, // 属性length控制线长
98 | lineStyle: { // 属性lineStyle(详见lineStyle)控制线条样式
99 | color: 'auto'
100 | }
101 | },
102 | pointer: {
103 | width: 5
104 | },
105 | title: {
106 | show: true,
107 | offsetCenter: [0, '-40%'], // x, y,单位px
108 | textStyle: { // 其余属性默认使用全局文本样式,详见TEXTSTYLE
109 | fontWeight: 'bolder'
110 | }
111 | },
112 | detail: {
113 | formatter: '{value}%',
114 | textStyle: { // 其余属性默认使用全局文本样式,详见TEXTSTYLE
115 | color: 'auto',
116 | fontWeight: 'bolder'
117 | }
118 | },
119 | }, config.gauge || {});
120 | }
121 |
122 | // datapoints for pie chart and gauges are different
123 | if (!isAxisChart(type)) {
124 | conf.data = [];
125 | angular.forEach(serie.datapoints, function (datapoint) {
126 | conf.data.push({value: datapoint.y, name: datapoint.x });
127 | });
128 | }
129 |
130 | if (isPieChart(type)) {
131 | // donut charts are actually pie charts
132 | conf.type = 'pie';
133 |
134 | // pie chart need special radius, center config
135 | conf.center = config.center || ['40%', '50%'];
136 | conf.radius = config.radius || '60%';
137 |
138 | // donut chart require special itemStyle
139 | if (type === 'donut') {
140 | conf.radius = config.radius || ['50%', '70%'];
141 | conf = angular.extend(conf, {
142 | itemStyle: {
143 | normal: {
144 | label: {
145 | show: false
146 | },
147 | labelLine: {
148 | show: false
149 | }
150 | },
151 | emphasis: {
152 | label: {
153 | show: true,
154 | position: 'center',
155 | textStyle: {
156 | fontSize: '50',
157 | fontWeight: 'bold'
158 | }
159 | }
160 | }
161 | }
162 | }, config.donut || {});
163 | } else if (type === 'pie') {
164 | conf = angular.extend(conf, {
165 | itemStyle: {
166 | normal : {
167 | label : {
168 | position : 'inner',
169 | formatter : function (item) {
170 | return (+item.percent).toFixed() + '%';
171 | }
172 | },
173 | labelLine : {
174 | show : false
175 | }
176 | },
177 | emphasis : {
178 | label : {
179 | show : true,
180 | formatter : '{b}\n{d}%'
181 | }
182 | }
183 | }
184 | }, config.pie || {});
185 | }
186 | }
187 |
188 | if (isMapChart(type)) {
189 | conf.type = 'map';
190 | conf = angular.extend(conf, serie, config.map || {});
191 | }
192 |
193 | // if stack set to true
194 | if (config.stack) {
195 | conf.stack = 'total';
196 | }
197 |
198 | if (type === 'radar') {
199 | conf.data = serie.data;
200 | }
201 |
202 | if (isHeatmapChart(type)) {
203 | conf.type = 'heatmap';
204 | conf.name = serie.name;
205 | conf.data = serie.data;
206 | conf = angular.extend(conf, {
207 | label: {
208 | normal: {
209 | show: true
210 | }
211 | },
212 | itemStyle: {
213 | emphasis: {
214 | shadowBlur: 10,
215 | shadowColor: 'rgba(0, 0, 0, 0.5)'
216 | }
217 | }
218 | }, config.heatmap || {});
219 | }
220 |
221 | series.push(conf);
222 | });
223 |
224 | return series;
225 | }
226 |
227 | /**
228 | * get legends from data series
229 | */
230 | function getLegend(data, config, type) {
231 | var legend = { data: []};
232 | if (isPieChart(type)) {
233 | if (data[0]) {
234 | angular.forEach(data[0].datapoints, function (datapoint) {
235 | legend.data.push(datapoint.x);
236 | });
237 | }
238 | legend.orient = 'verticle';
239 | legend.x = 'right';
240 | legend.y = 'center';
241 | } else if (type === 'map') {
242 | legend = {};
243 | } else {
244 | angular.forEach(data, function (serie) {
245 | legend.data.push(serie.name);
246 | });
247 | legend.orient = 'horizontal';
248 | }
249 |
250 | return angular.extend(legend, config.legend || {});
251 | }
252 |
253 | /**
254 | * get tooltip config
255 | */
256 | function getTooltip(data, config, type) {
257 | var tooltip = {};
258 |
259 | switch (type) {
260 | case 'line':
261 | case 'area':
262 | tooltip.trigger = 'axis';
263 | break;
264 | case 'pie':
265 | case 'donut':
266 | case 'bar':
267 | case 'map':
268 | case 'gauge':
269 | tooltip.trigger = 'item';
270 | break;
271 | }
272 |
273 | if (type === 'pie') {
274 | tooltip.formatter = '{a}
{b}: {c} ({d}%)';
275 | }
276 |
277 | if (type === 'map') {
278 | tooltip.formatter = '{b}';
279 | }
280 |
281 | return angular.extend(tooltip, angular.isObject(config.tooltip) ? config.tooltip : {});
282 | }
283 |
284 | function getTitle(data, config, type) {
285 | if (angular.isObject(config.title)) {
286 | return config.title;
287 | }
288 |
289 | return isPieChart(type) ? null: {
290 | text: config.title,
291 | subtext: config.subtitle || '',
292 | x: 50,
293 | };
294 | }
295 |
296 | function formatKMBT(y, formatter) {
297 | if (!formatter) {
298 | formatter = function (v) { return Math.round(v * 100) / 100; };
299 | }
300 | y = Math.abs(y);
301 | if (y >= 1000000000000) { return formatter(y / 1000000000000) + 'T'; }
302 | else if (y >= 1000000000) { return formatter(y / 1000000000) + 'B'; }
303 | else if (y >= 1000000) { return formatter(y / 1000000) + 'M'; }
304 | else if (y >= 1000) { return formatter(y / 1000) + 'K'; }
305 | else if (y < 1 && y > 0) { return formatter(y); }
306 | else if (y === 0) { return ''; }
307 | else { return formatter(y); }
308 | }
309 |
310 | return {
311 | isPieChart: isPieChart,
312 | isAxisChart: isAxisChart,
313 | isHeatmapChart: isHeatmapChart,
314 | getAxisTicks: getAxisTicks,
315 | getSeries: getSeries,
316 | getLegend: getLegend,
317 | getTooltip: getTooltip,
318 | getTitle: getTitle,
319 | formatKMBT: formatKMBT,
320 | };
321 |
322 | });
323 |
--------------------------------------------------------------------------------