├── assets.sh
├── assets
├── config.json
├── src
│ ├── webpackshims
│ │ └── gridster.js
│ ├── main.js
│ ├── widgets
│ │ ├── image.vue
│ │ ├── d3widget.js
│ │ ├── webview.vue
│ │ ├── d3js.vue
│ │ ├── text.vue
│ │ ├── widget.js
│ │ ├── clock.vue
│ │ ├── comments.vue
│ │ ├── number.vue
│ │ ├── meter.vue
│ │ ├── map.vue
│ │ ├── spermatozoa.vue
│ │ ├── chartjs.vue
│ │ └── sperm.vue
│ └── app.vue
├── dashboards
│ ├── swiming.json
│ ├── map.json
│ └── sample.json
├── layout
│ └── dashboard.html
├── jobs
│ ├── map.go
│ └── sample.go
├── server.go
├── package.json
├── webpack.config.js
└── public
│ └── maps
│ └── china.geo.json
├── .gitignore
├── job.go
├── config.go
├── event.go
├── License
├── Readme.md
└── dashing.go
/assets.sh:
--------------------------------------------------------------------------------
1 | cd assets/
2 | go-bindata -pkg dashing -o ../assets.go ./...
3 | cd ..
--------------------------------------------------------------------------------
/assets/config.json:
--------------------------------------------------------------------------------
1 | {
2 | "defaultDashboard": "",
3 | "hackToken": "",
4 | "globalToken": "",
5 | "widgetTokens": {
6 | "logo": ""
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/assets/src/webpackshims/gridster.js:
--------------------------------------------------------------------------------
1 | require('../../node_modules/gridster/dist/jquery.gridster.css');
2 | require('../../node_modules/gridster/dist/jquery.gridster.js');
3 |
--------------------------------------------------------------------------------
/assets/src/main.js:
--------------------------------------------------------------------------------
1 | require('gridster');
2 | require('font-awesome-webpack');
3 |
4 | var Vue = require('vue');
5 | var App = require('./app.vue');
6 |
7 | new Vue({
8 | el: 'body',
9 | components: {
10 | app: App
11 | }
12 | });
13 |
--------------------------------------------------------------------------------
/assets/src/widgets/image.vue:
--------------------------------------------------------------------------------
1 |
2 | div
3 | img(:src="data.image", :width="data.width")
4 |
5 |
6 |
10 |
11 |
13 |
--------------------------------------------------------------------------------
/assets/src/widgets/d3widget.js:
--------------------------------------------------------------------------------
1 | var d3 = require('d3');
2 | var Widget = require('./widget.js');
3 | var D3Widget = Widget.extend({
4 | computed: {
5 | svg: function() {
6 | var svgElement = this.$el.querySelector('svg');
7 | return d3.select(svgElement);
8 | }
9 | }
10 | });
11 | module.exports = D3Widget;
12 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Compiled Object files, Static and Dynamic libs (Shared Objects)
2 | *.o
3 | *.a
4 | *.so
5 |
6 | # Folders
7 | _obj
8 | _test
9 |
10 | # Architecture specific extensions/prefixes
11 | *.[568vq]
12 | [568vq].out
13 |
14 | *.cgo1.go
15 | *.cgo2.c
16 | _cgo_defun.c
17 | _cgo_gotypes.go
18 | _cgo_export.*
19 |
20 | _testmain.go
21 |
22 | *.exe
23 | *.test
24 | *.prof
25 |
--------------------------------------------------------------------------------
/job.go:
--------------------------------------------------------------------------------
1 | package dashing
2 |
3 | // A Job does periodic work and sends events to a channel.
4 | type Job interface {
5 | Work(send chan *Event)
6 | }
7 |
8 | var registry = []Job{}
9 |
10 | // Register a job to be kicked off upon starting the server.
11 | func Register(j Job) {
12 | if j == nil {
13 | panic("Can't register nil job")
14 | }
15 | registry = append(registry, j)
16 | }
17 |
--------------------------------------------------------------------------------
/assets/src/widgets/webview.vue:
--------------------------------------------------------------------------------
1 |
2 | div
3 | iframe(:src="data.url", frameborder=0)
4 |
5 |
6 |
10 |
11 |
21 |
--------------------------------------------------------------------------------
/assets/dashboards/swiming.json:
--------------------------------------------------------------------------------
1 | {
2 | "margin": {
3 | "x": 5,
4 | "y": 5
5 | },
6 | "size": {
7 | "width": 238,
8 | "height": 218
9 | },
10 | "columns": 4,
11 | "widgets": [{
12 | "id": "sperm",
13 | "view": "sperm",
14 | "sizex": 4,
15 | "sizey": 4,
16 | "config": {
17 | "title": "Swiming Pool"
18 | }
19 | }]
20 | }
21 |
--------------------------------------------------------------------------------
/assets/layout/dashboard.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/assets/src/widgets/d3js.vue:
--------------------------------------------------------------------------------
1 |
2 | div
3 | h1.title(:style="config&&config.title_style") {{getConfig('title', '')}}
4 | svg(width="{{getConfig('width', 340)}}", height="{{getConfig('height', 180)}}")
5 | p.info(:style="config&&config.info_style") {{{legend}}}
6 | p.updated {{updated}}
7 |
8 |
9 |
15 |
16 |
18 |
--------------------------------------------------------------------------------
/assets/dashboards/map.json:
--------------------------------------------------------------------------------
1 | {
2 | "margin": {
3 | "x": 5,
4 | "y": 5
5 | },
6 | "size": {
7 | "width": 238,
8 | "height": 218
9 | },
10 | "columns": 4,
11 | "widgets": [{
12 | "id": "map",
13 | "view": "map",
14 | "style": {
15 | "background-color": "#222"
16 | },
17 | "sizex": 4,
18 | "sizey": 4,
19 | "config": {
20 | "title": "Bubules",
21 | "scale": 800
22 | }
23 | }]
24 | }
25 |
--------------------------------------------------------------------------------
/assets/jobs/map.go:
--------------------------------------------------------------------------------
1 | package jobs
2 |
3 | import (
4 | // "fmt"
5 | "github.com/exherb/Dashing"
6 | "time"
7 | )
8 |
9 | type MapJob struct{}
10 |
11 | func (j MapJob) Work(send chan *dashing.Event) {
12 | ticker := time.NewTicker(1 * time.Second)
13 | for {
14 | select {
15 | case <-ticker.C:
16 | send <- &dashing.Event{"map", "widget", "map", map[string]interface{}{
17 | "coordinate": []int{random(73, 135), random(3, 53)},
18 | "value": random(0, 100),
19 | }}
20 | }
21 | }
22 | }
23 |
24 | func init() {
25 | dashing.Register(MapJob{})
26 | }
27 |
--------------------------------------------------------------------------------
/assets/server.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import(
4 | "path/filepath"
5 | "flag"
6 | "fmt"
7 | "github.com/exherb/Dashing"
8 | _ "./jobs"
9 | )
10 |
11 | func main() {
12 | var host string
13 | flag.StringVar(&host, "host", "127.0.0.1", "bind host")
14 | var port int
15 | flag.IntVar(&port, "port", 8080, "bind port")
16 | flag.Parse()
17 | dirpath := flag.Arg(0)
18 | dirpath, _ = filepath.Abs(dirpath)
19 |
20 | err := dashing.Server(dirpath, host, port)
21 | if err != nil {
22 | fmt.Println(err)
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/config.go:
--------------------------------------------------------------------------------
1 | package dashing
2 |
3 | import (
4 | "encoding/json"
5 | "fmt"
6 | "os"
7 | )
8 |
9 | type Config struct {
10 | DashingPath string
11 | DefaultDashboard string
12 | HackToken string
13 | GlobalToken string
14 | WidgetTokens map[string]string
15 | }
16 |
17 | func NewConfig(path string) *Config {
18 | file, _ := os.Open(path)
19 | decoder := json.NewDecoder(file)
20 | config := new(Config)
21 | if err := decoder.Decode(&config); err != nil {
22 | fmt.Printf("Parsing config file error, %s", err.Error())
23 | }
24 | return config
25 | }
26 |
--------------------------------------------------------------------------------
/assets/src/widgets/text.vue:
--------------------------------------------------------------------------------
1 |
2 | div
3 | h1.title(:style="config&&config.title_style") {{data.title}}
4 | h3(:style="config&&config.text_style") {{data.text}}
5 | p.info(:style="config&&config.info_style") {{data.info}}
6 | p.updated {{updated}}
7 |
8 |
9 |
13 |
14 |
24 |
--------------------------------------------------------------------------------
/assets/src/widgets/widget.js:
--------------------------------------------------------------------------------
1 | var Vue = require('vue');
2 | var Widget = Vue.extend({
3 | props: ["id", "config", "data"],
4 | computed: {
5 | width: function() {
6 | return this.config.width;
7 | },
8 | height: function() {
9 | return this.config.height;
10 | }
11 | }, methods: {
12 | getConfig: function(name, defaultValue) {
13 | if (this.config) {
14 | var configValue = this.config[name];
15 | if (configValue !== undefined) {
16 | return configValue;
17 | };
18 | };
19 | return defaultValue;
20 | }
21 | }
22 | });
23 | module.exports = Widget;
24 |
--------------------------------------------------------------------------------
/assets/src/widgets/clock.vue:
--------------------------------------------------------------------------------
1 |
2 | div
3 | h1 {{date}}
4 | h2 {{time}}
5 |
6 |
7 |
36 |
37 |
39 |
--------------------------------------------------------------------------------
/event.go:
--------------------------------------------------------------------------------
1 | package dashing
2 |
3 | type Event struct {
4 | Dashboard string
5 | Target string
6 | ID string
7 | Body map[string]interface{}
8 | }
9 |
10 | type EventBroker struct {
11 | clients map[chan *Event]bool
12 | newClients chan chan *Event
13 | defunctClients chan chan *Event
14 | events chan *Event
15 | lastEvents map[string]*Event
16 | }
17 |
18 | func (b *EventBroker) Start() {
19 | go func() {
20 | for {
21 | select {
22 | case s := <-b.newClients:
23 | b.clients[s] = true
24 | for _, e := range b.lastEvents {
25 | s <- e
26 | }
27 | case s := <-b.defunctClients:
28 | delete(b.clients, s)
29 | case event := <-b.events:
30 | b.lastEvents[event.ID] = event
31 | for s := range b.clients {
32 | s <- event
33 | }
34 | }
35 | }
36 | }()
37 | }
38 |
39 | func NewEventBlock() *EventBroker {
40 | return &EventBroker{
41 | make(map[chan *Event]bool),
42 | make(chan (chan *Event)),
43 | make(chan (chan *Event)),
44 | make(chan *Event),
45 | map[string]*Event{},
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/License:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 Herb Brewer
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/assets/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "dashboard",
3 | "version": "0.1.0",
4 | "description": "",
5 | "main": "src/main.js",
6 | "scripts": {
7 | "dev": "webpack-dev-server --inline --hot --quiet",
8 | "build": "export NODE_ENV=production && webpack --progress --hide-modules"
9 | },
10 | "dependencies": {
11 | "chart.js": "^1.0.2",
12 | "font-awesome": "^4.5.0",
13 | "gridster": "^0.5.6",
14 | "vue": "^1.0.0",
15 | "d3": "^3.5.10"
16 | },
17 | "devDependencies": {
18 | "babel-core": "^6.1.2",
19 | "babel-loader": "^6.1.0",
20 | "babel-plugin-transform-runtime": "^6.1.2",
21 | "babel-preset-es2015": "^6.1.2",
22 | "babel-runtime": "^6.0.14",
23 | "css-loader": "^0.23.0",
24 | "file-loader": "^0.8.4",
25 | "font-awesome-webpack": "0.0.4",
26 | "imports-loader": "^0.6.5",
27 | "jade": "^1.11.0",
28 | "json-loader": "^0.5.4",
29 | "less": "^2.5.3",
30 | "less-loader": "^2.2.2",
31 | "style-loader": "^0.13.0",
32 | "stylus-loader": "^1.4.0",
33 | "template-html-loader": "0.0.3",
34 | "vue-hot-reload-api": "^1.2.0",
35 | "vue-html-loader": "^1.0.0",
36 | "vue-loader": "^7.0.0",
37 | "webpack": "^1.12.2",
38 | "webpack-dev-server": "^1.12.0",
39 | "url-loader": "^0.5.7"
40 | },
41 | "author": "Your name",
42 | "license": "MIT"
43 | }
44 |
--------------------------------------------------------------------------------
/assets/src/widgets/comments.vue:
--------------------------------------------------------------------------------
1 |
2 | div
3 | h1.title(:style="config&&config.title_style") {{config.title}}
4 | .comment(v-show="!hidding" transition="fade")
5 | h3(:style="config&&config.text_style")
6 | img(:src="comment.avatar")
7 | span.name {{comment.name}}
8 | p.comment {{comment.quote}}
9 | p.info(:style="config&&config.info_style") {{data.info}}
10 |
11 |
12 |
39 |
40 |
60 |
--------------------------------------------------------------------------------
/Readme.md:
--------------------------------------------------------------------------------
1 | # Dashing
2 |
3 | This is a go version of http://dashing.io, but completly rewrited with [golang](http://golang.org) and [vuejs](http://vuejs.org). By using [webpack](https://webpack.github.io) and [vue-loader](https://github.com/vuejs/vue-loader), as a designer or developer you could write a widget in single file and share it easily.
4 |
5 | ## Demo
6 |
7 | - http://dash.4leaf.me/sample
8 | - http://dash.4leaf.me/swiming
9 | - http://dash.4leaf.me/map
10 |
11 | ## Install
12 |
13 | ```bash
14 | go get -u github.com/exherb/dashing-cli
15 | ```
16 |
17 | ## Usage
18 |
19 | ```bash
20 | dashing-cli new dashboard
21 | cd dashboard
22 | npm install
23 | npm run build
24 | go run server.go
25 | ```
26 |
27 | ## Deploy
28 |
29 | TODO
30 |
31 | ## Dashboards
32 |
33 | [Examples](https://github.com/exherb/Dashing/tree/master/assets/dashboards)
34 |
35 | ## Widgets
36 |
37 | [Examples](https://github.com/exherb/Dashing/tree/master/assets/src/widgets)
38 |
39 | ## Getting Data Into Your Widgets
40 |
41 | ### Jobs
42 |
43 | [Examples](https://github.com/exherb/Dashing/tree/master/assets/jobs)
44 |
45 | ### API
46 |
47 | ```bash
48 | curl -d '{"token": "{token}", ...}' http://dash.4leaf.me/dashboards/{dashboard_id}/widgets/{widget_id}
49 | ```
50 |
51 | example
52 |
53 | ```bash
54 | curl -d '{"token": "okiedokie", "color": "yellow"}' http://dash.4leaf.me/dashboards/*/widgets/sperm
55 | ```
56 |
57 | if dashboard_id is '*', then the data will send to all dashboards
58 |
59 | ## Todo
60 |
61 | - [x] widget token
62 | - [ ] deploy document
63 | - [ ] save history to database
64 | - [ ] restore historical datas
65 | - [ ] webgl demo
66 | - [ ] video demo
67 | - [ ] kinect demo
68 | - [ ] fasthttp
69 |
--------------------------------------------------------------------------------
/assets/jobs/sample.go:
--------------------------------------------------------------------------------
1 | package jobs
2 |
3 | import (
4 | "github.com/exherb/Dashing"
5 | "math/rand"
6 | "time"
7 | )
8 |
9 | type SampleJob struct{}
10 |
11 | func random(min int, max int) int {
12 | rand.Seed(time.Now().UTC().UnixNano())
13 | return rand.Intn(max-min) + min
14 | }
15 |
16 | func (j SampleJob) Work(send chan *dashing.Event) {
17 | ticker := time.NewTicker(1 * time.Second)
18 | for {
19 | select {
20 | case <-ticker.C:
21 | send <- &dashing.Event{"sample", "widget", "synergy", map[string]interface{}{
22 | "value": random(0, 100),
23 | }}
24 |
25 | var doorStatus string
26 | if random(0, 100) > 50 {
27 | doorStatus = "打开"
28 | } else {
29 | doorStatus = "关闭"
30 | }
31 | send <- &dashing.Event{"sample", "widget", "door", map[string]interface{}{
32 | "text": doorStatus,
33 | }}
34 |
35 | send <- &dashing.Event{"sample", "widget", "elevator", map[string]interface{}{
36 | "value": random(1, 7),
37 | }}
38 |
39 | send <- &dashing.Event{"sample", "widget", "wifi", map[string]interface{}{
40 | "value": random(0, 300),
41 | }}
42 |
43 | now := time.Now()
44 | send <- &dashing.Event{"sample", "widget", "line", map[string]interface{}{
45 | "value": []int{random(0, 100), random(0, 100)},
46 | "label": now.Format("04:05"),
47 | }}
48 |
49 | send <- &dashing.Event{"sample", "widget", "segment", map[string]interface{}{
50 | "value": []int{random(0, 100), random(0, 100), random(0, 100), random(0, 100), random(0, 100)},
51 | }}
52 |
53 | send <- &dashing.Event{"map", "widget", "map", map[string]interface{}{
54 | "coordinate": []int{random(73*1000, 135*1000) / 1000.0, random(20*1000, 55*1000) / 1000.0},
55 | "value": random(0, 50),
56 | }}
57 | }
58 | }
59 | }
60 |
61 | func init() {
62 | dashing.Register(SampleJob{})
63 | }
64 |
--------------------------------------------------------------------------------
/assets/webpack.config.js:
--------------------------------------------------------------------------------
1 | var webpack = require('webpack')
2 |
3 | module.exports = {
4 | entry: './src/main.js',
5 | output: {
6 | path: './public/js',
7 | publicPath: '/js/',
8 | filename: 'app.js'
9 | },
10 | module: {
11 | loaders: [{
12 | test: /\.vue$/,
13 | loader: 'vue'
14 | }, {
15 | test: /\.css$/,
16 | loader: 'style!css'
17 | }, {
18 | test: /\.json$/,
19 | loader: 'json'
20 | }, {
21 | test: /\.(png|jpg|gif)$/,
22 | loader: 'file?name=[name].[ext]?[hash]'
23 | }, {
24 | test: /\.woff(2)?(\?v=[0-9]\.[0-9]\.[0-9])?$/,
25 | loader: "url?limit=10000&mimetype=application/font-woff"
26 | }, {
27 | test: /\.(ttf|eot|svg)(\?v=[0-9]\.[0-9]\.[0-9])?$/,
28 | loader: "file"
29 | }]
30 | },
31 | babel: {
32 | presets: ['es2015'],
33 | plugins: ['transform-runtime']
34 | },
35 | resolve: {
36 | alias: {
37 | jquery: __dirname + "/node_modules/jquery/jquery.js",
38 | gridster: __dirname + "/src/webpackshims/gridster.js"
39 | }
40 | },
41 | plugins: [
42 | new webpack.ProvidePlugin({
43 | $: "jquery",
44 | jQuery: "jquery",
45 | "window.jQuery": "jquery"
46 | })
47 | ]
48 | }
49 |
50 | if (process.env.NODE_ENV === 'production') {
51 | module.exports.plugins = [
52 | new webpack.DefinePlugin({
53 | 'process.env': {
54 | NODE_ENV: '"production"'
55 | }
56 | }),
57 | new webpack.optimize.UglifyJsPlugin({
58 | compress: {
59 | warnings: false
60 | }
61 | }),
62 | new webpack.optimize.OccurenceOrderPlugin()
63 | ]
64 | } else {
65 | module.exports.devtool = '#source-map'
66 | }
67 |
--------------------------------------------------------------------------------
/assets/src/widgets/number.vue:
--------------------------------------------------------------------------------
1 |
2 | div
3 | h1.title(:style="config&&config.title_style") {{getConfig('title', '')}}
4 | h2.value(:style="config&&config.value_style")
5 | | {{config.prefix}}
6 | span(v-animate-number="data.value")
7 | | {{config.suffix}}
8 | p.diff
9 | i(class="fa", :class="arrow", v-if="getConfig('show_arrow', true)")
10 | span(v-if="getConfig('show_diff', true)" v-animate-number="diff")
11 | span(v-if="getConfig('show_diff', true) && getConfig('percentage', true)") %
12 | p.info(:style="config&&config.info_style") {{getConfig('info', '')}}
13 | p.updated {{updated}}
14 |
15 |
16 |
54 |
55 |
75 |
--------------------------------------------------------------------------------
/assets/src/widgets/meter.vue:
--------------------------------------------------------------------------------
1 |
2 | div
3 | h1.title(:style="config&&config.title_style") {{getConfig('title', '')}}
4 | canvas(:width="width", :height="height")
5 | h2.value {{ data.value | shortenedNumber }}
6 | p.info(:style="config&&config.info_style") {{getConfig('info', '')}}
7 | p.updated {{updated}}
8 |
9 |
10 |
51 |
52 |
76 |
--------------------------------------------------------------------------------
/assets/src/widgets/map.vue:
--------------------------------------------------------------------------------
1 |
2 | div
3 | h1.title(:style="config&&config.title_style") {{getConfig('title', '')}}
4 | svg(:width="width", :height="height")
5 | p.info(:style="config&&config.info_style") {{{legend}}}
6 | p.updated {{updated}}
7 |
8 |
9 |
79 |
80 |
97 |
--------------------------------------------------------------------------------
/assets/src/widgets/spermatozoa.vue:
--------------------------------------------------------------------------------
1 |
2 | div
3 | h1.title(:style="config&&config.title_style") {{getConfig('title', '')}}
4 | svg(width="{{getConfig('width', 340)}}", height="{{getConfig('height', 180)}}")
5 | p.info(:style="config&&config.info_style") {{{legend}}}
6 | p.updated {{updated}}
7 |
8 |
9 |
95 |
96 |
127 |
--------------------------------------------------------------------------------
/assets/src/widgets/chartjs.vue:
--------------------------------------------------------------------------------
1 |
2 | div
3 | h1.title(:style="config&&config.title_style") {{getConfig('title', '')}}
4 | canvas(:width="width", :height="height")
5 | p.info(:style="config&&config.info_style") {{{legend}}}
6 | p.updated {{updated}}
7 |
8 |
9 |
98 |
99 |
117 |
--------------------------------------------------------------------------------
/assets/src/widgets/sperm.vue:
--------------------------------------------------------------------------------
1 |
2 | div
3 | h1.title(:style="config&&config.title_style") {{getConfig('title', '')}}
4 | svg(:width="width", :height="height")
5 | p.info(:style="config&&config.info_style") {{{legend}}}
6 | p.updated {{updated}}
7 |
8 |
9 |
108 |
109 |
126 |
--------------------------------------------------------------------------------
/dashing.go:
--------------------------------------------------------------------------------
1 | package dashing
2 |
3 | import (
4 | "encoding/json"
5 | "fmt"
6 | "github.com/julienschmidt/httprouter"
7 | "net/http"
8 | "path/filepath"
9 | )
10 |
11 | var config *Config
12 | var eventBroker *EventBroker
13 |
14 | func renderStatus(w http.ResponseWriter, status int, key string, info string) {
15 | w.WriteHeader(status)
16 | json.NewEncoder(w).Encode(map[string]string{key: info})
17 | }
18 |
19 | func index(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
20 | if r.Method == "GET" {
21 | dashboards, _ := filepath.Glob(filepath.Join(config.DashingPath, "dashboards", "*.json"))
22 | if len(dashboards) > 0 {
23 | defaultDashboard := config.DefaultDashboard
24 | if len(defaultDashboard) == 0 {
25 | firstDashboard := dashboards[0]
26 | firstDashboard = filepath.Base(firstDashboard)
27 | defaultDashboard = firstDashboard[0 : len(firstDashboard)-5]
28 | }
29 | http.Redirect(w, r, "/"+defaultDashboard, http.StatusMovedPermanently)
30 | } else {
31 | renderStatus(w, 404, "status", "not found")
32 | }
33 | }
34 | }
35 |
36 | func dashboard(w http.ResponseWriter, r *http.Request, params httprouter.Params) {
37 | layoutHTMLBytes := MustAsset("layout/dashboard.html")
38 | w.Write(layoutHTMLBytes)
39 | }
40 |
41 | func dashboardPost(w http.ResponseWriter, r *http.Request, params httprouter.Params) {
42 | dashboard := params.ByName("dashboard")
43 | var data map[string]interface{}
44 | if err := json.NewDecoder(r.Body).Decode(&data); err != nil {
45 | renderStatus(w, 400, "status", err.Error())
46 | return
47 | }
48 |
49 | token := data["token"]
50 | if token != config.GlobalToken {
51 | renderStatus(w, 403, "status", "forbidden")
52 | return
53 | }
54 | delete(data, "token")
55 |
56 | eventBroker.events <- &Event{dashboard, "dashboard", dashboard, data}
57 | renderStatus(w, 200, "status", "ok")
58 | }
59 |
60 | func widgetPost(w http.ResponseWriter, r *http.Request, params httprouter.Params) {
61 | dashboard := params.ByName("dashboard")
62 | widget := params.ByName("widget")
63 | var data map[string]interface{}
64 | if err := json.NewDecoder(r.Body).Decode(&data); err != nil {
65 | renderStatus(w, 400, "status", err.Error())
66 | return
67 | }
68 |
69 | token := data["token"]
70 | if token != config.GlobalToken &&
71 | token != config.HackToken {
72 | widgetToken := config.WidgetTokens[widget]
73 | if len(widgetToken) == 0 || token != widgetToken {
74 | renderStatus(w, 403, "status", "forbidden")
75 | return
76 | }
77 | }
78 |
79 | delete(data, "token")
80 | eventBroker.events <- &Event{dashboard, "widget", widget, data}
81 | renderStatus(w, 200, "status", "ok")
82 | }
83 |
84 | func events(w http.ResponseWriter, r *http.Request, params httprouter.Params) {
85 | dashboard := params.ByName("dashboard")
86 | f, ok := w.(http.Flusher)
87 | if !ok {
88 | renderStatus(w, 500, "status", "error: streaming unsupported")
89 | return
90 | }
91 | closeNotification, ok := w.(http.CloseNotifier)
92 | if !ok {
93 | renderStatus(w, 500, "status", "error: close notification unsupported")
94 | return
95 | }
96 |
97 | events := make(chan *Event)
98 | eventBroker.newClients <- events
99 | defer func() {
100 | eventBroker.defunctClients <- events
101 | }()
102 |
103 | w.Header().Set("Content-Type", "text/event-stream;charset=utf-8")
104 | w.Header().Set("Cache-Control", "no-cache")
105 | w.Header().Set("Connection", "keep-alive")
106 | w.Header().Set("X-Accel-Buffering", "no")
107 | closer := closeNotification.CloseNotify()
108 | for {
109 | select {
110 | case event := <-events:
111 | if event.Dashboard == dashboard || event.Dashboard == "*" {
112 | data := event.Body
113 | data["id"] = event.ID
114 | if event.Target != "" {
115 | w.Write([]byte("event: "))
116 | w.Write([]byte(event.Target))
117 | w.Write([]byte("\n"))
118 | }
119 | raw, _ := json.Marshal(data)
120 | w.Write([]byte("data: "))
121 | w.Write(raw)
122 | w.Write([]byte("\n\n"))
123 | f.Flush()
124 | }
125 | case <-closer:
126 | break
127 | }
128 | }
129 | }
130 |
131 | func Server(dashingPath string, host string, port int) error {
132 | config = NewConfig(filepath.Join(dashingPath, "config.json"))
133 | config.DashingPath = dashingPath
134 |
135 | eventBroker = NewEventBlock()
136 | eventBroker.Start()
137 |
138 | for _, j := range registry {
139 | go j.Work(eventBroker.events)
140 | }
141 |
142 | router := httprouter.New()
143 | router.GET("/", index)
144 | router.GET("/:dashboard", dashboard)
145 | router.POST("/dashboards/:dashboard", dashboardPost)
146 | router.POST("/dashboards/:dashboard/widgets/:widget", widgetPost)
147 | router.GET("/:dashboard/events", events)
148 | router.NotFound = http.FileServer(http.Dir(filepath.Join(dashingPath, "public")))
149 |
150 | addr := fmt.Sprintf("%s:%d", host, port)
151 | fmt.Printf("Listening on %s ...\n", addr)
152 | if err := http.ListenAndServe(addr, router); err != nil {
153 | return err
154 | }
155 | return nil
156 | }
157 |
--------------------------------------------------------------------------------
/assets/dashboards/sample.json:
--------------------------------------------------------------------------------
1 | {
2 | "margin": {
3 | "x": 5,
4 | "y": 5
5 | },
6 | "size": {
7 | "width": 300,
8 | "height": 360
9 | },
10 | "columns": 3,
11 | "widgets": [{
12 | "id": "logo",
13 | "view": "image",
14 | "sizex": 1,
15 | "sizey": 1,
16 | "style": {
17 | "background-color": "#4b4b4b"
18 | },
19 | "data": {
20 | "image": "https://www.google.com.hk/images/branding/googlelogo/1x/googlelogo_color_272x92dp.png"
21 | }
22 | }, {
23 | "id": "clock",
24 | "view": "clock",
25 | "sizex": 1,
26 | "sizey": 1,
27 | "icon": "fa-clock-o"
28 | }, {
29 | "id": "synergy",
30 | "view": "meter",
31 | "sizex": 1,
32 | "sizey": 1,
33 | "style": {
34 | "background-color": "#9c4274"
35 | },
36 | "config": {
37 | "title": "Synergy",
38 | "info": "Building"
39 | },
40 | "data": {
41 | "value": 90
42 | }
43 | } , {
44 | "id": "door",
45 | "view": "text",
46 | "sizex": 1,
47 | "sizey": 1,
48 | "icon": "fa-sign-out",
49 | "style": {
50 | "background-color": "#D0104C"
51 | },
52 | "data": {
53 | "title": "Door"
54 | }
55 | }, {
56 | "id": "elevator",
57 | "view": "number",
58 | "sizex": 1,
59 | "sizey": 1,
60 | "hidediff": true,
61 | "icon": "fa-sort",
62 | "style": {
63 | "background-color": "#005CAF"
64 | },
65 | "config": {
66 | "title": "Elevator",
67 | "suffix": "Floor",
68 | "show_diff": false
69 | }
70 | }, {
71 | "id": "wifi",
72 | "view": "number",
73 | "sizex": 1,
74 | "sizey": 1,
75 | "icon": "fa-wifi",
76 | "style": {
77 | "background-color": "#96bf48"
78 | },
79 | "config": {
80 | "title": "WiFi",
81 | "info": "Connectaed"
82 | }
83 | }, {
84 | "id": "tweets",
85 | "view": "comments",
86 | "sizex": 2,
87 | "sizey": 1,
88 | "icon": "fa-twitter",
89 | "style": {
90 | "background-color": "#44312d"
91 | },
92 | "config": {
93 | "title": "Tweets",
94 | "info": "#TodayILearned"
95 | },
96 | "data": {
97 | "comments": [{
98 | "avatar": "https://pbs.twimg.com/profile_images/576819978197827584/jviUkOmr_normal.png",
99 | "name": "reddit TIL",
100 | "quote": "#TodayILearned that I can face criminal charges for doing the Nazi salute in Germany"
101 | },
102 | {
103 | "avatar": "https://pbs.twimg.com/profile_images/584787302892707840/Ix_AGWHt_normal.jpg",
104 | "name": ">Nick Schilling",
105 | "quote": "@kare11 #TodayILearned people even complain about budget surpluses."
106 | }]
107 | }
108 | }, {
109 | "id": "line",
110 | "view": "chartjs",
111 | "sizex": 2,
112 | "sizey": 1,
113 | "config": {
114 | "title": "Air Quality",
115 | "data_config": [{
116 | "label": "PM 2.5",
117 | "fillColor": "rgba(220,220,220,0.2)",
118 | "strokeColor": "rgba(220,220,220,1)",
119 | "pointColor": "rgba(220,220,220,1)",
120 | "pointStrokeColor": "#fff",
121 | "pointHighlightFill": "#fff",
122 | "pointHighlightStroke": "rgba(220,220,220,1)"
123 | }, {
124 | "label": "PM 10",
125 | "fillColor": "rgba(151,187,205,0.2)",
126 | "strokeColor": "rgba(151,187,205,1)",
127 | "pointColor": "rgba(151,187,205,1)",
128 | "pointStrokeColor": "#fff",
129 | "pointHighlightFill": "#fff",
130 | "pointHighlightStroke": "rgba(151,187,205,1)"
131 | }],
132 | "options": {
133 | "showTooltips": false,
134 | "pointDot": false
135 | },
136 | "limit": 20
137 | }
138 | }, {
139 | "id": "line",
140 | "view": "chartjs",
141 | "sizex": 2,
142 | "sizey": 1,
143 | "config": {
144 | "title": "Air Quality",
145 | "type": "Bar",
146 | "data_config": [{
147 | "label": "PM 2.5",
148 | "fillColor": "rgba(220,220,220,0.5)",
149 | "strokeColor": "rgba(220,220,220,0.8)",
150 | "highlightFill": "rgba(220,220,220,0.75)",
151 | "highlightStroke": "rgba(220,220,220,1)"
152 | }, {
153 | "label": "PM 10",
154 | "fillColor": "rgba(151,187,205,0.5)",
155 | "strokeColor": "rgba(151,187,205,0.8)",
156 | "highlightFill": "rgba(151,187,205,0.75)",
157 | "highlightStroke": "rgba(151,187,205,1)"
158 | }],
159 | "limit": 20
160 | }
161 | }, {
162 | "id": "line",
163 | "view": "chartjs",
164 | "sizex": 1,
165 | "sizey": 1,
166 | "config": {
167 | "title": "Air Quality",
168 | "type": "Radar",
169 | "data_config": [{
170 | "label": "PM 2.5",
171 | "fillColor": "rgba(220,220,220,0.2)",
172 | "strokeColor": "rgba(220,220,220,1)",
173 | "pointColor": "rgba(220,220,220,1)",
174 | "pointStrokeColor": "#fff",
175 | "pointHighlightFill": "#fff",
176 | "pointHighlightStroke": "rgba(220,220,220,1)"
177 | }, {
178 | "label": "PM 10",
179 | "fillColor": "rgba(151,187,205,0.2)",
180 | "strokeColor": "rgba(151,187,205,1)",
181 | "pointColor": "rgba(151,187,205,1)",
182 | "pointStrokeColor": "#fff",
183 | "pointHighlightFill": "#fff",
184 | "pointHighlightStroke": "rgba(151,187,205,1)"
185 | }],
186 | "limit": 5
187 | }
188 | }, {
189 | "id": "segment",
190 | "view": "chartjs",
191 | "sizex": 1,
192 | "sizey": 1,
193 | "config": {
194 | "title": "Other",
195 | "type": "PolarArea",
196 | "data_config": [{
197 | "color": "#F7464A",
198 | "highlight": "#FF5A5E",
199 | "label": "Red"
200 | }, {
201 | "color": "#46BFBD",
202 | "highlight": "#5AD3D1",
203 | "label": "Green"
204 | }, {
205 | "color": "#FDB45C",
206 | "highlight": "#FFC870",
207 | "label": "Yellow"
208 | }, {
209 | "color": "#949FB1",
210 | "highlight": "#A8B3C5",
211 | "label": "Grey"
212 | }, {
213 | "color": "#4D5360",
214 | "highlight": "#616774",
215 | "label": "Dark Grey"
216 | }]
217 | }
218 | }, {
219 | "id": "segment",
220 | "view": "chartjs",
221 | "sizex": 1,
222 | "sizey": 1,
223 | "config": {
224 | "title": "Other",
225 | "type": "Pie",
226 | "data_config": [{
227 | "value": 300,
228 | "color":"#F7464A",
229 | "highlight": "#FF5A5E",
230 | "label": "Red"
231 | },
232 | {
233 | "value": 50,
234 | "color": "#46BFBD",
235 | "highlight": "#5AD3D1",
236 | "label": "Green"
237 | },
238 | {
239 | "value": 100,
240 | "color": "#FDB45C",
241 | "highlight": "#FFC870",
242 | "label": "Yellow"
243 | }]
244 | }
245 | }, {
246 | "id": "segment",
247 | "view": "chartjs",
248 | "sizex": 1,
249 | "sizey": 1,
250 | "config": {
251 | "title": "Other",
252 | "type": "Doughnut",
253 | "data_config": [{
254 | "color":"#F7464A",
255 | "highlight": "#FF5A5E",
256 | "label": "Red"
257 | },
258 | {
259 | "color": "#46BFBD",
260 | "highlight": "#5AD3D1",
261 | "label": "Green"
262 | },
263 | {
264 | "color": "#FDB45C",
265 | "highlight": "#FFC870",
266 | "label": "Yellow"
267 | }]
268 | }
269 | }]
270 | }
271 |
--------------------------------------------------------------------------------
/assets/src/app.vue:
--------------------------------------------------------------------------------
1 |
2 | .gridster
3 | ul
4 | li(v-for="(index, widget) in dashboard.widgets", data-row="{{rowAtIndex(index)}}", data-col="{{index%dashboard.columns+1}}", data-sizex="{{widget.sizex}}", data-sizey="{{widget.sizey}}", :style="widget.style")
5 | component(:is="registerComponent(widget.view)",
6 | :id="widget.id",
7 | :data="widget.data || {}",
8 | :config="widget.config",
9 | class="widget")
10 | i(class="fa icon-background",
11 | :class="[widget.icon]",
12 | :style="{ 'margin-top': dashboard.size.height/3.4 + 'px' }",
13 | v-if="widget['icon']",)
14 |
15 |
16 |
184 |
185 |
320 |
--------------------------------------------------------------------------------
/assets/public/maps/china.geo.json:
--------------------------------------------------------------------------------
1 | {"type":"FeatureCollection","features":[{"type":"Feature","id":"xin_jiang","properties":{"name":"新疆","cp":[84.9023,41.748],"childNum":18},"geometry":{"type":"Polygon","coordinates":[[[96.416,42.7588],[96.416,42.7148],[95.9766,42.4951],[96.0645,42.3193],[96.2402,42.2314],[95.9766,41.9238],[95.2734,41.6162],[95.1855,41.792],[94.5703,41.4844],[94.043,41.0889],[93.8672,40.6934],[93.0762,40.6494],[92.6367,39.6387],[92.373,39.3311],[92.373,39.1113],[92.373,39.0234],[90.1758,38.4961],[90.3516,38.2324],[90.6152,38.3203],[90.5273,37.8369],[91.0547,37.4414],[91.3184,37.0898],[90.7031,36.7822],[90.791,36.6064],[91.0547,36.5186],[91.0547,36.0791],[90.8789,36.0352],[90,36.2549],[89.9121,36.0791],[89.7363,36.0791],[89.209,36.2988],[88.7695,36.3428],[88.5938,36.4746],[87.3633,36.4307],[86.2207,36.167],[86.1328,35.8594],[85.6055,35.6836],[85.0781,35.7275],[84.1992,35.376],[83.1445,35.4199],[82.8809,35.6836],[82.4414,35.7275],[82.002,35.332],[81.6504,35.2441],[80.4199,35.4199],[80.2441,35.2881],[80.332,35.1563],[80.2441,35.2002],[79.8926,34.8047],[79.8047,34.4971],[79.1016,34.4531],[79.0137,34.3213],[78.2227,34.7168],[78.0469,35.2441],[78.0469,35.5078],[77.4316,35.4639],[76.8164,35.6396],[76.5527,35.8594],[76.2012,35.8154],[75.9375,36.0352],[76.0254,36.4746],[75.8496,36.6943],[75.498,36.7383],[75.4102,36.958],[75.0586,37.002],[74.8828,36.9141],[74.7949,37.0459],[74.5313,37.0898],[74.5313,37.2217],[74.8828,37.2217],[75.1465,37.4414],[74.8828,37.5732],[74.9707,37.749],[74.8828,38.4521],[74.3555,38.6719],[74.1797,38.6719],[74.0918,38.54],[73.8281,38.584],[73.7402,38.8477],[73.8281,38.9795],[73.4766,39.375],[73.916,39.5068],[73.916,39.6826],[73.8281,39.7705],[74.0039,40.0342],[74.8828,40.3418],[74.7949,40.5176],[75.2344,40.4297],[75.5859,40.6494],[75.7617,40.2979],[76.377,40.3857],[76.9043,41.001],[77.6074,41.001],[78.1348,41.2207],[78.1348,41.3965],[80.1563,42.0557],[80.2441,42.2754],[80.1563,42.627],[80.2441,42.8467],[80.5078,42.8906],[80.4199,43.0664],[80.7715,43.1982],[80.4199,44.165],[80.4199,44.6045],[79.9805,44.8242],[79.9805,44.9561],[81.7383,45.3955],[82.0898,45.2197],[82.5293,45.2197],[82.2656,45.6592],[83.0566,47.2412],[83.6719,47.0215],[84.7266,47.0215],[84.9023,46.8896],[85.5176,47.0654],[85.6934,47.2852],[85.5176,48.1201],[85.7813,48.4277],[86.5723,48.5596],[86.8359,48.8232],[86.748,48.9551],[86.8359,49.1309],[87.8027,49.1748],[87.8906,48.999],[87.7148,48.9111],[88.0664,48.7354],[87.9785,48.6035],[88.5059,48.3838],[88.6816,48.1641],[89.1211,47.9883],[89.5605,48.0322],[89.7363,47.8564],[90.0879,47.8564],[90.3516,47.6807],[90.5273,47.2412],[90.8789,46.9775],[91.0547,46.582],[90.8789,46.3184],[91.0547,46.0107],[90.7031,45.7471],[90.7031,45.5273],[90.8789,45.2197],[91.582,45.0879],[93.5156,44.9561],[94.7461,44.3408],[95.3613,44.2969],[95.3613,44.0332],[95.5371,43.9014],[95.8887,43.2422],[96.3281,42.9346],[96.416,42.7588]]]}},{"type":"Feature","id":"xi_zang","properties":{"name":"西藏","cp":[88.7695,31.6846],"childNum":7},"geometry":{"type":"Polygon","coordinates":[[[79.0137,34.3213],[79.1016,34.4531],[79.8047,34.4971],[79.8926,34.8047],[80.2441,35.2002],[80.332,35.1563],[80.2441,35.2881],[80.4199,35.4199],[81.6504,35.2441],[82.002,35.332],[82.4414,35.7275],[82.8809,35.6836],[83.1445,35.4199],[84.1992,35.376],[85.0781,35.7275],[85.6055,35.6836],[86.1328,35.8594],[86.2207,36.167],[87.3633,36.4307],[88.5938,36.4746],[88.7695,36.3428],[89.209,36.2988],[89.7363,36.0791],[89.3848,36.0352],[89.4727,35.9033],[89.7363,35.7715],[89.7363,35.4199],[89.4727,35.376],[89.4727,35.2441],[89.5605,34.8926],[89.8242,34.8486],[89.7363,34.6729],[89.8242,34.3652],[89.6484,34.0137],[90.0879,33.4863],[90.7031,33.1348],[91.4063,33.1348],[91.9336,32.8271],[92.1973,32.8271],[92.2852,32.7393],[92.9883,32.7393],[93.5156,32.4756],[93.7793,32.5635],[94.1309,32.4316],[94.6582,32.6074],[95.1855,32.4316],[95.0098,32.2998],[95.1855,32.3438],[95.2734,32.2119],[95.3613,32.168],[95.3613,31.9922],[95.4492,31.8164],[95.8008,31.6846],[95.9766,31.8164],[96.1523,31.5967],[96.2402,31.9482],[96.5039,31.7285],[96.8555,31.6846],[96.7676,31.9922],[97.2949,32.0801],[97.3828,32.5635],[97.7344,32.5195],[98.1738,32.3438],[98.4375,31.8604],[98.877,31.4209],[98.6133,31.2012],[98.9648,30.7617],[99.1406,29.2676],[98.9648,29.1357],[98.9648,28.8281],[98.7891,28.8721],[98.7891,29.0039],[98.7012,28.916],[98.6133,28.5205],[98.7891,28.3447],[98.7012,28.2129],[98.3496,28.125],[98.2617,28.3887],[98.1738,28.125],[97.5586,28.5205],[97.2949,28.0811],[97.3828,27.9053],[97.0313,27.7295],[96.5039,28.125],[95.7129,28.2568],[95.3613,28.125],[95.2734,27.9492],[94.2188,27.5537],[93.8672,27.0264],[93.6035,26.9385],[92.1094,26.8506],[92.0215,27.4658],[91.582,27.5537],[91.582,27.9053],[91.4063,28.0371],[91.0547,27.8613],[90.7031,28.0811],[89.8242,28.2129],[89.6484,28.1689],[89.1211,27.5977],[89.1211,27.334],[89.0332,27.2021],[88.7695,27.4219],[88.8574,27.9932],[88.6816,28.125],[88.1543,27.9053],[87.8906,27.9492],[87.7148,27.8174],[87.0996,27.8174],[86.748,28.125],[86.5723,28.125],[86.4844,27.9053],[86.1328,28.125],[86.0449,27.9053],[85.6934,28.3447],[85.6055,28.2568],[85.166,28.3447],[85.166,28.6523],[84.9023,28.5645],[84.4629,28.7402],[84.2871,28.8721],[84.1992,29.2236],[84.1113,29.2676],[83.584,29.1797],[83.2324,29.5752],[82.1777,30.0586],[82.0898,30.3223],[81.3867,30.3662],[81.2109,30.0146],[81.0352,30.2344],[80.0684,30.5859],[79.7168,30.9375],[79.0137,31.0693],[78.75,31.333],[78.8379,31.5967],[78.6621,31.8164],[78.75,31.9043],[78.4863,32.124],[78.3984,32.5195],[78.75,32.6953],[78.9258,32.3438],[79.2773,32.5635],[79.1016,33.1787],[78.6621,33.6621],[78.6621,34.1016],[78.9258,34.1455],[79.0137,34.3213]]]}},{"type":"Feature","id":"nei_meng_gu","properties":{"name":"内蒙古","cp":[117.5977,44.3408],"childNum":12},"geometry":{"type":"Polygon","coordinates":[[[97.207,42.8027],[99.4922,42.583],[100.8105,42.6709],[101.7773,42.4951],[102.041,42.2314],[102.7441,42.1436],[103.3594,41.8799],[103.8867,41.792],[104.502,41.8799],[104.502,41.6602],[105.0293,41.5723],[105.7324,41.9238],[107.4023,42.4512],[109.4238,42.4512],[110.3906,42.7588],[111.0059,43.3301],[111.9727,43.6816],[111.9727,43.8135],[111.4453,44.3848],[111.7969,45],[111.9727,45.0879],[113.6426,44.7363],[114.1699,44.9561],[114.5215,45.3955],[115.6641,45.4395],[116.1914,45.7031],[116.2793,45.9668],[116.543,46.2744],[117.334,46.3623],[117.4219,46.582],[117.7734,46.5381],[118.3008,46.7578],[118.7402,46.7139],[118.916,46.7578],[119.0918,46.6699],[119.707,46.626],[119.9707,46.7139],[119.707,47.1973],[118.4766,47.9883],[117.8613,48.0322],[117.334,47.6807],[116.8066,47.9004],[116.1914,47.8564],[115.9277,47.6807],[115.5762,47.9004],[115.4883,48.1641],[115.8398,48.252],[115.8398,48.5596],[116.7188,49.834],[117.7734,49.5264],[118.5645,49.9219],[119.2676,50.0977],[119.3555,50.3174],[119.1797,50.3613],[119.5313,50.7568],[119.5313,50.8887],[119.707,51.0645],[120.1465,51.6797],[120.6738,51.9434],[120.7617,52.1191],[120.7617,52.251],[120.5859,52.3389],[120.6738,52.5146],[120.4102,52.6465],[120.0586,52.6025],[120.0586,52.7344],[120.8496,53.2617],[121.4648,53.3496],[121.8164,53.042],[121.2012,52.5586],[121.6406,52.4268],[121.7285,52.2949],[121.9922,52.2949],[122.168,52.5146],[122.6953,52.251],[122.6074,52.0752],[122.959,51.3281],[123.3105,51.2402],[123.6621,51.3721],[124.3652,51.2842],[124.541,51.3721],[124.8926,51.3721],[125.0684,51.6357],[125.332,51.6357],[126.0352,51.0205],[125.7715,50.7568],[125.7715,50.5371],[125.332,50.1416],[125.1563,49.834],[125.2441,49.1748],[124.8047,49.1309],[124.4531,48.1201],[124.2773,48.5156],[122.4316,47.373],[123.0469,46.7139],[123.3984,46.8896],[123.3984,46.9775],[123.4863,46.9775],[123.5742,46.8457],[123.5742,46.8896],[123.5742,46.6699],[123.0469,46.582],[123.2227,46.2305],[122.7832,46.0107],[122.6953,45.7031],[122.4316,45.8789],[122.2559,45.791],[121.8164,46.0107],[121.7285,45.7471],[121.9043,45.7031],[122.2559,45.2637],[122.0801,44.8682],[122.3438,44.2529],[123.1348,44.4727],[123.4863,43.7256],[123.3105,43.5059],[123.6621,43.374],[123.5742,43.0225],[123.3105,42.9785],[123.1348,42.8027],[122.7832,42.7148],[122.3438,42.8467],[122.3438,42.6709],[121.9922,42.7148],[121.7285,42.4512],[121.4648,42.4951],[120.498,42.0996],[120.1465,41.7041],[119.8828,42.1875],[119.5313,42.3633],[119.3555,42.2754],[119.2676,41.7041],[119.4434,41.6162],[119.2676,41.3086],[118.3887,41.3086],[118.125,41.748],[118.3008,41.792],[118.3008,42.0996],[118.125,42.0557],[117.9492,42.2314],[118.0371,42.4072],[117.7734,42.627],[117.5098,42.583],[117.334,42.4512],[116.8945,42.4072],[116.8066,42.0117],[116.2793,42.0117],[116.0156,41.792],[115.9277,41.9238],[115.2246,41.5723],[114.9609,41.6162],[114.873,42.0996],[114.5215,42.1436],[114.1699,41.792],[114.2578,41.5723],[113.9063,41.4404],[113.9941,41.2207],[113.9063,41.1328],[114.082,40.7373],[114.082,40.5176],[113.8184,40.5176],[113.5547,40.3418],[113.2031,40.3857],[112.7637,40.166],[112.3242,40.2539],[111.9727,39.5947],[111.4453,39.6387],[111.3574,39.4189],[111.0938,39.375],[111.0938,39.5947],[110.6543,39.2871],[110.127,39.4629],[110.2148,39.2871],[109.8633,39.2432],[109.9512,39.1553],[108.9844,38.3203],[109.0723,38.0127],[108.8965,37.9688],[108.8086,38.0127],[108.7207,37.7051],[108.1934,37.6172],[107.666,37.8809],[107.3145,38.1006],[106.7871,38.1885],[106.5234,38.3203],[106.9629,38.9795],[106.7871,39.375],[106.3477,39.2871],[105.9082,38.7158],[105.8203,37.793],[104.3262,37.4414],[103.4473,37.8369],[103.3594,38.0127],[103.5352,38.1445],[103.4473,38.3643],[104.2383,38.9795],[104.0625,39.4189],[103.3594,39.3311],[103.0078,39.1113],[102.4805,39.2432],[101.8652,39.1113],[102.041,38.8916],[101.7773,38.6719],[101.3379,38.7598],[101.25,39.0234],[100.9863,38.9355],[100.8105,39.4189],[100.5469,39.4189],[100.0195,39.7705],[99.4922,39.8584],[100.1074,40.2539],[100.1953,40.6494],[99.9316,41.001],[99.2285,40.8691],[99.0527,40.6934],[98.9648,40.7813],[98.7891,40.6055],[98.5254,40.7373],[98.6133,40.6494],[98.3496,40.5615],[98.3496,40.9131],[97.4707,41.4844],[97.8223,41.6162],[97.8223,41.748],[97.207,42.8027]]]}},{"type":"Feature","id":"qing_hai","properties":{"name":"青海","cp":[96.2402,35.4199],"childNum":8},"geometry":{"type":"Polygon","coordinates":[[[89.7363,36.0791],[89.9121,36.0791],[90,36.2549],[90.8789,36.0352],[91.0547,36.0791],[91.0547,36.5186],[90.791,36.6064],[90.7031,36.7822],[91.3184,37.0898],[91.0547,37.4414],[90.5273,37.8369],[90.6152,38.3203],[90.3516,38.2324],[90.1758,38.4961],[92.373,39.0234],[92.373,39.1113],[93.1641,39.1992],[93.1641,38.9795],[93.6914,38.9355],[93.8672,38.7158],[94.3066,38.7598],[94.5703,38.3643],[95.0098,38.4082],[95.4492,38.2764],[95.7129,38.3643],[96.2402,38.1006],[96.416,38.2324],[96.6797,38.1885],[96.6797,38.4521],[97.1191,38.584],[97.0313,39.1992],[98.1738,38.8037],[98.3496,39.0234],[98.6133,38.9355],[98.7891,39.0674],[99.1406,38.9355],[99.8438,38.3643],[100.1953,38.2764],[100.0195,38.4521],[100.1074,38.4961],[100.459,38.2764],[100.7227,38.2324],[101.1621,37.8369],[101.5137,37.8809],[101.7773,37.6172],[101.9531,37.7051],[102.1289,37.4414],[102.5684,37.1777],[102.4805,36.958],[102.6563,36.8262],[102.5684,36.7383],[102.832,36.3428],[103.0078,36.2549],[102.9199,36.0791],[102.9199,35.9033],[102.6563,35.7715],[102.832,35.5957],[102.4805,35.5957],[102.3047,35.4199],[102.3926,35.2002],[101.9531,34.8486],[101.9531,34.6289],[102.2168,34.4092],[102.1289,34.2773],[101.6895,34.1016],[100.9863,34.3652],[100.8105,34.2773],[101.25,33.6621],[101.5137,33.7061],[101.6016,33.5303],[101.7773,33.5303],[101.6895,33.3105],[101.7773,33.2227],[101.6016,33.1348],[101.1621,33.2227],[101.25,32.6953],[100.7227,32.6514],[100.7227,32.5195],[100.3711,32.7393],[100.1074,32.6514],[100.1074,32.8711],[99.8438,33.0029],[99.7559,32.7393],[99.2285,32.915],[99.2285,33.0469],[98.877,33.1787],[98.4375,34.0576],[97.8223,34.1895],[97.6465,34.1016],[97.7344,33.9258],[97.3828,33.8818],[97.4707,33.5742],[97.7344,33.3984],[97.3828,32.8711],[97.4707,32.6953],[97.7344,32.5195],[97.3828,32.5635],[97.2949,32.0801],[96.7676,31.9922],[96.8555,31.6846],[96.5039,31.7285],[96.2402,31.9482],[96.1523,31.5967],[95.9766,31.8164],[95.8008,31.6846],[95.4492,31.8164],[95.3613,31.9922],[95.3613,32.168],[95.2734,32.2119],[95.1855,32.3438],[95.0098,32.2998],[95.1855,32.4316],[94.6582,32.6074],[94.1309,32.4316],[93.7793,32.5635],[93.5156,32.4756],[92.9883,32.7393],[92.2852,32.7393],[92.1973,32.8271],[91.9336,32.8271],[91.4063,33.1348],[90.7031,33.1348],[90.0879,33.4863],[89.6484,34.0137],[89.8242,34.3652],[89.7363,34.6729],[89.8242,34.8486],[89.5605,34.8926],[89.4727,35.2441],[89.4727,35.376],[89.7363,35.4199],[89.7363,35.7715],[89.4727,35.9033],[89.3848,36.0352],[89.7363,36.0791]]]}},{"type":"Feature","id":"si_chuan","properties":{"name":"四川","cp":[102.9199,30.1904],"childNum":21},"geometry":{"type":"Polygon","coordinates":[[[101.7773,33.5303],[101.8652,33.5742],[101.9531,33.4424],[101.8652,33.0908],[102.4805,33.4424],[102.2168,33.9258],[102.9199,34.3213],[103.0957,34.1895],[103.1836,33.7939],[104.1504,33.6182],[104.2383,33.3984],[104.4141,33.3105],[104.3262,33.2227],[104.4141,33.0469],[104.3262,32.8711],[104.4141,32.7393],[105.2051,32.6074],[105.3809,32.7393],[105.3809,32.8711],[105.4688,32.915],[105.5566,32.7393],[106.084,32.8711],[106.084,32.7393],[106.3477,32.6514],[107.0508,32.6953],[107.1387,32.4756],[107.2266,32.4316],[107.4023,32.5195],[108.0176,32.168],[108.2813,32.2559],[108.5449,32.2119],[108.3691,32.168],[108.2813,31.9043],[108.5449,31.6846],[108.1934,31.5088],[107.9297,30.8496],[107.4902,30.8496],[107.4023,30.7617],[107.4902,30.6299],[107.0508,30.0146],[106.7871,30.0146],[106.6113,30.3223],[106.2598,30.1904],[105.8203,30.4541],[105.6445,30.2783],[105.5566,30.1025],[105.7324,29.8828],[105.293,29.5313],[105.4688,29.3115],[105.7324,29.2676],[105.8203,28.96],[106.2598,28.8721],[106.3477,28.5205],[105.9961,28.7402],[105.6445,28.4326],[105.9082,28.125],[106.1719,28.125],[106.3477,27.8174],[105.6445,27.6416],[105.5566,27.7734],[105.293,27.7295],[105.2051,27.9932],[105.0293,28.0811],[104.8535,27.9053],[104.4141,27.9492],[104.3262,28.0371],[104.4141,28.125],[104.4141,28.2568],[104.2383,28.4326],[104.4141,28.6084],[103.8867,28.6523],[103.7988,28.3008],[103.4473,28.125],[103.4473,27.7734],[102.9199,27.29],[103.0078,26.3672],[102.6563,26.1914],[102.5684,26.3672],[102.1289,26.1035],[101.8652,26.0596],[101.6016,26.2354],[101.6895,26.3672],[101.4258,26.5869],[101.4258,26.8066],[101.4258,26.7188],[101.1621,27.0264],[101.1621,27.1582],[100.7227,27.8613],[100.3711,27.8174],[100.2832,27.7295],[100.0195,28.125],[100.1953,28.3447],[99.668,28.8281],[99.4043,28.5205],[99.4043,28.1689],[99.2285,28.3008],[99.1406,29.2676],[98.9648,30.7617],[98.6133,31.2012],[98.877,31.4209],[98.4375,31.8604],[98.1738,32.3438],[97.7344,32.5195],[97.4707,32.6953],[97.3828,32.8711],[97.7344,33.3984],[97.4707,33.5742],[97.3828,33.8818],[97.7344,33.9258],[97.6465,34.1016],[97.8223,34.1895],[98.4375,34.0576],[98.877,33.1787],[99.2285,33.0469],[99.2285,32.915],[99.7559,32.7393],[99.8438,33.0029],[100.1074,32.8711],[100.1074,32.6514],[100.3711,32.7393],[100.7227,32.5195],[100.7227,32.6514],[101.25,32.6953],[101.1621,33.2227],[101.6016,33.1348],[101.7773,33.2227],[101.6895,33.3105],[101.7773,33.5303]]]}},{"type":"Feature","id":"hei_long_jiang","properties":{"name":"黑龙江","cp":[128.1445,48.5156],"childNum":13},"geometry":{"type":"Polygon","coordinates":[[[121.4648,53.3496],[123.6621,53.5693],[124.8926,53.0859],[125.0684,53.2178],[125.5957,53.0859],[125.6836,52.9102],[126.123,52.7783],[126.0352,52.6025],[126.2109,52.5146],[126.3867,52.2949],[126.3867,52.207],[126.5625,52.1631],[126.4746,51.9434],[126.9141,51.3721],[126.8262,51.2842],[127.002,51.3281],[126.9141,51.1084],[127.2656,50.7568],[127.3535,50.2734],[127.6172,50.2295],[127.5293,49.8779],[127.793,49.6143],[128.7598,49.5703],[129.1113,49.3506],[129.4629,49.4385],[130.2539,48.8672],[130.6934,48.8672],[130.5176,48.6475],[130.8691,48.2959],[130.6934,48.1201],[131.0449,47.6807],[132.5391,47.7246],[132.627,47.9443],[133.0664,48.1201],[133.5059,48.1201],[134.209,48.3838],[135.0879,48.4277],[134.7363,48.252],[134.5605,47.9883],[134.7363,47.6807],[134.5605,47.4609],[134.3848,47.4609],[134.209,47.2852],[134.209,47.1533],[133.8574,46.5381],[133.9453,46.2744],[133.5059,45.835],[133.418,45.5713],[133.2422,45.5273],[133.0664,45.1318],[132.8906,45.0439],[131.9238,45.3516],[131.5723,45.0439],[131.0449,44.8682],[131.3086,44.0771],[131.2207,43.7256],[131.3086,43.4619],[130.8691,43.418],[130.5176,43.6377],[130.3418,43.9893],[129.9902,43.8574],[129.9023,44.0332],[129.8145,43.9014],[129.2871,43.8135],[129.1992,43.5938],[128.8477,43.5498],[128.4961,44.165],[128.4082,44.4727],[128.0566,44.3408],[128.0566,44.1211],[127.7051,44.1211],[127.5293,44.6045],[127.0898,44.6045],[127.002,44.7803],[127.0898,45],[126.9141,45.1318],[126.5625,45.2637],[126.0352,45.1758],[125.7715,45.3076],[125.6836,45.5273],[125.0684,45.3955],[124.8926,45.5273],[124.3652,45.4395],[124.0137,45.7471],[123.9258,46.2305],[123.2227,46.2305],[123.0469,46.582],[123.5742,46.6699],[123.5742,46.8896],[123.5742,46.8457],[123.4863,46.9775],[123.3984,46.9775],[123.3984,46.8896],[123.0469,46.7139],[122.4316,47.373],[124.2773,48.5156],[124.4531,48.1201],[124.8047,49.1309],[125.2441,49.1748],[125.1563,49.834],[125.332,50.1416],[125.7715,50.5371],[125.7715,50.7568],[126.0352,51.0205],[125.332,51.6357],[125.0684,51.6357],[124.8926,51.3721],[124.541,51.3721],[124.3652,51.2842],[123.6621,51.3721],[123.3105,51.2402],[122.959,51.3281],[122.6074,52.0752],[122.6953,52.251],[122.168,52.5146],[121.9922,52.2949],[121.7285,52.2949],[121.6406,52.4268],[121.2012,52.5586],[121.8164,53.042],[121.4648,53.3496]]]}},{"type":"Feature","id":"gan_su","properties":{"name":"甘肃","cp":[95.7129,40.166],"childNum":14},"geometry":{"type":"Polygon","coordinates":[[[96.416,42.7148],[97.207,42.8027],[97.8223,41.748],[97.8223,41.6162],[97.4707,41.4844],[98.3496,40.9131],[98.3496,40.5615],[98.6133,40.6494],[98.5254,40.7373],[98.7891,40.6055],[98.9648,40.7813],[99.0527,40.6934],[99.2285,40.8691],[99.9316,41.001],[100.1953,40.6494],[100.1074,40.2539],[99.4922,39.8584],[100.0195,39.7705],[100.5469,39.4189],[100.8105,39.4189],[100.9863,38.9355],[101.25,39.0234],[101.3379,38.7598],[101.7773,38.6719],[102.041,38.8916],[101.8652,39.1113],[102.4805,39.2432],[103.0078,39.1113],[103.3594,39.3311],[104.0625,39.4189],[104.2383,38.9795],[103.4473,38.3643],[103.5352,38.1445],[103.3594,38.0127],[103.4473,37.8369],[104.3262,37.4414],[104.5898,37.4414],[104.5898,37.2217],[104.8535,37.2217],[105.293,36.8262],[105.2051,36.6943],[105.4688,36.123],[105.293,35.9912],[105.3809,35.7715],[105.7324,35.7275],[105.8203,35.5518],[105.9961,35.4639],[105.9082,35.4199],[105.9961,35.4199],[106.084,35.376],[106.2598,35.4199],[106.3477,35.2441],[106.5234,35.332],[106.4355,35.6836],[106.6992,35.6836],[106.9629,35.8154],[106.875,36.123],[106.5234,36.2549],[106.5234,36.4746],[106.4355,36.5625],[106.6113,36.7822],[106.6113,37.0898],[107.3145,37.0898],[107.3145,36.9141],[108.7207,36.3428],[108.6328,35.9912],[108.5449,35.8594],[108.6328,35.5518],[108.5449,35.2881],[107.7539,35.2881],[107.7539,35.1123],[107.8418,35.0244],[107.666,34.9365],[107.2266,34.8926],[106.9629,35.0684],[106.6113,35.0684],[106.5234,34.7607],[106.3477,34.585],[106.6992,34.3213],[106.5234,34.2773],[106.6113,34.1455],[106.4355,33.9258],[106.5234,33.5303],[105.9961,33.6182],[105.7324,33.3984],[105.9961,33.1787],[105.9082,33.0029],[105.4688,32.915],[105.3809,32.8711],[105.3809,32.7393],[105.2051,32.6074],[104.4141,32.7393],[104.3262,32.8711],[104.4141,33.0469],[104.3262,33.2227],[104.4141,33.3105],[104.2383,33.3984],[104.1504,33.6182],[103.1836,33.7939],[103.0957,34.1895],[102.9199,34.3213],[102.2168,33.9258],[102.4805,33.4424],[101.8652,33.0908],[101.9531,33.4424],[101.8652,33.5742],[101.7773,33.5303],[101.6016,33.5303],[101.5137,33.7061],[101.25,33.6621],[100.8105,34.2773],[100.9863,34.3652],[101.6895,34.1016],[102.1289,34.2773],[102.2168,34.4092],[101.9531,34.6289],[101.9531,34.8486],[102.3926,35.2002],[102.3047,35.4199],[102.4805,35.5957],[102.832,35.5957],[102.6563,35.7715],[102.9199,35.9033],[102.9199,36.0791],[103.0078,36.2549],[102.832,36.3428],[102.5684,36.7383],[102.6563,36.8262],[102.4805,36.958],[102.5684,37.1777],[102.1289,37.4414],[101.9531,37.7051],[101.7773,37.6172],[101.5137,37.8809],[101.1621,37.8369],[100.7227,38.2324],[100.459,38.2764],[100.1074,38.4961],[100.0195,38.4521],[100.1953,38.2764],[99.8438,38.3643],[99.1406,38.9355],[98.7891,39.0674],[98.6133,38.9355],[98.3496,39.0234],[98.1738,38.8037],[97.0313,39.1992],[97.1191,38.584],[96.6797,38.4521],[96.6797,38.1885],[96.416,38.2324],[96.2402,38.1006],[95.7129,38.3643],[95.4492,38.2764],[95.0098,38.4082],[94.5703,38.3643],[94.3066,38.7598],[93.8672,38.7158],[93.6914,38.9355],[93.1641,38.9795],[93.1641,39.1992],[92.373,39.1113],[92.373,39.3311],[92.6367,39.6387],[93.0762,40.6494],[93.8672,40.6934],[94.043,41.0889],[94.5703,41.4844],[95.1855,41.792],[95.2734,41.6162],[95.9766,41.9238],[96.2402,42.2314],[96.0645,42.3193],[95.9766,42.4951],[96.416,42.7148]]]}},{"type":"Feature","id":"yun_nan","properties":{"name":"云南","cp":[101.8652,25.1807],"childNum":16},"geometry":{"type":"Polygon","coordinates":[[[98.1738,28.125],[98.2617,28.3887],[98.3496,28.125],[98.7012,28.2129],[98.7891,28.3447],[98.6133,28.5205],[98.7012,28.916],[98.7891,29.0039],[98.7891,28.8721],[98.9648,28.8281],[98.9648,29.1357],[99.1406,29.2676],[99.2285,28.3008],[99.4043,28.1689],[99.4043,28.5205],[99.668,28.8281],[100.1953,28.3447],[100.0195,28.125],[100.2832,27.7295],[100.3711,27.8174],[100.7227,27.8613],[101.1621,27.1582],[101.1621,27.0264],[101.4258,26.7188],[101.4258,26.8066],[101.4258,26.5869],[101.6895,26.3672],[101.6016,26.2354],[101.8652,26.0596],[102.1289,26.1035],[102.5684,26.3672],[102.6563,26.1914],[103.0078,26.3672],[102.9199,27.29],[103.4473,27.7734],[103.4473,28.125],[103.7988,28.3008],[103.8867,28.6523],[104.4141,28.6084],[104.2383,28.4326],[104.4141,28.2568],[104.4141,28.125],[104.3262,28.0371],[104.4141,27.9492],[104.8535,27.9053],[105.0293,28.0811],[105.2051,27.9932],[105.293,27.7295],[105.2051,27.3779],[104.5898,27.334],[104.4141,27.4658],[104.1504,27.2461],[103.8867,27.4219],[103.623,27.0264],[103.7109,26.9824],[103.7109,26.7627],[103.8867,26.543],[104.4141,26.6748],[104.6777,26.4111],[104.3262,25.708],[104.8535,25.2246],[104.5898,25.0488],[104.6777,24.9609],[104.502,24.7412],[104.6777,24.3457],[104.7656,24.4775],[105.0293,24.4336],[105.2051,24.082],[105.4688,24.0381],[105.5566,24.126],[105.9961,24.126],[106.1719,23.8184],[106.1719,23.5547],[105.6445,23.4229],[105.5566,23.2031],[105.293,23.3789],[104.8535,23.1592],[104.7656,22.8516],[104.3262,22.6758],[104.1504,22.8076],[103.9746,22.5439],[103.623,22.7637],[103.5352,22.5879],[103.3594,22.8076],[103.0957,22.4561],[102.4805,22.7637],[102.3047,22.4121],[101.8652,22.3682],[101.7773,22.5],[101.6016,22.1924],[101.8652,21.6211],[101.7773,21.1377],[101.6016,21.2256],[101.25,21.1816],[101.1621,21.7529],[100.6348,21.4453],[100.1074,21.4893],[99.9316,22.0605],[99.2285,22.1484],[99.4043,22.5879],[99.3164,22.7197],[99.4922,23.0713],[98.877,23.2031],[98.7012,23.9502],[98.877,24.126],[98.1738,24.082],[97.7344,23.8623],[97.5586,23.9063],[97.7344,24.126],[97.6465,24.4336],[97.5586,24.4336],[97.5586,24.7412],[97.7344,24.8291],[97.8223,25.2686],[98.1738,25.4004],[98.1738,25.6201],[98.3496,25.5762],[98.5254,25.8398],[98.7012,25.8838],[98.6133,26.0596],[98.7012,26.1475],[98.7891,26.5869],[98.7012,27.5098],[98.5254,27.6416],[98.3496,27.5098],[98.1738,28.125]]]}},{"type":"Feature","id":"guang_xi","properties":{"name":"广西","cp":[108.2813,23.6426],"childNum":14},"geometry":{"type":"Polygon","coordinates":[[[104.502,24.7412],[104.6777,24.6094],[105.2051,24.9609],[105.9961,24.6533],[106.1719,24.7852],[106.1719,24.9609],[106.875,25.1807],[107.0508,25.2686],[106.9629,25.4883],[107.2266,25.6201],[107.4902,25.2246],[107.7539,25.2246],[107.8418,25.1367],[108.1055,25.2246],[108.1934,25.4443],[108.3691,25.5322],[108.6328,25.3125],[108.6328,25.5762],[109.0723,25.5322],[108.9844,25.752],[109.3359,25.708],[109.5117,26.0156],[109.7754,25.8838],[109.9512,26.1914],[110.2148,25.9717],[110.5664,26.3232],[111.1816,26.3232],[111.2695,26.2354],[111.2695,25.8838],[111.4453,25.8398],[111.0059,25.0049],[111.0938,24.9609],[111.3574,25.1367],[111.5332,24.6533],[111.709,24.7852],[112.0605,24.7412],[111.8848,24.6533],[112.0605,24.3457],[111.8848,24.2139],[111.8848,23.9941],[111.7969,23.8184],[111.6211,23.8184],[111.6211,23.6865],[111.3574,23.4668],[111.4453,23.0273],[111.2695,22.8076],[110.7422,22.5439],[110.7422,22.2803],[110.6543,22.1484],[110.3027,22.1484],[110.3027,21.8848],[109.9512,21.8408],[109.8633,21.665],[109.7754,21.6211],[109.7754,21.4014],[109.5996,21.4453],[109.1602,21.3574],[109.248,20.874],[109.0723,20.9619],[109.0723,21.5332],[108.7207,21.5332],[108.6328,21.665],[108.2813,21.4893],[107.8418,21.6211],[107.4023,21.6211],[107.0508,21.7969],[107.0508,21.9287],[106.6992,22.0166],[106.6113,22.4121],[106.7871,22.7637],[106.6992,22.8955],[105.9082,22.9395],[105.5566,23.0713],[105.5566,23.2031],[105.6445,23.4229],[106.1719,23.5547],[106.1719,23.8184],[105.9961,24.126],[105.5566,24.126],[105.4688,24.0381],[105.2051,24.082],[105.0293,24.4336],[104.7656,24.4775],[104.6777,24.3457],[104.502,24.7412]]]}},{"type":"Feature","id":"hu_nan","properties":{"name":"湖南","cp":[111.5332,27.3779],"childNum":14},"geometry":{"type":"Polygon","coordinates":[[[109.248,28.4766],[109.248,29.1357],[109.5117,29.6191],[109.6875,29.6191],[109.7754,29.751],[110.4785,29.6631],[110.6543,29.751],[110.4785,30.0146],[110.8301,30.1465],[111.7969,29.9268],[112.2363,29.5313],[112.5,29.6191],[112.6758,29.5752],[112.9395,29.7949],[113.0273,29.751],[112.9395,29.4873],[113.0273,29.4434],[113.5547,29.8389],[113.5547,29.707],[113.7305,29.5752],[113.6426,29.3115],[113.7305,29.0918],[113.9063,29.0479],[114.1699,28.8281],[114.082,28.5645],[114.2578,28.3447],[113.7305,27.9492],[113.6426,27.5977],[113.6426,27.3779],[113.8184,27.29],[113.7305,27.1143],[113.9063,26.9385],[113.9063,26.6309],[114.082,26.5869],[113.9941,26.1914],[114.2578,26.1475],[113.9941,26.0596],[113.9063,25.4443],[113.6426,25.3125],[113.2031,25.5322],[112.8516,25.3564],[113.0273,25.2246],[113.0273,24.9609],[112.8516,24.917],[112.5879,25.1367],[112.2363,25.1807],[112.1484,24.873],[112.0605,24.7412],[111.709,24.7852],[111.5332,24.6533],[111.3574,25.1367],[111.0938,24.9609],[111.0059,25.0049],[111.4453,25.8398],[111.2695,25.8838],[111.2695,26.2354],[111.1816,26.3232],[110.5664,26.3232],[110.2148,25.9717],[109.9512,26.1914],[109.7754,25.8838],[109.5117,26.0156],[109.4238,26.2793],[109.248,26.3232],[109.4238,26.5869],[109.3359,26.7188],[109.5117,26.8066],[109.5117,27.0264],[109.3359,27.1582],[108.8965,27.0264],[108.8086,27.1143],[109.4238,27.5977],[109.3359,27.9053],[109.3359,28.2568],[109.248,28.4766]]]}},{"type":"Feature","id":"shan_xi_1","properties":{"name":"陕西","cp":[109.5996,35.6396],"childNum":10},"geometry":{"type":"Polygon","coordinates":[[[105.4688,32.915],[105.9082,33.0029],[105.9961,33.1787],[105.7324,33.3984],[105.9961,33.6182],[106.5234,33.5303],[106.4355,33.9258],[106.6113,34.1455],[106.5234,34.2773],[106.6992,34.3213],[106.3477,34.585],[106.5234,34.7607],[106.6113,35.0684],[106.9629,35.0684],[107.2266,34.8926],[107.666,34.9365],[107.8418,35.0244],[107.7539,35.1123],[107.7539,35.2881],[108.5449,35.2881],[108.6328,35.5518],[108.5449,35.8594],[108.6328,35.9912],[108.7207,36.3428],[107.3145,36.9141],[107.3145,37.0898],[107.3145,37.6172],[107.666,37.8809],[108.1934,37.6172],[108.7207,37.7051],[108.8086,38.0127],[108.8965,37.9688],[109.0723,38.0127],[108.9844,38.3203],[109.9512,39.1553],[109.8633,39.2432],[110.2148,39.2871],[110.127,39.4629],[110.6543,39.2871],[111.0938,39.5947],[111.0938,39.375],[111.1816,39.2432],[110.918,38.7158],[110.8301,38.4961],[110.4785,38.1885],[110.4785,37.9688],[110.8301,37.6611],[110.3906,37.002],[110.4785,36.123],[110.5664,35.6396],[110.2148,34.8926],[110.2148,34.6729],[110.3906,34.585],[110.4785,34.2334],[110.6543,34.1455],[110.6543,33.8379],[111.0059,33.5303],[111.0059,33.2666],[110.7422,33.1348],[110.5664,33.2666],[110.3027,33.1787],[109.5996,33.2666],[109.4238,33.1348],[109.7754,33.0469],[109.7754,32.915],[110.127,32.7393],[110.127,32.6074],[109.6875,32.6074],[109.5117,32.4316],[109.5996,31.7285],[109.248,31.7285],[109.0723,31.9482],[108.5449,32.2119],[108.2813,32.2559],[108.0176,32.168],[107.4023,32.5195],[107.2266,32.4316],[107.1387,32.4756],[107.0508,32.6953],[106.3477,32.6514],[106.084,32.7393],[106.084,32.8711],[105.5566,32.7393],[105.4688,32.915]]]}},{"type":"Feature","id":"guang_dong","properties":{"name":"广东","cp":[113.4668,22.8076],"childNum":21},"geometry":{"type":"Polygon","coordinates":[[[109.7754,21.4014],[109.7754,21.6211],[109.8633,21.665],[109.9512,21.8408],[110.3027,21.8848],[110.3027,22.1484],[110.6543,22.1484],[110.7422,22.2803],[110.7422,22.5439],[111.2695,22.8076],[111.4453,23.0273],[111.3574,23.4668],[111.6211,23.6865],[111.6211,23.8184],[111.7969,23.8184],[111.8848,23.9941],[111.8848,24.2139],[112.0605,24.3457],[111.8848,24.6533],[112.0605,24.7412],[112.1484,24.873],[112.2363,25.1807],[112.5879,25.1367],[112.8516,24.917],[113.0273,24.9609],[113.0273,25.2246],[112.8516,25.3564],[113.2031,25.5322],[113.6426,25.3125],[113.9063,25.4443],[113.9941,25.2686],[114.6094,25.4004],[114.7852,25.2686],[114.6973,25.1367],[114.4336,24.9609],[114.1699,24.6973],[114.4336,24.5215],[115.4004,24.7852],[115.8398,24.5654],[115.752,24.7852],[115.9277,24.917],[116.2793,24.7852],[116.3672,24.873],[116.543,24.6094],[116.7188,24.6533],[116.9824,24.1699],[116.9824,23.9063],[117.1582,23.5547],[117.334,23.2471],[116.8945,23.3789],[116.6309,23.1152],[116.543,22.8516],[115.9277,22.7197],[115.6641,22.7637],[115.5762,22.6318],[115.0488,22.6758],[114.6094,22.3682],[114.3457,22.5439],[113.9941,22.5],[113.8184,22.1924],[114.3457,22.1484],[114.4336,22.0166],[114.082,21.9287],[113.9941,21.7969],[113.5547,22.0166],[113.1152,21.8408],[112.9395,21.5771],[112.4121,21.4453],[112.2363,21.5332],[111.5332,21.4893],[111.2695,21.3574],[110.7422,21.3574],[110.6543,21.2256],[110.7422,20.918],[110.4785,20.874],[110.6543,20.2588],[110.5664,20.2588],[110.3906,20.127],[110.0391,20.127],[109.8633,20.127],[109.8633,20.3027],[109.5996,20.918],[109.7754,21.4014],[109.7754,21.4014]],[[113.5986,22.1649],[113.6096,22.1265],[113.5547,22.11],[113.5437,22.2034],[113.5767,22.2034],[113.5986,22.1649]]]}},{"type":"Feature","id":"ji_lin","properties":{"name":"吉林","cp":[126.4746,43.5938],"childNum":9},"geometry":{"type":"Polygon","coordinates":[[[123.2227,46.2305],[123.9258,46.2305],[124.0137,45.7471],[124.3652,45.4395],[124.8926,45.5273],[125.0684,45.3955],[125.6836,45.5273],[125.7715,45.3076],[126.0352,45.1758],[126.5625,45.2637],[126.9141,45.1318],[127.0898,45],[127.002,44.7803],[127.0898,44.6045],[127.5293,44.6045],[127.7051,44.1211],[128.0566,44.1211],[128.0566,44.3408],[128.4082,44.4727],[128.4961,44.165],[128.8477,43.5498],[129.1992,43.5938],[129.2871,43.8135],[129.8145,43.9014],[129.9023,44.0332],[129.9902,43.8574],[130.3418,43.9893],[130.5176,43.6377],[130.8691,43.418],[131.3086,43.4619],[131.3086,43.3301],[131.1328,42.9346],[130.4297,42.7148],[130.6055,42.6709],[130.6055,42.4512],[130.2539,42.7588],[130.2539,42.8906],[130.166,42.9785],[129.9023,43.0225],[129.7266,42.4951],[129.375,42.4512],[128.9355,42.0117],[128.0566,42.0117],[128.3203,41.5723],[128.1445,41.3525],[127.0898,41.5283],[127.1777,41.5723],[126.9141,41.792],[126.6504,41.6602],[126.4746,41.3965],[126.123,40.957],[125.6836,40.8691],[125.5957,40.9131],[125.7715,41.2207],[125.332,41.6602],[125.332,41.9678],[125.4199,42.0996],[125.332,42.1436],[124.8926,42.8027],[124.8926,43.0664],[124.7168,43.0664],[124.4531,42.8467],[124.2773,43.2422],[123.8379,43.4619],[123.6621,43.374],[123.3105,43.5059],[123.4863,43.7256],[123.1348,44.4727],[122.3438,44.2529],[122.0801,44.8682],[122.2559,45.2637],[121.9043,45.7031],[121.7285,45.7471],[121.8164,46.0107],[122.2559,45.791],[122.4316,45.8789],[122.6953,45.7031],[122.7832,46.0107],[123.2227,46.2305]]]}},{"type":"Feature","id":"he_bei","properties":{"name":"河北","cp":[115.4004,37.9688],"childNum":11},"geometry":{"type":"MultiPolygon","coordinates":[[[[114.5215,39.5068],[114.3457,39.8584],[113.9941,39.9902],[114.5215,40.3418],[114.3457,40.3857],[114.2578,40.6055],[114.082,40.7373],[113.9063,41.1328],[113.9941,41.2207],[113.9063,41.4404],[114.2578,41.5723],[114.1699,41.792],[114.5215,42.1436],[114.873,42.0996],[114.9609,41.6162],[115.2246,41.5723],[115.9277,41.9238],[116.0156,41.792],[116.2793,42.0117],[116.8066,42.0117],[116.8945,42.4072],[117.334,42.4512],[117.5098,42.583],[117.7734,42.627],[118.0371,42.4072],[117.9492,42.2314],[118.125,42.0557],[118.3008,42.0996],[118.3008,41.792],[118.125,41.748],[118.3887,41.3086],[119.2676,41.3086],[118.8281,40.8252],[119.2676,40.5176],[119.5313,40.5615],[119.707,40.1221],[119.8828,39.9463],[119.5313,39.6826],[119.4434,39.4189],[118.916,39.0674],[118.4766,38.9355],[118.125,39.0234],[118.0371,39.1992],[118.0371,39.2432],[117.8613,39.4189],[117.9492,39.5947],[117.6855,39.5947],[117.5098,39.7705],[117.5098,39.9902],[117.6855,39.9902],[117.6855,40.0781],[117.4219,40.21],[117.2461,40.5176],[117.4219,40.6494],[116.9824,40.6934],[116.6309,41.0449],[116.3672,40.9131],[116.4551,40.7813],[116.1914,40.7813],[116.1035,40.6055],[115.752,40.5615],[115.9277,40.2539],[115.4004,39.9463],[115.4883,39.6387],[115.752,39.5068],[116.1914,39.5947],[116.3672,39.4629],[116.543,39.5947],[116.8066,39.5947],[116.8945,39.1113],[116.7188,38.9355],[116.7188,38.8037],[117.2461,38.54],[117.5977,38.6279],[117.9492,38.3203],[117.4219,37.8369],[116.8066,37.8369],[116.4551,37.4854],[116.2793,37.5732],[116.2793,37.3535],[116.0156,37.3535],[115.752,36.9141],[115.3125,36.5186],[115.4883,36.167],[115.3125,36.0791],[115.1367,36.2109],[114.9609,36.0791],[114.873,36.123],[113.7305,36.3428],[113.4668,36.6504],[113.7305,36.8701],[113.7305,37.1338],[114.1699,37.6611],[113.9941,37.7051],[113.8184,38.1445],[113.5547,38.2764],[113.5547,38.54],[113.8184,38.8037],[113.8184,38.9355],[113.9063,39.0234],[114.3457,39.0674],[114.5215,39.5068]]],[[[117.2461,40.0781],[117.1582,39.8145],[117.1582,39.6387],[116.8945,39.6826],[116.8945,39.8145],[116.8066,39.9902],[117.2461,40.0781]]]]}},{"type":"Feature","id":"hu_bei","properties":{"name":"湖北","cp":[112.2363,31.1572],"childNum":17},"geometry":{"type":"Polygon","coordinates":[[[110.2148,31.1572],[110.127,31.377],[109.6875,31.5527],[109.7754,31.6846],[109.5996,31.7285],[109.5117,32.4316],[109.6875,32.6074],[110.127,32.6074],[110.127,32.7393],[109.7754,32.915],[109.7754,33.0469],[109.4238,33.1348],[109.5996,33.2666],[110.3027,33.1787],[110.5664,33.2666],[110.7422,33.1348],[111.0059,33.2666],[111.5332,32.6074],[112.3242,32.3438],[113.2031,32.4316],[113.4668,32.2998],[113.7305,32.4316],[113.8184,31.8604],[113.9941,31.7725],[114.1699,31.8604],[114.5215,31.7725],[114.6094,31.5527],[114.7852,31.4648],[115.1367,31.5967],[115.2246,31.4209],[115.4004,31.4209],[115.5762,31.2012],[116.0156,31.0254],[115.752,30.6738],[116.1035,30.1904],[116.1035,29.8389],[115.9277,29.707],[115.4883,29.7949],[114.873,29.3994],[114.2578,29.3555],[113.9063,29.0479],[113.7305,29.0918],[113.6426,29.3115],[113.7305,29.5752],[113.5547,29.707],[113.5547,29.8389],[113.0273,29.4434],[112.9395,29.4873],[113.0273,29.751],[112.9395,29.7949],[112.6758,29.5752],[112.5,29.6191],[112.2363,29.5313],[111.7969,29.9268],[110.8301,30.1465],[110.4785,30.0146],[110.6543,29.751],[110.4785,29.6631],[109.7754,29.751],[109.6875,29.6191],[109.5117,29.6191],[109.248,29.1357],[109.0723,29.3555],[108.9844,29.3115],[108.6328,29.8389],[108.457,29.7949],[108.5449,30.2344],[108.457,30.4102],[108.6328,30.5859],[108.8086,30.498],[109.0723,30.6299],[109.1602,30.542],[109.248,30.6299],[109.4238,30.542],[109.8633,30.8936],[110.0391,30.8057],[110.2148,31.1572]]]}},{"type":"Feature","id":"gui_zhou","properties":{"name":"贵州","cp":[106.6113,26.9385],"childNum":9},"geometry":{"type":"Polygon","coordinates":[[[104.1504,27.2461],[104.4141,27.4658],[104.5898,27.334],[105.2051,27.3779],[105.293,27.7295],[105.5566,27.7734],[105.6445,27.6416],[106.3477,27.8174],[106.1719,28.125],[105.9082,28.125],[105.6445,28.4326],[105.9961,28.7402],[106.3477,28.5205],[106.5234,28.5645],[106.4355,28.7842],[106.5234,28.7842],[106.6113,28.6523],[106.6113,28.5205],[106.6992,28.4766],[106.875,28.7842],[107.4023,28.8721],[107.4023,29.1797],[107.5781,29.2236],[107.8418,29.1357],[107.8418,29.0039],[108.2813,29.0918],[108.3691,28.6523],[108.5449,28.6523],[108.5449,28.3887],[108.7207,28.4766],[108.7207,28.2129],[109.0723,28.2129],[109.248,28.4766],[109.3359,28.2568],[109.3359,27.9053],[109.4238,27.5977],[108.8086,27.1143],[108.8965,27.0264],[109.3359,27.1582],[109.5117,27.0264],[109.5117,26.8066],[109.3359,26.7188],[109.4238,26.5869],[109.248,26.3232],[109.4238,26.2793],[109.5117,26.0156],[109.3359,25.708],[108.9844,25.752],[109.0723,25.5322],[108.6328,25.5762],[108.6328,25.3125],[108.3691,25.5322],[108.1934,25.4443],[108.1055,25.2246],[107.8418,25.1367],[107.7539,25.2246],[107.4902,25.2246],[107.2266,25.6201],[106.9629,25.4883],[107.0508,25.2686],[106.875,25.1807],[106.1719,24.9609],[106.1719,24.7852],[105.9961,24.6533],[105.2051,24.9609],[104.6777,24.6094],[104.502,24.7412],[104.6777,24.9609],[104.5898,25.0488],[104.8535,25.2246],[104.3262,25.708],[104.6777,26.4111],[104.4141,26.6748],[103.8867,26.543],[103.7109,26.7627],[103.7109,26.9824],[103.623,27.0264],[103.8867,27.4219],[104.1504,27.2461]]]}},{"type":"Feature","id":"shan_dong","properties":{"name":"山东","cp":[118.7402,36.4307],"childNum":17},"geometry":{"type":"Polygon","coordinates":[[[115.4883,36.167],[115.3125,36.5186],[115.752,36.9141],[116.0156,37.3535],[116.2793,37.3535],[116.2793,37.5732],[116.4551,37.4854],[116.8066,37.8369],[117.4219,37.8369],[117.9492,38.3203],[118.125,38.1445],[118.916,38.1445],[119.3555,37.6611],[119.0039,37.5293],[119.0039,37.3535],[119.3555,37.1338],[119.707,37.1338],[119.8828,37.3975],[120.498,37.8369],[120.5859,38.1445],[120.9375,38.4521],[121.0254,37.8369],[121.2012,37.6611],[121.9043,37.4854],[122.168,37.6172],[122.2559,37.4854],[122.6074,37.4854],[122.6953,37.3535],[122.6074,36.9141],[122.4316,36.7822],[121.8164,36.8701],[121.7285,36.6943],[121.1133,36.6064],[121.1133,36.4307],[121.377,36.2549],[120.7617,36.167],[120.9375,35.8594],[120.6738,36.0352],[119.707,35.4639],[119.9707,34.9805],[119.3555,35.0244],[119.2676,35.1123],[118.916,35.0244],[118.7402,34.7168],[118.4766,34.6729],[118.3887,34.4092],[118.2129,34.4092],[118.125,34.6289],[117.9492,34.6729],[117.5977,34.4531],[117.334,34.585],[117.2461,34.4531],[116.8066,34.9365],[116.4551,34.8926],[116.3672,34.6289],[116.1914,34.585],[115.5762,34.585],[115.4004,34.8486],[114.7852,35.0684],[115.0488,35.376],[115.2246,35.4199],[115.4883,35.7275],[116.1035,36.0791],[115.3125,35.8154],[115.4883,36.167]]]}},{"type":"Feature","id":"jiang_xi","properties":{"name":"江西","cp":[116.0156,27.29],"childNum":11},"geometry":{"type":"Polygon","coordinates":[[[114.2578,28.3447],[114.082,28.5645],[114.1699,28.8281],[113.9063,29.0479],[114.2578,29.3555],[114.873,29.3994],[115.4883,29.7949],[115.9277,29.707],[116.1035,29.8389],[116.2793,29.7949],[116.7188,30.0586],[116.8945,29.9268],[116.7188,29.751],[116.7188,29.6191],[117.1582,29.707],[117.0703,29.8389],[117.1582,29.9268],[117.5098,29.6191],[118.0371,29.5752],[118.2129,29.3994],[118.0371,29.1797],[118.0371,29.0479],[118.3887,28.7842],[118.4766,28.3447],[118.4766,28.3008],[118.3008,28.0811],[117.7734,27.8174],[117.5098,27.9932],[116.9824,27.6416],[117.1582,27.29],[117.0703,27.1143],[116.543,26.8066],[116.6309,26.4551],[116.3672,26.2354],[116.4551,26.1035],[116.1914,25.8838],[116.0156,25.2686],[115.8398,25.2246],[115.9277,24.917],[115.752,24.7852],[115.8398,24.5654],[115.4004,24.7852],[114.4336,24.5215],[114.1699,24.6973],[114.4336,24.9609],[114.6973,25.1367],[114.7852,25.2686],[114.6094,25.4004],[113.9941,25.2686],[113.9063,25.4443],[113.9941,26.0596],[114.2578,26.1475],[113.9941,26.1914],[114.082,26.5869],[113.9063,26.6309],[113.9063,26.9385],[113.7305,27.1143],[113.8184,27.29],[113.6426,27.3779],[113.6426,27.5977],[113.7305,27.9492],[114.2578,28.3447]]]}},{"type":"Feature","id":"he_nan","properties":{"name":"河南","cp":[113.4668,33.8818],"childNum":17},"geometry":{"type":"Polygon","coordinates":[[[110.3906,34.585],[110.8301,34.6289],[111.1816,34.8047],[111.5332,34.8486],[111.7969,35.0684],[112.0605,35.0684],[112.0605,35.2881],[112.7637,35.2002],[113.1152,35.332],[113.6426,35.6836],[113.7305,36.3428],[114.873,36.123],[114.9609,36.0791],[115.1367,36.2109],[115.3125,36.0791],[115.4883,36.167],[115.3125,35.8154],[116.1035,36.0791],[115.4883,35.7275],[115.2246,35.4199],[115.0488,35.376],[114.7852,35.0684],[115.4004,34.8486],[115.5762,34.585],[116.1914,34.585],[116.1914,34.4092],[116.543,34.2773],[116.6309,33.9258],[116.1914,33.7061],[116.0156,33.9697],[115.6641,34.0576],[115.5762,33.9258],[115.5762,33.6621],[115.4004,33.5303],[115.3125,33.1787],[114.873,33.1348],[114.873,33.0029],[115.1367,32.8711],[115.2246,32.6074],[115.5762,32.4316],[115.8398,32.5195],[115.9277,31.7725],[115.4883,31.6846],[115.4004,31.4209],[115.2246,31.4209],[115.1367,31.5967],[114.7852,31.4648],[114.6094,31.5527],[114.5215,31.7725],[114.1699,31.8604],[113.9941,31.7725],[113.8184,31.8604],[113.7305,32.4316],[113.4668,32.2998],[113.2031,32.4316],[112.3242,32.3438],[111.5332,32.6074],[111.0059,33.2666],[111.0059,33.5303],[110.6543,33.8379],[110.6543,34.1455],[110.4785,34.2334],[110.3906,34.585]]]}},{"type":"Feature","id":"liao_ning","properties":{"name":"辽宁","cp":[122.3438,41.0889],"childNum":14},"geometry":{"type":"Polygon","coordinates":[[[119.2676,41.3086],[119.4434,41.6162],[119.2676,41.7041],[119.3555,42.2754],[119.5313,42.3633],[119.8828,42.1875],[120.1465,41.7041],[120.498,42.0996],[121.4648,42.4951],[121.7285,42.4512],[121.9922,42.7148],[122.3438,42.6709],[122.3438,42.8467],[122.7832,42.7148],[123.1348,42.8027],[123.3105,42.9785],[123.5742,43.0225],[123.6621,43.374],[123.8379,43.4619],[124.2773,43.2422],[124.4531,42.8467],[124.7168,43.0664],[124.8926,43.0664],[124.8926,42.8027],[125.332,42.1436],[125.4199,42.0996],[125.332,41.9678],[125.332,41.6602],[125.7715,41.2207],[125.5957,40.9131],[125.6836,40.8691],[124.541,40.21],[124.1016,39.6826],[123.3984,39.6826],[123.1348,39.4189],[123.1348,39.0234],[122.0801,39.0234],[121.5527,38.7158],[121.1133,38.6719],[120.9375,38.9795],[121.377,39.1992],[121.2012,39.5508],[122.0801,40.3857],[121.9922,40.6934],[121.7285,40.8252],[121.2012,40.8252],[120.5859,40.21],[119.8828,39.9463],[119.707,40.1221],[119.5313,40.5615],[119.2676,40.5176],[118.8281,40.8252],[119.2676,41.3086]]]}},{"type":"Feature","id":"shan_xi_2","properties":{"name":"山西","cp":[112.4121,37.6611],"childNum":11},"geometry":{"type":"Polygon","coordinates":[[[110.918,38.7158],[111.1816,39.2432],[111.0938,39.375],[111.3574,39.4189],[111.4453,39.6387],[111.9727,39.5947],[112.3242,40.2539],[112.7637,40.166],[113.2031,40.3857],[113.5547,40.3418],[113.8184,40.5176],[114.082,40.5176],[114.082,40.7373],[114.2578,40.6055],[114.3457,40.3857],[114.5215,40.3418],[113.9941,39.9902],[114.3457,39.8584],[114.5215,39.5068],[114.3457,39.0674],[113.9063,39.0234],[113.8184,38.9355],[113.8184,38.8037],[113.5547,38.54],[113.5547,38.2764],[113.8184,38.1445],[113.9941,37.7051],[114.1699,37.6611],[113.7305,37.1338],[113.7305,36.8701],[113.4668,36.6504],[113.7305,36.3428],[113.6426,35.6836],[113.1152,35.332],[112.7637,35.2002],[112.0605,35.2881],[112.0605,35.0684],[111.7969,35.0684],[111.5332,34.8486],[111.1816,34.8047],[110.8301,34.6289],[110.3906,34.585],[110.2148,34.6729],[110.2148,34.8926],[110.5664,35.6396],[110.4785,36.123],[110.3906,37.002],[110.8301,37.6611],[110.4785,37.9688],[110.4785,38.1885],[110.8301,38.4961],[110.918,38.7158]]]}},{"type":"Feature","id":"an_hui","properties":{"name":"安徽","cp":[117.2461,32.0361],"childNum":17},"geometry":{"type":"Polygon","coordinates":[[[116.6309,33.9258],[116.543,34.2773],[116.1914,34.4092],[116.1914,34.585],[116.3672,34.6289],[116.8945,34.4092],[117.1582,34.0576],[117.5977,34.0137],[117.7734,33.7061],[118.125,33.75],[117.9492,33.2227],[118.0371,33.1348],[118.2129,33.2227],[118.3008,32.7832],[118.7402,32.7393],[118.916,32.959],[119.1797,32.8271],[119.1797,32.4756],[118.5645,32.5635],[118.6523,32.2119],[118.4766,32.168],[118.3887,31.9482],[118.916,31.5527],[118.7402,31.377],[118.8281,31.2451],[119.3555,31.2891],[119.4434,31.1572],[119.6191,31.1133],[119.6191,31.0693],[119.4434,30.6738],[119.2676,30.6299],[119.3555,30.4102],[118.916,30.3223],[118.916,29.9707],[118.7402,29.707],[118.2129,29.3994],[118.0371,29.5752],[117.5098,29.6191],[117.1582,29.9268],[117.0703,29.8389],[117.1582,29.707],[116.7188,29.6191],[116.7188,29.751],[116.8945,29.9268],[116.7188,30.0586],[116.2793,29.7949],[116.1035,29.8389],[116.1035,30.1904],[115.752,30.6738],[116.0156,31.0254],[115.5762,31.2012],[115.4004,31.4209],[115.4883,31.6846],[115.9277,31.7725],[115.8398,32.5195],[115.5762,32.4316],[115.2246,32.6074],[115.1367,32.8711],[114.873,33.0029],[114.873,33.1348],[115.3125,33.1787],[115.4004,33.5303],[115.5762,33.6621],[115.5762,33.9258],[115.6641,34.0576],[116.0156,33.9697],[116.1914,33.7061],[116.6309,33.9258]]]}},{"type":"Feature","id":"fu_jian","properties":{"name":"福建","cp":[118.3008,25.9277],"childNum":9},"geometry":{"type":"Polygon","coordinates":[[[118.4766,28.3008],[118.8281,28.2568],[118.7402,28.0371],[118.916,27.4658],[119.2676,27.4219],[119.6191,27.6855],[119.7949,27.29],[120.2344,27.4219],[120.4102,27.1582],[120.7617,27.0264],[120.6738,26.8945],[120.2344,26.8506],[120.2344,26.7188],[120.4102,26.6748],[120.498,26.3672],[120.2344,26.2793],[120.4102,26.1475],[120.0586,26.1914],[119.9707,25.9277],[119.7949,25.9277],[119.9707,25.4004],[119.7949,25.2686],[119.5313,25.1367],[119.4434,25.0049],[119.2676,25.0928],[118.916,24.8291],[118.6523,24.5215],[118.4766,24.5215],[118.4766,24.4336],[118.2129,24.3457],[118.2129,24.1699],[117.8613,23.9941],[117.7734,23.7744],[117.5098,23.5986],[117.1582,23.5547],[116.9824,23.9063],[116.9824,24.1699],[116.7188,24.6533],[116.543,24.6094],[116.3672,24.873],[116.2793,24.7852],[115.9277,24.917],[115.8398,25.2246],[116.0156,25.2686],[116.1914,25.8838],[116.4551,26.1035],[116.3672,26.2354],[116.6309,26.4551],[116.543,26.8066],[117.0703,27.1143],[117.1582,27.29],[116.9824,27.6416],[117.5098,27.9932],[117.7734,27.8174],[118.3008,28.0811],[118.4766,28.3008]]]}},{"type":"Feature","id":"zhe_jiang","properties":{"name":"浙江","cp":[120.498,29.0918],"childNum":11},"geometry":{"type":"Polygon","coordinates":[[[118.2129,29.3994],[118.7402,29.707],[118.916,29.9707],[118.916,30.3223],[119.3555,30.4102],[119.2676,30.6299],[119.4434,30.6738],[119.6191,31.0693],[119.6191,31.1133],[119.9707,31.1572],[120.498,30.8057],[120.9375,31.0254],[121.2891,30.6738],[121.9922,30.8057],[122.6953,30.8936],[122.8711,30.7178],[122.959,30.1465],[122.6074,30.1025],[122.6074,29.9268],[122.168,29.5313],[122.3438,28.8721],[121.9922,28.8721],[121.9922,28.4326],[121.7285,28.3447],[121.7285,28.2129],[121.4648,28.2129],[121.5527,28.0371],[121.2891,27.9492],[121.1133,27.4219],[120.6738,27.334],[120.6738,27.1582],[120.9375,27.0264],[120.7617,27.0264],[120.4102,27.1582],[120.2344,27.4219],[119.7949,27.29],[119.6191,27.6855],[119.2676,27.4219],[118.916,27.4658],[118.7402,28.0371],[118.8281,28.2568],[118.4766,28.3008],[118.4766,28.3447],[118.3887,28.7842],[118.0371,29.0479],[118.0371,29.1797],[118.2129,29.3994]]]}},{"type":"Feature","id":"jiang_su","properties":{"name":"江苏","cp":[120.0586,32.915],"childNum":13},"geometry":{"type":"Polygon","coordinates":[[[116.3672,34.6289],[116.4551,34.8926],[116.8066,34.9365],[117.2461,34.4531],[117.334,34.585],[117.5977,34.4531],[117.9492,34.6729],[118.125,34.6289],[118.2129,34.4092],[118.3887,34.4092],[118.4766,34.6729],[118.7402,34.7168],[118.916,35.0244],[119.2676,35.1123],[119.3555,35.0244],[119.3555,34.8486],[119.707,34.585],[120.3223,34.3652],[120.9375,33.0469],[121.0254,32.6514],[121.377,32.4756],[121.4648,32.168],[121.9043,31.9922],[121.9922,31.6846],[121.9922,31.5967],[121.2012,31.8604],[121.1133,31.7285],[121.377,31.5088],[121.2012,31.4648],[120.9375,31.0254],[120.498,30.8057],[119.9707,31.1572],[119.6191,31.1133],[119.4434,31.1572],[119.3555,31.2891],[118.8281,31.2451],[118.7402,31.377],[118.916,31.5527],[118.3887,31.9482],[118.4766,32.168],[118.6523,32.2119],[118.5645,32.5635],[119.1797,32.4756],[119.1797,32.8271],[118.916,32.959],[118.7402,32.7393],[118.3008,32.7832],[118.2129,33.2227],[118.0371,33.1348],[117.9492,33.2227],[118.125,33.75],[117.7734,33.7061],[117.5977,34.0137],[117.1582,34.0576],[116.8945,34.4092],[116.3672,34.6289]]]}},{"type":"Feature","id":"chong_qing","properties":{"name":"重庆","cp":[107.7539,30.1904],"childNum":40},"geometry":{"type":"Polygon","coordinates":[[[108.5449,31.6846],[108.2813,31.9043],[108.3691,32.168],[108.5449,32.2119],[109.0723,31.9482],[109.248,31.7285],[109.5996,31.7285],[109.7754,31.6846],[109.6875,31.5527],[110.127,31.377],[110.2148,31.1572],[110.0391,30.8057],[109.8633,30.8936],[109.4238,30.542],[109.248,30.6299],[109.1602,30.542],[109.0723,30.6299],[108.8086,30.498],[108.6328,30.5859],[108.457,30.4102],[108.5449,30.2344],[108.457,29.7949],[108.6328,29.8389],[108.9844,29.3115],[109.0723,29.3555],[109.248,29.1357],[109.248,28.4766],[109.0723,28.2129],[108.7207,28.2129],[108.7207,28.4766],[108.5449,28.3887],[108.5449,28.6523],[108.3691,28.6523],[108.2813,29.0918],[107.8418,29.0039],[107.8418,29.1357],[107.5781,29.2236],[107.4023,29.1797],[107.4023,28.8721],[106.875,28.7842],[106.6992,28.4766],[106.6113,28.5205],[106.6113,28.6523],[106.5234,28.7842],[106.4355,28.7842],[106.5234,28.5645],[106.3477,28.5205],[106.2598,28.8721],[105.8203,28.96],[105.7324,29.2676],[105.4688,29.3115],[105.293,29.5313],[105.7324,29.8828],[105.5566,30.1025],[105.6445,30.2783],[105.8203,30.4541],[106.2598,30.1904],[106.6113,30.3223],[106.7871,30.0146],[107.0508,30.0146],[107.4902,30.6299],[107.4023,30.7617],[107.4902,30.8496],[107.9297,30.8496],[108.1934,31.5088],[108.5449,31.6846]]]}},{"type":"Feature","id":"ning_xia","properties":{"name":"宁夏","cp":[105.9961,37.3096],"childNum":5},"geometry":{"type":"Polygon","coordinates":[[[104.3262,37.4414],[105.8203,37.793],[105.9082,38.7158],[106.3477,39.2871],[106.7871,39.375],[106.9629,38.9795],[106.5234,38.3203],[106.7871,38.1885],[107.3145,38.1006],[107.666,37.8809],[107.3145,37.6172],[107.3145,37.0898],[106.6113,37.0898],[106.6113,36.7822],[106.4355,36.5625],[106.5234,36.4746],[106.5234,36.2549],[106.875,36.123],[106.9629,35.8154],[106.6992,35.6836],[106.4355,35.6836],[106.5234,35.332],[106.3477,35.2441],[106.2598,35.4199],[106.084,35.376],[105.9961,35.4199],[106.084,35.4639],[105.9961,35.4639],[105.8203,35.5518],[105.7324,35.7275],[105.3809,35.7715],[105.293,35.9912],[105.4688,36.123],[105.2051,36.6943],[105.293,36.8262],[104.8535,37.2217],[104.5898,37.2217],[104.5898,37.4414],[104.3262,37.4414]]]}},{"type":"Feature","id":"hai_nan","properties":{"name":"海南","cp":[109.9512,19.2041],"childNum":18},"geometry":{"type":"Polygon","coordinates":[[[108.6328,19.3799],[109.0723,19.6436],[109.248,19.9512],[109.5996,20.0391],[110.0391,20.127],[110.3906,20.127],[110.5664,20.2588],[110.6543,20.2588],[111.0938,19.9512],[111.2695,19.9951],[110.6543,19.1602],[110.5664,18.6768],[110.2148,18.5889],[110.0391,18.3691],[109.8633,18.3691],[109.6875,18.1055],[108.9844,18.2813],[108.6328,18.457],[108.6328,19.3799]]]}},{"type":"Feature","id":"tai_wan","properties":{"name":"台湾","cp":[121.0254,23.5986],"childNum":1},"geometry":{"type":"Polygon","coordinates":[[[121.9043,25.0488],[121.9922,25.0049],[121.8164,24.7412],[121.9043,24.5654],[121.6406,24.0381],[121.377,23.1152],[121.0254,22.6758],[120.8496,22.0605],[120.7617,21.9287],[120.6738,22.3242],[120.2344,22.5879],[120.0586,23.0713],[120.1465,23.6865],[121.0254,25.0488],[121.5527,25.3125],[121.9043,25.0488]]]}},{"type":"Feature","id":"bei_jing","properties":{"name":"北京","cp":[116.4551,40.2539],"childNum":19},"geometry":{"type":"Polygon","coordinates":[[[117.4219,40.21],[117.334,40.1221],[117.2461,40.0781],[116.8066,39.9902],[116.8945,39.8145],[116.8945,39.6826],[116.8066,39.5947],[116.543,39.5947],[116.3672,39.4629],[116.1914,39.5947],[115.752,39.5068],[115.4883,39.6387],[115.4004,39.9463],[115.9277,40.2539],[115.752,40.5615],[116.1035,40.6055],[116.1914,40.7813],[116.4551,40.7813],[116.3672,40.9131],[116.6309,41.0449],[116.9824,40.6934],[117.4219,40.6494],[117.2461,40.5176],[117.4219,40.21]]]}},{"type":"Feature","id":"tian_jin","properties":{"name":"天津","cp":[117.4219,39.4189],"childNum":18},"geometry":{"type":"Polygon","coordinates":[[[116.8066,39.5947],[116.8945,39.6826],[117.1582,39.6387],[117.1582,39.8145],[117.2461,40.0781],[117.334,40.1221],[117.4219,40.21],[117.6855,40.0781],[117.6855,39.9902],[117.5098,39.9902],[117.5098,39.7705],[117.6855,39.5947],[117.9492,39.5947],[117.8613,39.4189],[118.0371,39.2432],[118.0371,39.1992],[117.8613,39.1113],[117.5977,38.6279],[117.2461,38.54],[116.7188,38.8037],[116.7188,38.9355],[116.8945,39.1113],[116.8066,39.5947]]]}},{"type":"Feature","id":"shang_hai","properties":{"name":"上海","cp":[121.4648,31.2891],"childNum":19},"geometry":{"type":"Polygon","coordinates":[[[120.9375,31.0254],[121.2012,31.4648],[121.377,31.5088],[121.1133,31.7285],[121.2012,31.8604],[121.9922,31.5967],[121.9043,31.1572],[121.9922,30.8057],[121.2891,30.6738],[120.9375,31.0254]]]}},{"type":"Feature","id":"xiang_gang","properties":{"name":"香港","cp":[114.2578,22.3242],"childNum":1},"geometry":{"type":"Polygon","coordinates":[[[114.6094,22.4121],[114.5215,22.1484],[114.3457,22.1484],[113.9063,22.1484],[113.8184,22.1924],[113.9063,22.4121],[114.1699,22.5439],[114.3457,22.5439],[114.4336,22.5439],[114.4336,22.4121],[114.6094,22.4121]]]}},{"type":"Feature","id":"ao_men","properties":{"name":"澳门","cp":[113.5547,22.1484],"childNum":1},"geometry":{"type":"Polygon","coordinates":[[[113.5986,22.1649],[113.6096,22.1265],[113.5547,22.11],[113.5437,22.2034],[113.5767,22.2034],[113.5986,22.1649]]]}}],"srcSize":{"left":243.4766,"top":36.4307,"width":61.6113,"height":35.4638}}
--------------------------------------------------------------------------------