├── .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¿¥I†j@ž","@@…¡‰@ˆV^RqˆBbAŒnTXe„†žQr™©C","@@ÆEE—„kWqë 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":[["@@\\a“M`ǽÓnUK…Ĝēs¤­©yrý§uģŒc†JŠ»eIˆ€P]‚ªr‰ºc_ħ²G¼s`jΟnüsœľP","@@U`Ts¿mĂ","@@FŸƒ•›Oh‡đ©OŸ›iÃ`ww^ƒÌkŸ‘ÑH«ƇǤŗĺtFu…{Z}Ö@U‡´…ʚLg®¯Oı°ÃwŸ ^˜—€VbÉs‡ˆmA…ê]]w„§›RRl£‡ŭuw›N—Á`ÇFēÝčȻŽuT¡Ĺ—¯Õ¯sŗő£YªhV’ƍ£ƅnëYNgƒq¼ś¿µı²UºÝUąŽąŖóŒxV@tˆƯŒJ”]eƒR¾fe|rHA˜|h~Ėƍl§ÏŠjVë` ØoˆÅbbx³^zÃ͚¶Sj®A”yÂhðk`š«P€”ˈµEF†Û¬Y¨Ļrõqi¼‰Wi°§’б²°`[ˆÀ|ĠO@ÆxO\\tŽa\\p_Zõ^û{ġŒȧXýĪÓjùÎRb›š^λj{íděYfíÙTyމmńŵōHim½’éŅ­aVcř§ax¹XŻác‡žWU£ôãºQ¨÷Ñws¥qEH‰Ù|‰›šYQoŕÇyáĂ£MðoťÊ‰P¡mšWO¡€v†{ôvîēÜISpÌhp¨ ‘j†deŔQÖj˜X³à™Ĉ[n`Yp@Už–cM`’RKhŒEbœ”pŞlNut®Etq‚nsÁŠgA‹iú‹oH‡qCX‡”hfgu“~ϋWP½¢G^}¯ÅīGCŸÑ^ãziMáļMTÃƘrMc|O_ž¯Ŏ´|‡morDkO\\mĆJfl@c̬¢aĦtRıҙXòë¬WP{ŵǫƝ…›īÛ÷ąV×qƥV¿aȉd³B›qPBm›aËđŻģm“Å®Vйd^K‡KoŸnYg“¯Xhqa”Ldu¥•ÍpDž¡KąÅƒkĝęěhq‡}HyÓ]¹ǧ£…Í÷¿qá•gPmoeœi‰¤o^á¾ZE‡˜Y^…Ný{n•ƒOl±Í“@M’ċèk§da‹‘NaÇį¿]ø‰RiiñE‰€ū‹i„DZàUtėGylƒ}ŒÓM}€jpEC~¡FtoQi‘šHkk{ILgĽxqÈƋÄd–eVŽDJj£€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|hYh•gŃfmÖĩnº€T̒Sp›¢dYĤ¶UĈjl’ǐpäðëx³kÛfw²Xjz~ÂqbTŠÑ„ěŨ@|oM‡’zv¢ZrÃVw¬ŧˏfŒ°ÐT€ªqŽs{Sž¯r æÝl¼ÖĞ džiGʂJ™¼lr}~K¨ŸƐÌWö€™¼œÞ°nÞoĦLš†|C~“D©|q]SvK€ÑcwpÏρ†ĿćènĪWlĄkT}¬Tpš~ƒ®Hgd„‰†˒劔ŽBVt„EÀ¢ôPĎƗè@~‚k–ü\\rÊĔÖæW_§¼F˜†´©òDòj’ˆYÈrbĞāøŀG{ƀ|¦ðrb|ÀH`pʞkv‚GpuARhÞÆǶ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ģ¡coœ‘TS˹ĪmnÕńe–hZg{gtwªpXaĚThȑp{¶Eh—®RćƑP¿£‘PmcªaJyý{ƒýȥoÅîɡųAďä³aωJ‘½¥PG­ąSM­sWz½µÛ€‘YӀŖgxoOkĒCo­Èµ]¯_²ÕjāŽK~©ÅØ^ԛkïçămϑk]­±ƒcݯÑÃmQÍ~_a—pm…~ç¡q“ˆu{JÅŧ·Ls}–EyÁÆcI{¤IiCfUc•ƌÃp§]웫vD@¡SÀ‘µM‚ÅwuŽYY‡¡DbÑc¡hƒ×]nkoQdaMç~eD•ÛtT‰©±@¥ù@É¡‰ZcW|WqOJmĩl«ħşvOÓ«IqăV—¥ŸD[mI~Ó¢cehiÍ]Ɠ~ĥqXŠ·eƷœn±“}v•[ěďŽŕ]_‘œ•`‰¹ƒ§ÕōI™o©b­s^}Ét±ū«³p£ÿ¥WÑxçÁ«h×u׌¥ř„‹¾dÒ{ºvĴÎêÌɊ²¶€ü¨|ÞƸµȲ‘LLúÉƎ¤ϊęĔV`„_bª‹S^|ŸdŠzY|dz¥p†ZbÆ£¶ÒK}tĦÔņƠ‚PYzn€ÍvX¶Ěn ĠÔ„zý¦ª˜÷žÑĸَUȌ¸‚dòÜJð´’ìúNM¬ŒXZ´‘¤ŊǸ_tldIš{¦ƀðĠȤ¥NehXnYG‚‡R° ƬDj¬¸|CĞ„Kq‚ºfƐiĺ©ª~ĆOQª ¤@ìǦɌ²æBŒÊ”TœĞšHƘÁĪËĖ’šĴŞ–ȀœÆÿȄlŤĒö„t”νî¼ĨXhŒ‘˜|ªM¤ÐzÞĩ҃S‰rao³"],"encodeOffsets":[[117016,41452]]},"properties":{"cp":[112.549248,37.857014],"name":"山西","childNum":1}},{"id":"150000","geometry":{"type":"MultiPolygon","coordinates":[["@@ǪƫÌÛM…Ă[`՞Cn}¶Vc…ê“sƒ–¯‹PqƒFB…‰|S•³C|kñ•H‹d‘iÄ¥sˆʼnő…PóÑÑE^‘ÅPpy_YtS™hQ·aHwsOnʼnÚs©iqj›‰€USiº]ïWš‰«gW¡A–R붛ijʕ…Œů`çõh]y»ǃŸǛҤxÒm~zf}pf|ÜroÈzrKÈĵSƧ„ż؜Ġu~è¬vîS¼™Ăh–šĖMÈÄw‚\\fŦ°W ¢¾luŸD„wŠ\\Ŗĝ","@@ƒGVu»A—ylßí¹ãe’“]Eāò³C¹ð“¾ˆ²iŒÒAdkò^P“²CǜңDŽ z¼g^èöŰ_‹‚–†IJĕꄜ}gÁnUI«m‰…„‹]j‡vV¼euhwqA„aW˜ƒ_µj…»çjioQR¹ēÃßt@r³[ÛlćË^ÍÉáG“›OUۗOB±•XŸkŇ¹£k|e]ol™ŸkVͼÕqtaÏõjgÁ£§U^Œ”RLˆËnX°Ç’Bz†^~wfvˆypV ¯„ƫĉ˭ȫƗŷɿÿĿƑ˃ĝÿÃǃßËőó©ǐȍŒĖ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¥Fƒ“T՛¿Jû‡]|mvāÎYua^WoÀa·­ząÒot×¶CLƗi¯¤mƎHNJ¤îìɾŊìTdåwsRÖgĒųúÍġäÕ}Q¶—ˆ¿A•†‹[¡Œ{d×uQAƒ›M•xV‹vMOmăl«ct[wº_šÇʊŽŸjb£ĦS_é“QZ“_lwgOiýe`YYJq¥IÁˆdz£ÙË[ÕªuƏ³ÍT—s·bÁĽäė[›b[ˆŗfãcn¥îC¿÷µ[ŏÀQ­ōšĉm¿Á^£mJVm‡—L[{Ï_£›F¥Ö{ŹA}…×Wu©ÅaųijƳhB{·TQqÙIķˑZđ©Yc|M¡…L•eVUóK_QWk’_ĥ‘¿ãZ•»X\\ĴuUƒè‡lG®ěłTĠğDє›žG‚ÆÍz]‹±…ŭ©ŸÅ’]ŒÅÐ}UË¥©Tċ™ïxgckfWgi\\ÏĒ¥HkµE˜ë{»ÏetcG±ahUiñiWsɁˆ·c–C‚Õk]wȑ|ća}w…VaĚ᠞ŒG°ùnM¬¯†{ÈˆÐÆA’¥ÄêJxÙ¢”hP¢Ûˆº€µwWOŸóFŽšÁz^ÀŗÎú´§¢T¤ǻƺSė‰ǵhÝÅQgvBHouʝl_o¿Ga{ïq{¥|ſĿHĂ÷aĝÇq‡Z‘ñiñC³ª—…»E`¨åXēÕqÉû[l•}ç@čƘóO¿¡ƒFUsA‰“ʽīccšocƒ‚ƒÇS}„“£‡IS~ălkĩXçmĈ…ŀЂoÐdxÒuL^T{r@¢‘žÍƒĝKén£kQ™‰yšÅõËXŷƏL§~}kqš»IHėDžjĝŸ»ÑÞoŸå°qTt|r©ÏS‹¯·eŨĕx«È[eMˆ¿yuˆ‘pN~¹ÏyN£{©’—g‹ħWí»Í¾s“əšDž_ÃĀɗ±ą™ijĉʍŌŷ—S›É“A‹±åǥɋ@럣R©ąP©}ĹªƏj¹erƒLDĝ·{i«ƫC½ÉshVz…GS|úþX”gp›{ÁX¿Ÿć{ƱȏñZáĔyoÁhA™}ŅĆfdʼn„_¹„Y°ėǩÑ¡H¯¶oMQqð¡Ë™|‘Ñ`ƭŁX½·óۓxğįÅcQ‡ˆ“ƒs«tȋDžF“Ÿù^i‘t«Č¯[›hAi©á¥ÇĚ×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ľýľώȪƺɂļžxœZĈ}ÌʼnŪ˜ĺœŽĭFЛĽ̅ȣͽÒŵìƩÇϋÿȮǡŏçƑůĕ~Ǎ›¼ȳÐUf†dIxÿ\\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~´°ÎFC•ŽU¼pĀēƄN¦¾O¶ŠłKĊOj“Ě”j´ĜYp˜{¦„ˆSĚÍ\\Tš×ªV–÷Ší¨ÅDK°ßtŇĔKš¨ǵÂcḷ̌ĚǣȄĽF‡lġUĵœŇ‹ȣFʉɁƒMğįʏƶɷØŭOǽ«ƽū¹Ʊő̝Ȩ§ȞʘĖiɜɶʦ}¨֪ࠜ̀ƇǬ¹ǨE˦ĥªÔêFŽxúQ„Er´W„rh¤Ɛ \\talĈDJ˜Ü|[Pll̚¸ƎGú´Pž¬W¦†^¦–H]prR“n|or¾wLVnÇIujkmon£cX^Bh`¥V”„¦U¤¸}€xRj–[^xN[~ªŠxQ„‚[`ªHÆÂExx^wšN¶Ê˜|¨ì†˜€MrœdYp‚oRzNy˜ÀDs~€bcfÌ`L–¾n‹|¾T‚°c¨È¢a‚r¤–`[|òDŞĔöxElÖdH„ÀI`„Ď\\Àì~ƎR¼tf•¦^¢ķ¶e”ÐÚMŒptgj–„ɡČÅ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£ʺ™oqNŸƒwğc`ue—tOj×°KJ±qƒÆġm‰Ěŗos¬…qehqsuœƒH{¸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","@@d†c","@@eÀ‚C@b‚“‰","@@f‡…Xwkbr–Ä`qg","@@^jtWQ","@@~ Y[c","@@I`ĖN^_¿Z‚ÁM","@@Ïxnj{q_×^Gigp","@@iX¶B…Y","@@„Y…Z","@@L_yG`b","@@^WqCTZ","@@\\[“‹§t|”ž]","@@m`p[","@@@œé^B†‡ntˆaÊU—˜Ÿ]x ¯ÄPIJ­°h€ʙK³†VˆÕ@Y~†|EvĹsDŽ¦­L^p²ŸÒG ’Ël]„xxÄ_˜fT¤Ď¤cŽœP„–C¨¸TVjbgH²sdÎdHt`Bˆ—²¬GJję¶[ÐhjeXdlwhšðSȦªVÊπ‹Æ‘Z˜ÆŶ®²†^ŒÎyÅ‚Hœń“ĚDMħĜŁH­ˆk„çvV[ij¼W–‚YÀäĦ’‘`XlžR`žôLUVžfK–¢†{NZdĒª’YĸÌÚJRr¸SA|ƴgŴĴÆbvªØX~†źBŽ|¦ÕœEž¤Ð`\\|Kˆ˜UnnI]¤ÀÂĊnŎ™R®Ő¿¶\\ÀøíDm¦ÎbŨab‰œaĘ\\ľã‚¸a˜tÎSƐ´©v\\ÖÚÌǴ¤Â‡¨JKr€Z_Z€fjþhPkx€`Y”’RIŒjJcVf~sCN¤ ˆE‚œhæm‰–sHy¨SðÑÌ\\\\ŸĐRÊwS¥fqŒßýáЍÙÉÖ[^¯ǤŲ„ê´\\¦¬ĆPM¯£Ÿˆ»uïpùzEx€žanµyoluqe¦W^£ÊL}ñrkqWňûP™‰UP¡ôJŠoo·ŒU}£Œ„[·¨@XŒĸŸ“‹‹DXm­Ûݏº‡›GU‹CÁª½{íĂ^cj‡k“¶Ã[q¤“LÉö³cux«|Zdƒ²BWÇ®Yß½ve±ÃC•ý£W{Ú^’q^sÑ·¨‹ËMƒr“¹·C¥‡GD›rí@wÕKţ݋˜Ÿ«V·i}xËÍ÷‘i©ĝ‡ɝǡ]ƒˆ{c™±OW‹³Ya±Ÿ‰_穂Hžĕoƫ€Ňqƒr³‰Lys[„ñ³¯OS–ďOMisZ†±ÅFC¥Pq{‚Ã[Pg}\\—¿ghćO…•k^ĩÁXaĕËĥM­oEqqZûěʼn³F‘¦oĵ—hŸÕP{¯~TÍlª‰N‰ßY“Ð{Ps{ÃVU™™eĎwk±ʼnVÓ½ŽJãÇÇ»Jm°dhcÀff‘dF~ˆ€ĀeĖ€d`sx² šƒ®EĦ¦–šdQ‹Âd^~ăÔHˆ¦\\›LKpĄVez¤NP ǹӗR™ÆąJSh­a[¦´Âghwm€BÐ¨źhI|žVVŽ—Ž|p] Â¼èNä¶ÜBÖ¼“L`‚¼bØæŒKV”ŸpoœúNZÞÒKxpw|ÊEMnzEQšŽIZ”ŽZ‡NBˆčÚFÜçmĩ‚WĪñt‘ÞĵÇñZ«uD‚±|ƏlǗw·±PmÍa‰–da‡ 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ĆkNnuNUŒ–wœNx¶c¸‹|\\¢…ŒGªóĄ~RãÖÎĢù‚đŴÕhQŽxtcæëSɽʼníëlj£ƍG£nj°KƘµDsØÑpyƸ®¿bXp‚]vbÍZuĂ{nˆ^IüœÀSք”¦EŒvRÎûh@℈[‚Əȉô~FNr¯ôçR±ƒ­HÑl•’Ģ–^¤¢‚OðŸŽætxsŒ]ÞÁTĠs¶¿âƊGW¾ìA¦·TѬ†è¥€ÏÐJ¨¼ÒÖ¼ƒƦɄxÊ~S–tD@ŠĂ¼Ŵ¡jlºWžvЉˆzƦZЎ²CH— „Axiukd‹ŒGgetqmcžÛ£Ozy¥cE}|…¾cZ…k‚‰¿uŐã[oxGikfeäT@…šSUwpiÚFM©’£è^ڟ‚`@v¶eň†f h˜eP¶žt“äOlÔUgƒÞzŸU`lœ}ÔÆUvØ_Ō¬Öi^ĉi§²ÃŠB~¡Ĉ™ÚEgc|DC_Ȧm²rBx¼MÔ¦ŮdĨÃâYx‘ƘDVÇĺĿg¿cwÅ\\¹˜¥Yĭlœ¤žOv†šLjM_a W`zļMž·\\swqÝSA‡š—q‰Śij¯Š‘°kŠRē°wx^Đkǂғ„œž“œŽ„‹\\]˜nrĂ}²ĊŲÒøãh·M{yMzysěnĒġV·°“G³¼XÀ““™¤¹i´o¤ŃšŸÈ`̃DzÄUĞd\\i֚ŒˆmÈBĤÜɲDEh LG¾ƀľ{WaŒYÍȏĢĘÔRîĐj‹}Ǟ“ccj‡oUb½š{“h§Ǿ{K‹ƖµÎ÷žGĄØŜçưÌs«l›•yiē«‹`姝H¥Ae^§„GK}iã\\c]v©ģZ“mÃ|“[M}ģTɟĵ‘Â`À–çm‰‘FK¥ÚíÁbXš³ÌQґHof{‰]e€pt·GŋĜYünĎųVY^’˜ydõkÅZW„«WUa~U·Sb•wGçǑ‚“iW^q‹F‚“›uNĝ—·Ew„‹UtW·Ýďæ©PuqEzwAV•—XR‰ãQ`­©GŠY…Yhc•UGorBd}ģɇb¡·µMicF«—YƅŒ»…é\\ƒɹ~ǙG³mØ©BšuT§Ĥ½¢Ã_ý‘L¡‘ûŸsT\\rke™\\PnwAK‚y}’ywdS™efµ]UhĿD@mÿvašÙNSkCun…cÿ`l‚‰W‹„ėVâ¦÷~^fÏ~œvwHCŽį„`xqT­­ƒlW«ï¸skm‹‹ßEG“qd¯•‹R…©Ýޝ¯S†\\cZ¹iűƏCuƍÓX‡oR}“M^o•£…R}oªU­F…uuXHlEŕ‡€Ï©¤ßgXˆþ¤D–²ÄufàÀ­XXȱAc„{Yw¬dvõ´KÊ£”\\rµÄl”iˆdā]|DÂVŒœH¹ˆÞ®ÜWnŒC”Œķ 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¾pViˆdd”~ÈiŒíďÓQġėǐZ΋ŽXb½|ſÃH½ŸKFgɱCģÛÇA‡n™‹jÕc[VĝDZÃ˄Ç_™ £ń³pŽj£º”š¿”»WH´¯”U¸đĢmžtĜyzzNN|g¸÷äűѱĉā~mq^—Œ[ƒ”››”ƒǁÑďlw]¯xQĔ‰¯l‰’€°řĴrŠ™˜BˆÞTxr[tޏĻN_yŸX`biN™Ku…P›£k‚ZĮ—¦[ºxÆÀdhŽĹŀUÈƗCw’áZħÄŭcÓ¥»NAw±qȥnD`{ChdÙFćš}¢‰A±Äj¨]ĊÕjŋ«×`VuÓś~_kŷVÝyh„“VkÄãPs”Oµ—fŸge‚Ň…µf@u_Ù ÙcŸªNªÙEojVx™T@†ãSefjlwH\\pŏäÀvŠŽlY†½d{†F~¦dyz¤PÜndsrhf‹HcŒvlwjFœ£G˜±DύƥY‡yϊu¹XikĿ¦ÏqƗǀOŜ¨LI|FRĂn sª|Cš˜zxAè¥bœfudTrFWÁ¹Am|˜ĔĕsķÆF‡´Nš‰}ć…UŠÕ@Áijſmužç’uð^ÊýowŒFzØÎĕNőžǏȎôªÌŒDŽàĀÄ˄ĞŀƒʀĀƘŸˮȬƬĊ°ƒUŸzou‡xe]}Ž…AyȑW¯ÌmK‡“Q]‹Īºif¸ÄX|sZt|½ÚUΠlkš^p{f¤lˆºlÆW –€A²˜PVܜPH”Êâ]ÎĈÌÜk´\\@qàsĔÄQºpRij¼èi†`¶—„bXƒrBgxfv»ŽuUiˆŒ^v~”J¬mVp´£Œ´VWrnP½ì¢BX‚¬h™ŠðX¹^TjVœŠriªj™tŊÄm€tPGx¸bgRšŽsT`ZozÆO]’ÒFô҆Oƒ‡ŊŒvŞ”p’cGŒêŠsx´DR–Œ{A†„EOr°Œ•žx|íœbˆ³Wm~DVjºéNN†Ëܲɶ­GƒxŷCStŸ}]ûō•SmtuÇÃĕN•™āg»šíT«u}ç½BĵÞʣ¥ëÊ¡Mێ³ãȅ¡ƋaǩÈÉQ‰†G¢·lG|›„tvgrrf«†ptęŘnŠÅĢr„I²¯LiØsPf˜_vĠd„xM prʹšL¤‹¤‡eˌƒÀđK“žïÙVY§]I‡óáĥ]ķ†Kˆ¥Œj|pŇ\\kzţ¦šnņäÔVĂîά|vW’®l¤èØr‚˜•xm¶ă~lÄƯĄ̈́öȄEÔ¤ØQĄ–Ą»ƢjȦOǺ¨ìSŖÆƬy”Qœv`–cwƒZSÌ®ü±DŽ]ŀç¬B¬©ńzƺŷɄeeOĨS’Œfm Ċ‚ƀ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²ŕƀB‚Q£Ď}L¹Îk@©ĈuǰųǨ”Ú§ƈnTËÇéƟÊcfčŤ^Xm‡—HĊĕË«W·ċëx³ǔķÐċJā‚wİ_ĸ˜Ȁ^ôWr­°oú¬Ħ…ŨK~”ȰCĐ´Ƕ£’fNÎèâw¢XnŮeÂÆĶŽ¾¾xäLĴĘlļO¤ÒĨA¢Êɚ¨®‚ØCÔ ŬGƠ”ƦYĜ‡ĘÜƬDJ—g_ͥœ@čŅĻA“¶¯@wÎqC½Ĉ»NŸăëK™ďÍQ“Ùƫ[«Ãí•gßÔÇOÝáW‘ñuZ“¯ĥ€Ÿŕā¡ÑķJu¤E Ÿå¯°WKɱ_d_}}vyŸõu¬ï¹ÓU±½@gÏ¿rýD‰†g…Cd‰µ—°MFYxw¿CG£‹Rƛ½Õ{]L§{qqąš¿BÇƻğëšܭNJË|c²}Fµ}›ÙRsÓpg±ŠQNqǫŋRwŕnéÑÉKŸ†«SeYR…ŋ‹@{¤SJ}šD Ûǖ֍Ÿ]gr¡µŷjqWÛham³~S«“„›Ü[","@@ƨƒĶTLÇyqpÇÛqe{~oyen}s‰`q‡iXG”ù]Ë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ÖŒb‚˜e¦¦€{¸ZâćNpŒ©žHp|`ˆmjhŠSEb\\afv`sz^lkŽlj‹Ätg‹¤D˜­¾Xš¿À’|ДiZ„ȀåB·î}GL¢õcßjaŸyBFµÏC^ĭ•cÙt¿sğH]j{s©HM¢ƒQnDÀ©DaÜތ·jgàiDbPufjDk`dPOîƒhw¡ĥ‡¥šG˜ŸP²ĐobºrY†„î¶aHŢ´ ]´‚rılw³r_{£DB_Ûdåuk|ˆŨ¯F Cºyr{XFy™e³Þċ‡¿Â™kĭB¿„MvÛpm`rÚã”@ƹhågËÖƿxnlč¶Åì½Ot¾dJlŠVJʜǀœŞqvnOŠ^ŸJ”Z‘ż·Q}ê͎ÅmµÒ]Žƍ¦Dq}¬R^èĂ´ŀĻĊIԒtžIJyQŐĠMNtœR®òLh‰›Ěs©»œ}OӌGZz¶A\\jĨFˆäOĤ˜HYš†JvÞHNiÜaϚɖnFQlšNM¤ˆB´ĄNöɂtp–ŬdZÅgl•muÇUšŽ“Ş‡Úb¤uŃJŴu»¹Ą•lȖħŴw̌ŵ²ǹǠ͛hĭłƕrçü±Y™rř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ù¹£¦ÓCt‹OPrƒE^ÒoŠg™ĉIµžÛÅʹK…¤½phMˆú`m”R¸¦Pƚg†ÉLRŠs`£¯ãhD„¨|³¤‰C"],"encodeOffsets":[[121451,32518]]},"properties":{"cp":[118.767413,32.041544],"name":"江苏","childNum":1}},{"id":"330000","geometry":{"type":"MultiPolygon","coordinates":[["@@jX^n…","@@sfˆdM‰","@@qP\\xz[_i","@@o\\V’zRZ}mECy","@@‘Rƒ¢‚FX}°[m]","@@Cbœ\\•}","@@e|v\\laus","@@v~s{","@@QxÂF©}","@@¹nŒvÞs©m","@@rQgYIh","@@bi«Z„X","@@p[}ILd","@@À¿|","@@¹dnb’…","@@rS}[Kl","@@g~h}","@@FlCk","@@ůTG°ĄLHm°UF‰","@@OdRe","@@v[u\\","@@FjâL~wyoo~›sµLŒZ","@@¬e¹aH‚","@@\\nÔ¡q]L³ë\\ÿ®ŒQ̆","@@ÊA­©]ª","@@KxŒv{­","@@@hlIk_","@@pWc‡rxp","@@Md|_iA","@@¢…X£½z\\ðpN","@@hlÜ[LykAvyfw^Ež ","@@fp¤MusH","@@®_ma~•LÁ¬’`","@@†@°¡mۛGĕ¨§Ianá[ýƤjfæ‡ÐNž—äGp—","@@iM„t\\","@@Zc[b","@@™X®±GrưZæĉm","@@Z~dOSo|A¿qZv","@@@`”EN£p","@@|–s—","@@@nDi","@@n…a£¾u‰YL¯‰Qª…mĉÅdMˆ•gÇjcº«•ęœ¬­K­´ƒB«Âącoċ\\xK`cįŧ«®á’[~ıxu·Å”KsËɏc¢Ù\\ĭƛëbf¹­ģSƒĜkáƉÔ­ĈZB{ŠaM‘µ‰fzʼnfÓÔŹŁƋǝÊĉ{ğč±g³ne{ç­ií´S¬‚\\ßðK¦w\\™iqªĭiAu‡A­µ”_W¥ƣO\\lċĢttC¨£t`ˆ™PZäuXßBs‡Ļyek€OđġĵHuXBšµ]׌‡­­\\›°®¬F¢¾pµ¼kŘó¬Wät’¸|@ž•L¨¸µr“ºù³Ù~§WI‹ŸZWŽ®’±Ð¨ÒÉx€`‰²pĜ•rOògtÁZ{üÙ[|˜ûŒK‚wsPlU[}¦Rvn`hsª^–nQ´ĘRWb”‚_ rtČFI֊kŠŠĦPJ¶ÖÀÖJĈĄTĚòžC ²@Pú…Øzœ©PœCÈÚœĒ±„hŖ‡l¬â~nm¨f©–iļ«m‡nt–qŒÒTÜÄj“ŠLŽ®E̜Fª²iÊxبžIÈhhst’ˆ’[Ôx†}dtüGæţŔïĬaĸpMËВj碷ðĄÆMzˆjWKĎ¢Q¶˜À_꒖_@ı€i«pZ€gf€¤Nrq]§ĂN®«H±‡yƳí¾×ŊďŀĐÏŴǝĂíÀBŖÕªˆŠÁŐTFqĉ¯³ËCĕģi¨hÜ·ƒñt»¯Ï","@@ºwšZRkĕ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ŒÃsiŒkkly]_teu[bFa‰Tig‡n{]Gqªo‹ĈMYá|·¥f¥—őaSÕė™NµñĞ«ImŒ_m¿Âa]uĜp …Z_§{Cƒäg¤°r[_Yj‰ÆOdý“[ŽI[á·¥“Q_n‡ùgL¾mz›ˆDÜÆ¶ĊJhšp“c¹˜O]iŠ]œ¥ jtsggDÑ¡“w×jÉ©±›EFˍ­‰Ki”ÛÃÕYv…s•ˆm¬njĻª•§emná}k«ŕˆƒgđ²Ù›DǤ›í¡ªOy›†×Où±@DŸñSęćăÕIÕ¿IµĥO‰‰‰lJÕÍR›Í|JìĻÒåyķrĕq§ÄĩsWÆßŽF¶žX®¿‰mŒ™w…RIޓfßoG‘³¾©uyH‘į{Ɓħ¯AFnuP…ÍÔzšŒV—dàôº^Ðæd´€‡oG¤{S‰¬ćxã}›ŧ×Kǥĩ«žÕOEзÖdÖsƘѨ[’Û^Xr¢¼˜§xvěƵ`K”§ tÒ´Cvlo¸fzŨð¾NY´ı~ÉĔē…ßúLÃϖ_ÈÏ|]ÂÏHl’g`bšežž€n¾¢pU‚h~ƴ˶_‚r sĄ~cž”ƈ]|r c~`¼{À{ȒiJjz`îÀT¥Û³…]’u}›f…ïQl{skl“oNdŸjŸäËzDvčoQŠďHI¦rb“rHĖ~BmlNž“Ra„ĥTX\\{fÁKÁ®T‚œL‘ŠĄMt›ÊgĀD–ŠĄXœƔvDcÎJbt[¤€D@®hh~kt°ǾzÖ@¾ªdb„YhüóV´ŮŒ¨Üc”±r@J|àuYÇԋG·ĚąĐlŪÚpSJ¨ĸˆLvÞcPæķŨŽ®mАˆál‹sgd×mQ¨ųƩޖ¤IΖs’°ŒKZpĄ|XwWdĎµmkǀwÌÕæhºgBĝâqÙĊz›ÖgņtÀÁÊÆá’hEz|WzqD¹€Ÿ°E‡ŧl{ævÜcA`¤C`|´qžxIJkq^³³ŸGšµbƒíZ…¹qpa±ď OH—¦™Ħˆx¢„gPícOl_iCveaOjCh߸i݋bÛªCC¿€m„RV§¢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å","@@edœŒH…se","@@@vˆPGsyQ","@@‰sBz‚ddW[O","@@SލQy","@@NŽVucW","@@qptB@q","@@‰’¸[iu","@@Q\\pD[_","@@jSwUappI","@@eXª~•","@@AjvFoo","@@fT–›_Çí\\Ÿ™—v|ba¦jZÆy|®","@@IjLg","@@wJI€ˆxš«¼AoNe{M¥Œ","@@K‰±¡Óˆ”Č~N¾™","@@k¡¹Eh~c®uDq‰Zì¡I•~Māe£bN¨gZý¡a±Öcp©PhžI”Ÿ¢Qq…ÇGj‹|¥U™ g[Ky¬ŏ–v@OpˆtÉEŸF„\\@ åA¬ˆV{Xģ‰ĐBy…cpě…¼³Ăp·¤ƒ¥o“hqqÚ¡ŅLsƒ^ᗞ§qlŸÀhH¨MCe»åÇGD¥zPO£čÙkJA¼ß–ėu›ĕeûҍiÁŧS[¡œUŠûŗ½ùěcݧSùĩąSWó«íęACµ›eR—åǃRCÒÇZÍ¢‹ź±^dlsŒtjD¸•‚ZpužÔâÒH¾oLUêÃÔjjēò´ĄW‚ƛ…^Ñ¥‹ĦŸ@Çò–ŠmŒƒOw¡õyJ†yD}¢ďÑÈġfŠZd–a©º²z£šN–ƒjD°Ötj¶¬ZSÎ~¾c°¶Ðm˜x‚O¸¢Pl´žSL|¥žA†ȪĖM’ņIJg®áIJČĒü` ŽQF‡¬h|ÓJ@zµ |ê³È ¸UÖŬŬÀCtrĸr‚]€˜ðŽM¤ĶIJHtÏ A’†žĬkvsq‡^aÎbvŒd–™fÊòSD€´Z^’xPsÞrv‹ƞŀ˜jJd×ŘÉ ®A–ΦĤd€xĆqAŒ†ZR”ÀMźŒnĊ»ŒİÐZ— YX–æJŠyĊ²ˆ·¶q§·–K@·{s‘Xãô«lŗ¶»o½E¡­«¢±¨Yˆ®Ø‹¶^A™vWĶ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£Tc— ĹGµ¶H™m@_©—kŒ‰¾xĨ‡ôȉðX«½đCIbćqK³Á‹Äš¬OAwã»aLʼn‡ËĥW[“ÂGI—ÂNxij¤D¢ŽîĎÎB§°_JœGsƒ¥E@…¤uć…P‘å†cuMuw¢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£ˆp€c³Ïå¹]ĉđxe{ÎӐ†vOEm°BƂĨİ|G’vz½ª´€H’àp”eJ݆Qšxn‹ÀŠW­žEµàXÅĪt¨ÃĖrÄwÀFÎ|Ă¡”‡WÕ¸cf¥—‘XaęST±m[“r«_gŽmQu~¥V\\OkxtL E¢‹ƒ‘Ú^~ýØkbē–qo슱_Êw§Ñ²ÏƟ뼋mĉŹ‹¿NQ“…YB‹ąrwģcÍ¥B•Ÿ­ŗÊcØiI—žƝĿuŒqtāwO]‘³YCñTeɕš‹caub͈]trlu€ī…B‘ПGsĵıN£ï—^ķqsq¿DūūV՟·´Ç{éĈý‰ÿ›OEˆR_ŸđûIċâJh­ŅıN‘ȩĕB…¦K{Tk³¡OP·wn—µÏd¯}½TÍ«YiµÕsC¯„iM•¤™­•¦¯P|ÿUHv“he¥oFTu‰õ\\ŽOSs‹MòđƇiaºćXŸĊĵà·çhƃ÷ǜ{‘ígu^›đg’m[ÙxiIN‘¶Õ»lđÕwZSƉv©_ÈëJbVk„ĔVÀ¤P¾ºÈMÖxlò~ªÚàGĂ¢B„±’ÌŒK˜y’ñ`w²¹€·Ÿ…`g›ŸsÙfI›ěxŕeykpŽŒudjˆuTfb·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êv†HĢÛ@[ƅQoxHŒ—W[ŰîÀt¦DŽ~NĠ¢l–•ĄtZoœCƞÔºCxrpČN˜pj¢{f_Y`_ƒeq’’®Aot`@o‚DXfkp¨|Š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","@@T‚ŒG—w","@@K¬˜•‰U","@@Wd`c","@@PtMs","@@•LnXlc","@@ppVƒu]Qn","@@cdzAU_","@@udRhnCE…","@@ˆoIƒpP„","@@M{Ŀčwbxƨî’Kš–ÎMĮ]†—ZFˆ½Y]â£ph’™š¶¨râøÀ†ÎǨ¤^ºÄ”Gzˆ~grĚĜlĞÆ„LĆdž¢Îo¦–cv“Kb€gr°Wh”mZp ˆL]LºcU‰Æ­n”żĤÌǜbAnrOAœ´žȊcÀbƦUØrĆUÜøœĬƞ†ŶǬĴóò_A̈«ªdÎɜnb²ĦhņBĖ›žįĦåXćì@L¯´ywƕCéõė ƿ¸‘lµ‚Zæyj|BíÂKN„NnoƈfÈMZwšnŐNàúĂsT„JUš›‚L„îVj„ǎ¾Ē؍‚Dz²XPn±ŴPè¸ŔLƔÜƺ_T‘üÃĤBBċȉöA´fa„˜M¨{«M`‡¶d¡ô‰Ö°šmȰBÔjjŒ´PM|”c^d¤u•ƒ¤Û´Œä«ƢfPk¶Môlˆ]Lb„}su^ke{lC‘…M•rDŠÇ­]NÑFsmoõľH‰yGă{{çrnÓE‰‹ƕZGª¹Fj¢ÿ©}ÌCǷ돡ąuhÛ¡^Kx•C`C\\bÅxì²ĝÝ¿_N‰īCȽĿåB¥¢·IŖÕy\\‡¹kx‡Ã£ČáKµË¤ÁçFQ¡„KtŵƋ]CgÏAùSed‡cÚź—ŠuYfƒyMmhUWpSyGwMPqŀ—›Á¼zK›¶†G•­Y§Ëƒ@–´śÇµƕBmœ@Io‚g——Z¯u‹TMx}C‘‰VK‚ï{éƵP—™_K«™pÛÙqċtkkù]gŽ‹Tğwo•ɁsMõ³ă‡AN£™MRkmEʕč™ÛbMjÝGu…IZ™—GPģ‡ãħE[iµBEuŸDPԛ~ª¼ętŠœ]ŒûG§€¡QMsğNPŏįzs£Ug{đJĿļā³]ç«Qr~¥CƎÑ^n¶ÆéÎR~ݏY’I“] P‰umŝrƿ›‰›Iā‹[x‰edz‹L‘¯v¯s¬ÁY…~}…ťuٌg›ƋpÝĄ_ņī¶ÏSR´ÁP~ž¿Cyžċßdwk´Ss•X|t‰`Ä Èð€AªìÎT°¦Dd–€a^lĎDĶÚY°Ž`ĪŴǒˆ”àŠv\\ebŒZH„Ŗ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¼`kš„h•ÍL™ùµP³swIÓzeŠĠð†´E®žÚPt†ºIŊ–ʺ˜L«šŕQGƒ‹Yfa[şu“ßǑ‡ĩų_Z¯ĵÙčC]kbc•¥CS¯ëÍB©ïŽÇߊ_{s–WTtž³xlàcȂzÀD}ÂOQ³ÐTĬµ‚ƑпŸghœł‹Ŧv~††}ÂZž«¤lPǕ£ªÝŴÅR§ØnhcŒtâk‡nύ­ľŹUÓÝdKuķ‡I§oTũÙďkęĆH¸ÓŒ\\ăŒ¿PcnS{wBIvɘĽ[GqµuŸŇôYgûƒZcaŽ©@½Õǽys¯}lgg@­C\\£as€IdÍuCQñ[L±ęk·‹ţb¨©kK—’»›KC²‘òGKmĨS`ƒ˜UQ™nk}AGē”sqaJ¥ĐGR‰ĎpCuÌy ã iMc”plk|tRk†ðœev~^‘´†¦ÜŽSí¿_iyjI|ȑ|¿_»d}qŸ^{“Ƈdă}Ÿtqµ`ŷ飩V¡om½ZÙϋÁRD|JOÈpÀ—Rs’•I{ùÓjuµ{t}uËR‘iŸvGŠçJFjµŠåkWꖴMƒHewixGw½Yŷpµú³XU›½ġy™łå‰kÚwZXˆ·l„¢Á¢K”zO„Λ΀jc¼htoDHr…|­J“½}JZ_¯iPq{tę½ĕ¦Zpĵø«kQ…Ťƒ]MÛfaQpě±ǽ¾]u­Fu‹÷nƒ™čįADp}AjmcEǒaª³o³ÆÍSƇĈÙDIzçƒñİŸ^ˆKNœ™i—Þñ€[œƒaA²zz‰Ì÷Dœ|[šíijgf‚ÕÞd®|`ƒĆ~„oĠƑô³Ŋ‘D×°¯CsˆøÂ«ì‰UMhTº¨¸ǝêWšÔ„DruÂÇZ£Ćš”PZ„žW”~؋Øv¬gèÂÒw¦X¤Ā´oŬ¬Ž²Ês~€€]®tªašpŎJ¨Öº„_ŠŔ–f”Ő\\Ѝ\\Ĝu–”~m²Ƹ›¸fW‰ĦrƔ}Î^gjdfÔ¡J}\\n C˜¦þWxªJRÔŠu¬ĨĨmF†dM{\\d\\ŠYÊ¢ú@@¦ª²SŠÜsC–}fNècbpRmlØ^g„d¢aÒ¢CZˆZxvÆ¶N¿’¢T@€uCœ¬^ĊðÄn|žlIlŽ—Xhun€[","@@hzUq"]],"encodeOffsets":[[[116744,37216],[116480,33048]]]},"properties":{"cp":[113.665412,34.757975],"name":"河南","childNum":2}},{"id":"420000","geometry":{"type":"MultiPolygon","coordinates":[["@@ASd","@@ls{d","@@¾«}{ra®pîÃ\\™›{øCŠËyyB±„b\\›ò˜Ý˜jK›‡L ]ĎĽÌ’JyÚCƈćÎT´Å´pb©È‘dFin~BCo°BĎĚømvŒ®E^vǾ½Ĝ²Ro‚bÜeNŽ„^ĺ£R†¬lĶ÷YoĖ¥Ě¾|sOr°jY`~I”¾®I†{GqpCgyl{‡£œÍƒÍyPL“¡ƒ¡¸kW‡xYlÙæŠšŁĢzœ¾žV´W¶ùŸo¾ZHxjwfx„GNÁ•³Xéæl¶‰EièIH‰ u’jÌQ~v|sv¶Ôi|ú¢Fh˜Qsğ¦ƒSiŠBg™ÐE^ÁÐ{–čnOÂȞUÎóĔ†ÊēIJ}Z³½Mŧïeyp·uk³DsѨŸL“¶_œÅuèw»—€¡WqÜ]\\‘Ò§tƗcÕ¸ÕFÏǝĉăxŻČƟO‡ƒKÉġÿ×wg”÷IÅzCg†]m«ªGeçÃTC’«[‰t§{loWeC@ps_Bp‘­r‘„f_``Z|ei¡—oċMqow€¹DƝӛDYpûs•–‹Ykıǃ}s¥ç³[§ŸcYЧHK„«Qy‰]¢“wwö€¸ïx¼ņ¾Xv®ÇÀµRĠЋžHMž±cÏd„ƒǍũȅȷ±DSyúĝ£ŤĀàtÖÿï[îb\\}pĭÉI±Ñy…¿³x¯N‰o‰|¹H™ÏÛm‹júË~Tš•u˜ęjCöAwě¬R’đl¯ Ñb­‰ŇT†Ŀ_[Œ‘IčĄʿnM¦ğ\\É[T·™k¹œ©oĕ@A¾w•ya¥Y\\¥Âaz¯ãÁ¡k¥ne£Ûw†E©Êō¶˓uoj_Uƒ¡cF¹­[Wv“P©w—huÕyBF“ƒ`R‹qJUw\\i¡{jŸŸEPïÿ½fć…QÑÀQ{ž‚°‡fLԁ~wXg—ītêݾ–ĺ‘Hdˆ³fJd]‹HJ²…E€ƒoU¥†HhwQsƐ»Xmg±çve›]Dm͂PˆoCc¾‹_h”–høYrŊU¶eD°Č_N~øĹĚ·`z’]Äþp¼…äÌQŒv\\rCŒé¾TnkžŐڀÜa‡“¼ÝƆ̶Ûo…d…ĔňТJq’Pb ¾|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ʧĘD†vČ_Àæ~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":[["@@—n„FZw","@@かÆá‰½ÔXr—†CO™“…ËR‘ïÿĩ­TooQyšÓ[‹ŅBE¬–ÎÓXa„į§Ã¸G °ITxp‰úxÚij¥Ïš–̾ŠedžÄ©ĸG…œàGh‚€M¤–Â_U}Ċ}¢pczfŠþg¤€’ÇôAV‘","@@ȴÚŠĖÁĐiO“Ĝ«BxDõĚiv—ž–S™Ì}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靧Ŏѝ©êL•M³}_‘‹E‘Çģc®ęisÁPDmÅ{‰b[Rşs·€kPŸŽƥƒóRo”O‹ŸVŸ~]{g\\“êYƪ¦kÝbiċƵŠGZ»Ěõ…ó·³vŝž£ø@pyö_‹ëŽIkѵ‡bcѧy…×dY؎ªiþžˆUjŸŅ³C}ÁN‡»hĻħƏâƓK—ƒA·³CQ±µ§¿AUŠƑ¹AŠtćOw™D]ŒJUÖgk¯b£‘ylƒ›ZƒFËѱ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“È£ýhe‰dy¡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Œ„_E”zAN¦zLU`œcªx”OTu 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":[["@@QdˆAsa","@@ƒlxDRm","@@sbhNLo","@@Ă ý","@@WltOY[","@@Krœ]‰S","@@e„~AS}","@@I|„Mym","@@ƒÛ³LSŒž²Q","@@nvºB–ë¥cÕº","@@zdšÛ›JmŠ","@@†°³","@@a yAª¸ËJIx،@€ĀHÉÕZ™o•fo…o","@@šs‰ŗÃÔėAƁ›ZšÄ ~°ČP‚‹ºb","@@‹¶Ý’Ì‚vmĞh¹Ĺ","@@HœŠdSjĒ¢D}war…“u«ZqadY{K","@@elŒ\\LqqO","@@~rMmX","@@f„^E","@@øPªoj÷ÍÝħXČx”°Q¨ıXJp","@@gÇƳˆˆ–m’Žxa†tfu","@@E–ÆC½‘","@@¸B_¶ekWvSi‡vc•}p}Ăº¾NĎyj¦Èm thœ†_®žÄ}ˆ»âUzL™Ë‹²‘Aƒā¡ßH©Ùñ}wkNÕ¹ÇO½¿£ēUlƒaUìIžÇª`ŠuTÅxYĒÖ¼k֞’µ‚MžjJÚwn\\h‘œĒv]îh|’È›Ƅøègž¸Ķß ĉĈWb¹ƀdéƌNTtP[ŠöSvrCZžžaGuœbo´ŖÒÇА~¡zCI…özx¢„Pn‹•‰Èñ @ŒĥÒ¦†]ƜŽX³ăĔñiiÄÓVépKG½Ä‘ÓávYo–C·sit‹iaÀy„ŧΡÈYDÑům}‰ý|m[węõĉZÅxUO}÷N¹³ĉo_qtă“qwµŁYلǝŕ¹tïÛUïmRCº…ˆĭ|µ›ÕÊK™½R‘ē ó]‘–GªęAx–ŸNqSF•|ā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¯uc“d·w_bŝcīímGOŽ€GBȅ‰ŹãĻFŷŽŕ@Óoo¿ē‹±ß}Ž}ÓF÷tIJWÈCőâUâǙI›ğʼn©I›ijEׅÁ”³AĥDĈ±ÌŒÜӔĨ£L]ĈÙƺZǾĆĖMĸĤfŒÎĵl•ŨnȈ‘ĐtF”Š–FĤ–‚êk¶œ^k°f¶gŠŽœ}®Fa˜f`vXŲxl˜„¦–ÔÁ²¬ÐŸ¦pqÊ̲ˆi€XŸØRDÎ}†Ä@ZĠ’s„x®AR~®ETtĄZ†–ƈfŠŠHâÒÐA†µ\\S¸„^wĖkRzŠalŽŜ|E¨ÈNĀňZTŒ’pBh£\\ŒĎƀuXĖtKL–¶G|Ž»ĺEļĞ~ÜĢÛĊrˆO˜Ùîvd]nˆ¬VœÊĜ°R֟pM††–€ƀ¬HbwžEÀˆ˜©Œž\\…¤]ŸI®¥D³|ˎ]CúAЦ…æ’´¥¸Lv¼€•¢ĽBaô–F~—š®²GÌҐEY„„œzk¤’°ahlV՞I^‹šCxĈPŽsB‰ƒºV‰ÀB¶¨R²´D","@@OŽR"]],"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…čP­kini«‹qǀcz͔Y®¬Ů»qR×ō©DՄ‘§ƙǃŵTÉĩ±ŸıdÑnYY›IJvNĆÌØÜ Öp–}e³¦m‹©iÓ|¹Ÿħņ›|ª¦QF¢Â¬ʖovg¿em‡^ucäāmÇÖåB¡Õçĝ}FϼĹ{µHK•sLSđƃr‹č¤[Ag‘oS‹ŇYMÿ§Ç{Fśbky‰lQxĕƒ]T·¶[B…ÑÏGáşşƇe€…•ăYSs­FQ}­Bƒw‘tYğÃ@~…C̀Q ×W‡j˱rÉ¥oÏ ±«ÓÂ¥•ƒ€k—ŽwWűŽue_b—­E›~‰µh¯ecl¯›Ïr¯‡E쉕Jƒğƒ}žw³–Ƈē`ãògK_ÛsUʝ“ćğ¶hŒöŒO¤Ǜn³Žc‘`¡yi–ę–‘[ďĵűMę§]X˜Î_‚훘Û]é’ÛUćİÕBƣ±…dƒy¹T^džûÅÑŦ·‡PĻþÙ`K€¦˜…¢ÍeœĥR¿Œ³£[~Œäu¼dl‰t‚†W¸oRM¢ď\\zœ}Æzdvň–{ÎXF¶°Â_„ÒÂÏL©Ö•TmuŸ¼ãl‰›īkiqéfA„·Êµ\\őDc¥ÝF“y›Ôć˜c€űH_hL܋êĺШc}rn`½„Ì@¸¶ªVLŒŠhŒ‹\\•Ţĺk~ŽĠið°|gŒtTĭĸ^x‘vK˜VGréAé‘bUu›MJ‰VÃO¡…qĂXËS‰ģãlýàŸ_ju‡YÛÒB†œG^˜é֊¶§ŽƒEG”ÅzěƒƯ¤Ek‡N[kdåucé¬dnYpAyČ{`]þ±X’\\’ÞÈk‚¡Ĭj†àh„ÂƄ¢H茠Ŕ⪃LƒĒ^Öm¶ħĊAǦė¸zÚGn£¾›rªŀÜt¬@֛ڈSx~øOŒ˜ŶÐÂæȠ\\„ÈÜObĖw^oބLf¬°bI lTØB̈F£Ć¹gñĤaY“t¿¤VSñœK¸¤nM†¼‚JE±„½¸šŠño‹ÜCƆæĪ^ŠĚQÖ¦^‡ˆˆf´Q†üÜʝz¯šlzUĺš@쇀p¶n]sxtx¶@„~ÒĂJb©gk‚{°‚~c°`ԙ¬rV\\“la¼¤ôá`¯¹LC†ÆbŒxEræO‚v[H­˜„[~|aB£ÖsºdAĐzNÂðsŽÞƔ…Ĥªbƒ–ab`ho¡³F«èVZs„\\\\Œ™ÔRzpp®SŽĪº¨ÖƒºN…ij„d`’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ðĀÒRŒšZdž™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ÝúØãwŒƒIŸþËQǦÃqɞSJ»ĂéʔõÔƁİlƞ¹„§Ĭqt‘ÀƄmÀêErĒtD®ċæcQƒ”E®³^ĭ¥©l}äQto˜ŖÜqƎkµ–„ªÔĻĴ¡@Ċ°B²Èw^^RsºT£ڿœQP‘JvÄz„^Đ¹Æ¯fLà´GC²‘dt˜­ĀRt¼¤ĦOðğfÔðDŨŁĞƘïžPȆ®âbMüÀXZ ¸£@Ś›»»QÉ­™]d“sÖ×_͖_ÌêŮ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°´†ATe€VamdUĐwʄvĮÕ\\ƒu‹Æŗ¨Yp¹àZÂm™Wh{á„}WØǍ•Éüw™ga§ßAYŸrÅÂQĀÕ¬LŐý®X˜øxª½Ű¦¦[€—þ„`ÜUÖ´òrÙŠ°²Äk„ijnDX{Uƒ~ET{ļº¦PZc”jF²Ė@Žp˜g€ˆ¨“B{ƒu¨ŦyhoÚD®¯¢˜ WòàFΤ¨GDäz¦kŮPœġq˚¥À]€Ÿ˜eŽâÚ´ªKxī„Pˆ—Ö|æ[xäJÞĥ‚s’NÖ½ž€I†¬nĨY´®Ð—ƐŠ€mD™ŝuäđđEb…e’e_™v¡}ìęNJē}q”É埁T¯µRs¡M@}ůa†a­¯wvƉåZwž\\Z{åû`Ÿ†[±oi•‘JDŦ]‘‰ĕãïrG •réÏ·~ąSfy×͂·ºſƽĵȁŗūmHQ¡Y¡®ÁÃ×t«ƒ­Tƒ¤J–JJŒyJ•ÈŠ`Ohߦ¡uËhIyCjmÿw…ZG……Ti‹SˆsO‰žB²ŸfNmsPaˆ{M{ŠõE‘^Hj}gYpaeuž¯‘oáwHjÁ½M¡pM“–uå‡mni{fk”\\oƒÎqCw†EZ¼K›ĝŠƒAy{m÷L‡wO×SimRI¯rK™õBS«sFe‡]fµ¢óY_ÆPRcue°Cbo׌bd£ŌIHgtrnyPt¦foaXďx›lBowz‹_{ÊéWiêE„GhܸºuFĈIxf®Ž•Y½ĀǙ]¤EyŸF²ċ’w¸¿@g¢§RGv»–áŸW`ÃĵJwi]t¥wO­½a[׈]`Ãi­üL€¦LabbTÀå’c}Íh™Æhˆ‹®BH€î|Ék­¤S†y£„ia©taį·Ɖ`ō¥Uh“O…ƒĝLk}©Fos‰´›Jm„µlŁu—…ø–nÑJWΪ–YÀïAetTžŅ‚ӍG™Ë«bo‰{ıwodƟ½ƒžOġܑµxàNÖ¾P²§HKv¾–]|•B‡ÆåoZ`¡Ø`ÀmºĠ~ÌЧnDž¿¤]wğ@sƒ‰rğu‰~‘Io”[é±¹ ¿žſđӉ@q‹gˆ¹zƱřaí°KtǤV»Ã[ĩǭƑ^ÇÓ@ỗs›Zϕ‹œÅĭ€Ƌ•ěpwDóÖሯneQˌq·•GCœýS]xŸ·ý‹q³•O՜Œ¶Qzßti{ř‰áÍÇWŝŭñzÇW‹pç¿JŒ™‚Xœĩè½cŒF–ÂLiVjx}\\N†ŇĖ¥Ge–“JA¼ÄHfÈu~¸Æ«dE³ÉMA|b˜Ò…˜ćhG¬CM‚õŠ„ƤąAvƒüV€éŀ‰_V̳ĐwQj´·ZeÈÁ¨X´Æ¡Qu·»Ÿ“˜ÕZ³ġqDo‰y`L¬gdp°şŠp¦ėìÅĮZްIä”h‚‘ˆzŠĵœf²å ›ĚрKp‹IN|‹„Ñ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ÕĢyFVvw–ˆxBèĻĒ©Ĉ“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Ñ£Is‡NgßH†›HªķÃh_¹ƒ¡ĝħń¦uيùŽgS¯JHŸ|sÝÅtÁïyMDč»eÕtA¤{b\\}—ƒG®u\\åPFq‹wÅaD…žK°ºâ_£ùbµ”mÁ‹ÛœĹM[q|hlaªāI}тƒµ@swtwm^oµˆD鼊yV™ky°ÉžûÛR…³‚‡eˆ‡¥]RՋěħ[ƅåÛDpŒ”J„iV™™‰ÂF²I…»mN·£›LbÒYb—WsÀbŽ™pki™TZĄă¶HŒq`……ĥ_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|`ź¦ÂÈdr„cȁbe¸›`I¼čTF´¼Óýȃr¹ÍJ©k_șl³´_pН`oÒh޶pa‚^ÓĔ}D»^Xyœ`d˜[Kv…JPhèhCrĂĚÂ^Êƌ wˆZL­Ġ£šÁbrzOIl’MM”ĪŐžËr×ÎeŦŽtw|Œ¢mKjSǘňĂStÎŦEtqFT†¾†E쬬ôxÌO¢Ÿ KгŀºäY†„”PVgŎ¦Ŋm޼VZwVlŒ„z¤…ž£Tl®ctĽÚó{G­A‡ŒÇgeš~Αd¿æaSba¥KKûj®_ć^\\ؾbP®¦x^sxjĶI_Ä X‚⼕Hu¨Qh¡À@Ëô}ޱžGNìĎlT¸ˆ…`V~R°tbÕĊ`¸úÛtπFDu€[ƒMfqGH·¥yA‰ztMFe|R‚_Gk†ChZeÚ°to˜v`x‹b„ŒDnÐ{E}šZ˜è€x—†NEފREn˜[Pv@{~rĆAB§‚EO¿|UZ~ì„Uf¨J²ĂÝÆ€‚sª–B`„s¶œfvö¦ŠÕ~dÔq¨¸º»uù[[§´sb¤¢zþFœ¢Æ…Àhˆ™ÂˆW\\ıŽËI݊o±ĭŠ£þˆÊs}¡R]ŒěƒD‚g´VG¢‚j±®è†ºÃmpU[Á›‘Œëº°r›ÜbNu¸}Žº¼‡`ni”ºÔXĄ¤¼Ôdaµ€Á_À…†ftQQgœR—‘·Ǔ’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½}ÑRH‘YīĺûsÍn‘iEoã½Ya²ė{c¬ĝg•ĂsA•ØÅwď‚õzFjw}—«Dx¿}UũlŸê™@•HÅ­F‰¨ÇoJ´Ónũuą¡Ã¢pÒŌ“Ø TF²‚xa²ËX€‚cʋlHîAßËŁkŻƑŷÉ©h™W­æß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¯ŪĽn„†cÚbŒw\\zlvWžªâˆ ¦g–mĿBş£¢ƹřbĥkǫßeeZkÙIKueT»sVesb‘aĕ  ¶®dNœĄÄpªyސ¼—„³BE˜®l‡ŽGœŭCœǶwêżĔÂe„pÍÀQƞpC„–¼ŲÈ­AÎô¶R„ä’Q^Øu¬°š_Èôc´¹ò¨P΢hlϦ´Ħ“Æ´sâDŽŲPnÊD^¯°’Upv†}®BP̪–jǬx–Söwlfòªv€qĸ|`H€­viļ€ndĜ­Ćhň•‚em·FyށqóžSᝑ³X_ĞçêtryvL¤§z„¦c¦¥jnŞk˜ˆlD¤øz½ĜàžĂŧMÅ|áƆàÊcðÂF܎‚áŢ¥\\\\º™İøÒÐJĴ‡„îD¦zK²ǏÎEh~’CD­hMn^ÌöÄ©ČZÀžaü„fɭyœpį´ěFűk]Ôě¢qlÅĆÙa¶~Äqššê€ljN¬¼H„ÊšNQ´ê¼VظE††^ŃÒyŒƒM{ŒJLoÒœęæŸe±Ķ›y‰’‡gã“¯JYÆĭĘëo¥Š‰o¯hcK«z_pŠrC´ĢÖY”—¼ v¸¢RŽÅW³Â§fǸYi³xR´ďUˊ`êĿU„û€uĆBƒƣö‰N€DH«Ĉg†——Ñ‚aB{ÊNF´¬c·Åv}eÇÃGB»”If•¦HňĕM…~[iwjUÁKE•Ž‹¾dĪçW›šI‹èÀŒoÈXòyŞŮÈXâÎŚŠj|àsRy‹µÖ›–Pr´þŒ ¸^wþTDŔ–Hr¸‹žRÌmf‡żÕâCôox–ĜƌÆĮŒ›Ð–œY˜tâŦÔ@]ÈǮƒ\\μģUsȯLbîƲŚºyh‡rŒŠ@ĒԝƀŸÀ²º\\êp“’JŠ}ĠvŠqt„Ġ@^xÀ£È†¨mËÏğ}n¹_¿¢×Y_æpˆÅ–A^{½•Lu¨GO±Õ½ßM¶w’ÁĢۂP‚›Ƣ¼pcIJxŠ|ap̬HšÐŒŊSfsðBZ¿©“XÏÒK•k†÷Eû¿‰S…rEFsÕūk”óVǥʼniTL‚¡n{‹uxţÏh™ôŝ¬ğōN“‘NJkyPaq™Âğ¤K®‡YŸxÉƋÁ]āęDqçgOg†ILu—\\_gz—]W¼ž~CÔē]bµogpў_oď`´³Țkl`IªºÎȄqÔþž»E³ĎSJ»œ_f·‚adÇqƒÇc¥Á_Źw{™L^ɱćx“U£µ÷xgĉp»ĆqNē`rĘzaĵĚ¡K½ÊBzyäKXqiWPÏɸ½řÍcÊG|µƕƣG˛÷Ÿk°_^ý|_zċBZocmø¯hhcæ\\lˆMFlư£Ĝ„ÆyH“„F¨‰µêÕ]—›HA…àӄ^it `þßäkŠĤÎT~Wlÿ¨„ÔPzUC–NVv [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͕çWViŽ]ë©Ä÷àyƛh›ÚU°ŒŒa”d„cQƒ~Mx¥™caŸÛcSyF—ցk­ŒuRýq¿Ôµ•QĽ³aG{¿FµëªéĜÿª@¬·–K‰·àariĕĀ«V»Ŷ™Ĵū˜gèLǴŇƶaf‹tŒèBŚ£^Šâ†ǐÝ®–šM¦ÁǞÿ¬LhŸŽJ¾óƾƺcxw‹f]Y…´ƒ¦|œQLn°aœdĊ…œ\\¨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ÀgVjzlhǶf€žOšfdЉªB]pj„•TO–tĊ‚n¤}®¦ƒČ¥d¢¼»ddš”Y¼Žt—¢eȤJ¤}Ǿ¡°§¤AГlc@ĝ”sªćļđAç‡wx•UuzEÖġ~AN¹ÄÅȀݦ¿ģŁéì±H…ãd«g[؉¼ēÀ•cīľġ¬cJ‘µ…ÐʥVȝ¸ßS¹†ý±ğkƁ¼ą^ɛ¤Ûÿ‰b[}¬ōõÃ]ËNm®g@•Bg}ÍF±ǐyL¥íCˆƒIij€Ï÷њį[¹¦[⚍EÛïÁÉdƅß{âNÆāŨߝ¾ě÷yC£‡k­´ÓH@¹†TZ¥¢įƒ·ÌAЧ®—Zc…v½ŸZ­¹|ŕWZqgW“|ieZÅYVӁqdq•bc²R@†c‡¥Rã»Ge†Ÿeƃī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ŘvŽgÌsN@îá¾ó@‰˜ÙwU±ÉT廣TđŸWxq¹Zo‘b‹s[׌¯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•ÚÅTSij‚‹Yo|Ç[ǾµMW¢ĭiÕØ¿@˜šMh…pÕ]j†éò¿OƇĆƇp€êĉâlØw–ěsˆǩ‚ĵ¸c…bU¹ř¨WavquSMzeo_^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~ź¤Pn–MĪÖB£Ÿk™n鄧żćŠ˜ĆK„ǰ¼L¶è‰âz¨u¦¥LDĘz¬ýÎmĘd¾ß”Fz“hg²™Fy¦ĝ¤ċņbΛ@y‚Ąæm°NĮZRÖíŽJ²öLĸÒ¨Y®ƌÐV‰à˜tt_ڀÂyĠzž]Ţh€zĎ{†ĢX”ˆc|šÐqŽšfO¢¤ög‚ÌHNŽ„PKŖœŽ˜Uú´xx[xˆvĐCûŠìÖT¬¸^}Ìsòd´_އKgžLĴ…ÀBon|H@–Êx˜—¦BpŰˆŌ¿fµƌA¾zLjRxжF”œkĄźRzŀˆ~¶[”´Hnª–VƞuĒ­È¨ƎcƽÌm¸ÁÈM¦x͊ëÀxdžB’šú^´W†£–d„kɾĬpœw‚˂ØɦļĬIŚœÊ•n›Ŕa¸™~J°î”lɌxĤÊÈðhÌ®‚g˜T´øŽàCˆŽÀ^ªerrƘdž¢İP|Ė ŸWœªĦ^¶´ÂL„aT±ü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¢xR­—ƒFq§uF—Œ@NŸ¢XLƒŠRMº[ğȣſï|¥J™kc`sʼnǷ’£Y³‹WN«ùM‘ëï³ÛIg÷±mTșڍÒķø©—þ¥ƒy‚ÓŸğęmWµÎumZyOŅƟĥÓ~sÑL¤µaŅY¦ocyZ{‰y c]{ŒTa©ƒ`U_Ěē£ωÊƍKù’K¶ȱÝƷ§{û»ÅÁȹÍéuij|¹cÑd‘ŠìUYƒŽO‘uF–ÕÈYvÁCqӃT•Ǣí§·S¹NgŠV¬ë÷Á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€Ňîŵ€œè[€É@ƉĄEœ‡tƇÏ˜³­ħZ«mJ…›×¾‘MtÝĦ£IwÄå\\Õ{‡˜ƒOwĬ©LÙ³ÙT“ª¿^™¦r̛ĢŭO¥lãyC§HÍ£ßEñŸX¡—­°ÙCgpťz‘ˆb`wI„vA|¥”‡—hoĕ@E±“iYd¥OÿµÇvPŒW|mCƒĴŜǂ҈W¶¸AĜh^Wx{@„¬‚­F¸¡„ķn£P|ŸªĴ@^ĠĈæb–Ôc¶l˜Yi…–^Mi˜cϰÂ[ä€vï¶gv@À“Ĭ·lJ¸sn|¼u~a]’ÆÈtŌºJp’ƒþ£KKf~ЦUbyäIšĺãn‡Ô¿^­žŵMT–hĠܤko¼Ŏìąǜh`[tŒRd²IJ_œXPrɲ‰l‘‚XžiL§àƒ–¹ŽH˜°Ȧqº®QC—bA†„ŌJ¸ĕÚ³ĺ§ `d¨YjžiZvRĺ±öVKkjGȊĐePОZmļKÀ€‚[ŠŽ`ösìh†ïÎoĬdtKÞ{¬èÒÒBŒÔpIJÇĬJŊ¦±J«ˆ[©ārH€µàåVKe§|P²ÇÓ·vUz‰gnN¾yI@oŸHĆۄķhx“e‘n¡QQ’±”ƝJ‹ǖRbzy€¸ËАl›¼EºpĤ¼Œx¼½~Ğ’”à@†ÚüdK^ˆmÌSjˆp²—ȮµšûG™Ħ}Ħšðǚ¶òƄ€jɂz°{ºØkÈęâ¦jª‚Bg‚\\œċ°s¬Ž’]jžú ‚E”Ȍdž¬s„t‡”RˆÆ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‰¦ÅÄÜdw˜Ab×ĠąJˆ¤DüègĺqBqœj°lI¡Ĩ¶šĖIHdš‰ŠjΑBаaZˆ¢KJŽ’O[|A£žDx}Nì•HUnrk„ kp€¼Y kMJn[aG‚áÚÏ[½rc†}aQxOgsPMnUs‡nc‹Z…ž–sKúvA›t„Þġ’£®ĀYKdnFwš¢JE°”Latf`¼h¬we|€Æ‡šbj}GA€·~WŽ”—`†¢MC¤tL©IJ°qdf”O‚“bÞĬ¹ttu`^ZúE`Œ[@„Æsîz®¡’C„ƳƜG²“R‘¢R’m”fŽwĸg܃‚ą G@pzJM½mŠhVy¸uÈÔO±¨{LfæU¶ßGĂq\\ª¬‡²I‚¥IʼnÈīoı‹ÓÑAçÑ|«LÝcspīðÍg…të_õ‰\\ĉñLYnĝg’ŸRǡÁiHLlõUĹ²uQjYi§Z_c¨Ÿ´ĹĖÙ·ŋI…ƒaBD˜­R¹ȥr—¯G•ºß„K¨jWk’ɱŠOq›Wij\\a­‹Q\\sg_ĆǛōëp»£lğۀgS•ŶN®À]ˆÓäm™ĹãJaz¥V}‰Le¤L„ýo‘¹IsŋÅÇ^‘Žbz…³tmEÁ´aйcčecÇN•ĊãÁ\\蝗dNj•]j†—ZµkÓda•ćå]ğij@ ©O{¤ĸm¢ƒE·®ƒ«|@Xwg]A챝‡XǁÑdzªc›wQÚŝñ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ĪğP‘s{ò‡‹‘²Vw¹t³Ŝˁ[ŽÑ}X\\gsFŸ£sPAgěp×ëfYHāďÖqēŭOÏë“dLü•\\iŒ”t^c®šRʺ¶—¢H°mˆ‘rYŸ£BŸ¹čIoľu¶uI]vģSQ{ƒUŻ”Å}QÂ|̋°ƅ¤ĩŪU ęĄžÌZҞ\\v˜²PĔ»ƢNHƒĂyAmƂwVmž`”]ȏb•”H`‰Ì¢²ILvĜ—H®¤Dlt_„¢JJÄämèÔDëþgºƫ™”aʎÌrêYi~ ÎݤNpÀA¾Ĕ¼b…ð÷’Žˆ‡®‚”üs”zMzÖĖQdȨý†v§Tè|ªH’þa¸|šÐ ƒwKĢx¦ivr^ÿ ¸l öæfƟĴ·PJv}n\\h¹¶v†·À|\\ƁĚN´Ĝ€çèÁz]ġ¤²¨QÒŨTIl‡ªťØ}¼˗ƦvÄùØE‹’«Fï˛Iq”ōŒTvāÜŏ‚íÛߜÛV—j³âwGăÂíNOŠˆŠPìyV³ʼnĖýZso§HіiYw[߆\\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Ӝƻėoj‘qYhĹT©oūĶ£]ďxĩ‹ǑMĝ‰q`B´ƃ˺Ч—ç~™²ņj@”¥@đ´ί}ĥtPńǾV¬ufӃÉC‹tÓ̻‰…¹£G³€]ƖƾŎĪŪĘ̖¨ʈĢƂlɘ۪üºňUðǜȢƢż̌ȦǼ‚ĤŊɲĖ­KqĘʼn¼ĔDzņɾªǀÞĈĂD†½ĄĎÌŗĞrôñnŽœN¼â¾ʄľԆ|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ǚ‹\\đ¾JŽwÀďksãA‹fÕ¦L}wa‚o”Z’‹D½†Ml«]eÒÅaɲáo½FõÛ]ĻÒ¡wYR£¢rvÓ®y®LF‹LzĈ„ô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ĺSZg’rpiƼĘԛ¨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\\ZŽjҕ¨GtpþYŊĕ´€zUO뇉P‰îMĄÁxH´á˜iÜUà›îÜՁĂÛSuŎ‹r“œJð̬EŒ‘FÁú×uÃÎkr“Ē{V}İ«O_ÌËĬ©ŽÓŧSRѱ§Ģ£^ÂyèçěM³Ƃę{[¸¿u…ºµ[gt£¸OƤĿéYŸõ·kŸq]juw¥Dĩƍ€õÇPéĽG‘ž©ã‡¤G…uȧþRcÕĕNy“yû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ĻĖH”Aëáa…­OÇðñęNw‡…œľ·L›mI±íĠĩPÉ×®ÿs—’cB³±JKßĊ«`…ađ»·QAmO’‘Vţéÿ¤¹SQt]]Çx€±¯A@ĉij¢Ó祖•ƒl¶ÅÛr—ŕspãRk~¦ª]Į­´“FR„åd­ČsCqđéFn¿Åƃm’Éx{W©ºƝºįkÕƂƑ¸wWūЩÈFž£\\tÈ¥ÄRÈýÌJ ƒlGr^×äùyÞ³fj”c†€¨£ÂZ|ǓMĝšÏ@ëÜőR‹›ĝ‰Œ÷¡{aïȷPu°ËXÙ{©TmĠ}Y³’­ÞIňµç½©C¡į÷¯B»|St»›]vƒųƒs»”}MÓ ÿʪƟǭA¡fs˜»PY¼c¡»¦c„ċ­¥£~msĉP•–Siƒ^o©A‰Šec‚™PeǵŽkg‚yUi¿h}aH™šĉ^|ᴟ¡HØûÅ«ĉ®]m€¡qċ¶±ÈyôōLÁst“BŸ®wn±ă¥HSò뚣˜S’ë@לÊăxÇN©™©T±ª£IJ¡fb®ÞbŽb_Ą¥xu¥B—ž{łĝ³«`d˜Ɛt—¤ťiñžÍUuºí`£˜^tƃIJc—·ÛLO‹½Šsç¥Ts{ă\\_»™kϊ±q©čiìĉ|ÍIƒ¥ć¥›€]ª§D{ŝŖÉR_sÿc³Īō›ƿΑ›§p›[ĉ†›c¯bKm›R¥{³„Z†e^ŽŒwx¹dƽŽôIg §Mĕ ƹĴ¿—ǣÜ̓]‹Ý–]snåA{‹eŒƭ`ǻŊĿ\\ijŬű”YÂÿ¬jĖqŽßbЏ•L«¸©@ěĀ©ê¶ìÀEH|´bRľž–Ó¶rÀQþ‹vl®Õ‚E˜TzÜdb ˜hw¤{LR„ƒd“c‹b¯‹ÙVgœ‚ƜßzÃô쮍^jUèXΖ|UäÌ»rKŽ\\ŒªN‘¼pZCü†VY††¤ɃRi^rPҒTÖ}|br°qňb̰ªiƶGQ¾²„x¦PœmlŜ‘[Ĥ¡Ξ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ð”ļA†TUvdTŠG†º̼ŠÔ€Œ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_bs“KF¯¡Ix™mELcÿZ¤­Ģ‘ƒÝœsuBLù•t†ŒYdˆmVtNmtOPhRw~bd…¾qÐ\\âÙH\\bImlNZŸ»loƒŸqlVm–Gā§~QCw¤™{A\\‘PKŸNY‡¯bF‡kC¥’sk‹Šs_Ã\\ă«¢ħkJi¯r›rAhĹûç£CU‡ĕĊ_ԗBixÅُĄnªÑaM~ħpOu¥sîeQ¥¤^dkKwlL~{L~–hw^‚ófćƒKyEŒ­K­zuÔ¡qQ¤xZÑ¢^ļöܾEpž±âbÊÑÆ^fk¬…NC¾‘Œ“YpxbK~¥Že֎ŒäBlt¿Đx½I[ĒǙŒWž‹f»Ĭ}d§dµùEuj¨‚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ģ¢\\‚ś’nkO›w¥±ƒT»ƷFɯàĩÞáB¹Æ…ÑUw„੍žĽw]•kE½Èå~‡Æ÷QyŠěCFmĭZī—ŵVÁ™ƿQƛ—ûXS²‰b½KϽĉS›©ŷXĕŸ{ŽĕK·¥Ɨcqq©f¿]‡ßDõU³h—­gËÇïģÉɋw“k¯í}I·šœbmœÉ–ř›īJɥĻˁ×xo›ɹī‡l•c…¤³Xù]‘™DžA¿w͉ì¥wÇN·ÂËnƾƍdǧđ®Ɲv•Um©³G\\“}µĿ‡QyŹl㓛µEw‰LJQ½yƋBe¶ŋÀů‡ož¥A—˜Éw@•{Gpm¿Aij†ŽKLhˆ³`ñcËtW‚±»ÕS‰ëüÿďD‡u\\wwwù³—V›LŕƒOMËGh£õP¡™er™Ïd{“‡ġWÁ…č|yšg^ğyÁzÙs`—s|ÉåªÇ}m¢Ń¨`x¥’ù^•}ƒÌ¥H«‰Yªƅ”Aйn~Ꝛf¤áÀz„gŠÇDIԝ´AňĀ҄¶ûEYospõD[{ù°]u›Jq•U•|Soċxţ[õÔĥkŋÞŭZ˺óYËüċrw €ÞkrťË¿XGÉbřaDü·Ē÷Aê[Ää€I®BÕИÞ_¢āĠpŠÛÄȉĖġDKwbm‡ÄNô‡ŠfœƫVÉvi†dz—H‘‹QµâFšù­Âœ³¦{YGžƒd¢ĚÜO „€{Ö¦ÞÍÀPŒ^b–ƾŠl[‚vt×ĈÍE˨¡Đ~´î¸ùÎh€uè`¸ŸHÕŔVºwĠââWò‡@{œÙNÝ´ə²ȕn{¿¥{l—÷eé^e’ďˆXj©î\\ªÑò˜Üìc\\üqˆÕ[Č¡xoÂċªbØ­Œø|€¶ȴZdÆÂšońéŒGš\\”¼C°ÌƁn´nxšÊOĨ’ہƴĸ¢¸òTxÊǪMīИÖŲÃɎOvˆʦƢ~FއRěò—¿ġ~åŊœú‰Nšžš¸qŽ’Ę[Ĕ¶ÂćnÒPĒÜvúĀÊbÖ{Äî¸~Ŕünp¤ÂH¾œĄYÒ©ÊfºmԈĘcDoĬMŬ’˜S¤„s²‚”ʘچžȂVŦ –ŽèW°ªB|IJXŔþÈJĦÆæFĚêŠYĂªĂ]øªŖNÞüA€’fɨJ€˜¯ÎrDDšĤ€`€mz\\„§~D¬{vJÂ˜«lµĂb–¤p€ŌŰNĄ¨ĊXW|ų ¿¾ɄĦƐMT”‡òP˜÷fØĶK¢ȝ˔Sô¹òEð­”`Ɩ½ǒÂň×äı–§ĤƝ§C~¡‚hlå‚ǺŦŞkâ’~}ŽFøàIJaĞ‚fƠ¥Ž„Ŕdž˜®U¸ˆźXœv¢aƆúŪtŠųƠjd•ƺŠƺÅìnrh\\ĺ¯äɝĦ]èpĄ¦´LƞĬŠ´ƤǬ˼Ēɸ¤rºǼ²¨zÌPðŀbþ¹ļD¢¹œ\\ĜÑŚŸ¶ZƄ³âjĦoâŠȴLʉȮŒĐ­ĚăŽÀêZǚŐ¤qȂ\\L¢ŌİfÆs|zºeªÙæ§΢{Ā´ƐÚ¬¨Ĵà²łhʺKÞºÖTŠiƢ¾ªì°`öø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[qb[swP@ÅğP¿{\\‡¯Y²·‘Ѩj¯ŠX\\¯œMSvU¯YIŕY{[fk­VÁ›ûtŷmiÍt_H»Ĩ±d`й­{bw…Yr“³S]§§o¹€qGtm_Sŧ€“oa›‹FLg‘QN_•dV€@Zom_ć\\ߚW´—€ÕiœRcfi…Ÿ’o§ËgToÛJíĔóu…|wP¤™XnO¢ÉŠŦ¯pNÄā¤zâŖÈRpŢZŠœÚ{GŠrFt¦Òx§ø¹RóäV¤XdˆżâºWbwڍUd®bêņ¾‘jnŎGŃŶŠnzÚScîĚZŠen¬"],"encodeOffsets":[[119421,42013]]},"properties":{"cp":[116.405285,39.904989],"name":"北京","childNum":1}},{"id":"120000","geometry":{"type":"Polygon","coordinates":["@@ŬgX§Ü«E…¶Ḟ“¬O_™ïlÁg“z±AXe™µÄĵ{¶]gitgšIj·›¥ì_iU€‰¨ÐƎk}ĕ{gB—qGf{¿a†U^fI“ư‹³õ{YƒıëNĿžk©ïËZukāA‘īlĕĥs¡bġ«@dekąI[nlPqCnp{ˆō³°`{PNdƗqSÄĻNNâyj]äžÒD ĬH°Æ]~¡HO¾ŒX}ÐxŒgp“gWˆrDGˆŒpù‚Š^L‚ˆrzWxˆZ^¨´T\\|~@I‰zƒ–bĤ‹œjeĊªz£®Ĕvě€L†mV¾Ô_Ȕ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ªK†WT…‰‰§¨","@@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÷Z•gg‘Œ^d½pDO‡ÎCnœ^uf²ènh¼WtƏxRGg¦…pV„†FI±ŽG^ŒIc´ec‡’G•ĹÞ½sëÆNä̤“Kӈe¯|‚R¸§L‘ÜkPoïƭNï¶}Gy“wdiù©nkĈzjŸ•@™Óc£»Wă¹Óf§c[µŠo·Ó|MvÛaqœ½«‡èœ’\\ÂoVnŽÓØÍ™²«‹bq¿eƒhCž„€‹Ĝ^Qž~ Évý‡ş¤²Į‰pEĶyhsŊwH‹½‡š¿gņ›¡ýE¡ya£³t\\¨\\vú¹¼©·Ñr_oÒý¥‚‘et³]—Et©uÖ¥±ă©KVeëƒ]}wVPÀFA¨ąB}qTjgRemfFm‰QF݅My˜ù•nцAmыCaƒwŒu_p—¯sfۍ_g†“I_pNysBЦzG¸rHe‚„N\\CvEsÐñÚkcD‘ÖĉsaQ¯€}_U‡†zÁēˆ}Ÿ^R •Äd^ÍĸZ¾·¶ƒ`wećJEž¹vÛ·Hgƒ‚éFXjÉê`|yŒpxkAwœWĐpb¥eOsmzwqChóUQl¥F^laf‹anòsr›EvfQdÁUVf—ÎvÜ^efˆtET¬ôA\\œ¢sJŽnQTjP؈xøK|nBz‰„œĞ»LY‚…FDxӄvr“[ehľš•vN”¢o¾NiÂxGp⬐z›bfZo~hGi’]öF|‰|Nb‡tOMn eA±ŠtPT‡LjpYQ|†SH††YĀxinzDJ€Ìg¢và¥Pg‰_–ÇzII‹€II•„£®S¬„Øsμ–¥¨^LšnGIJļ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´‰òK‰™–LÈüD|s`ŋ’ć]ƒÃ‰`đŒMùƱ¿~Y°ħ`ƏíW‰½eI‹½{aŸ‘OIrÏ¡ĕŇa†p†µÜƃġ‰²"],"encodeOffsets":[[111728,31311]]},"properties":{"cp":[106.504962,29.533155],"name":"重庆","childNum":1}},{"id":"810000","geometry":{"type":"MultiPolygon","coordinates":[["@@AlFi","@@mŽp","@@EpHo","@@rMUw‡AS¬€]","@@ea¢pl¸Eõ¹‡hj[ƒ]ÔCΖ@lj˜¡uBXŸ…•´‹AI¹…[‹yDUˆ]W`çwZkmc–…M›žp€Åv›}I‹oJlcaƒfёKްä¬XJmРđhI®æÔtSHn€Eˆ„Ò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 |
55 | 56 | 57 |
58 | 59 | 60 |
61 | 62 | 63 |
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 | --------------------------------------------------------------------------------