├── 3d ├── .babelrc ├── .gitignore ├── .prettierrc ├── package.json └── src │ ├── TimeSeries.js │ ├── app.js │ ├── constants.js │ ├── index.html │ ├── styles │ └── main.css │ ├── translate.js │ └── utils │ └── index.js ├── Dashboard ├── .browserslistrc ├── .editorconfig ├── .eslintrc.js ├── .gitignore ├── .prettierrc ├── babel.config.js ├── deploy.sh ├── package.json ├── public │ ├── index.html │ ├── robots.txt │ └── static │ │ ├── Chart │ │ ├── css │ │ │ └── index.css │ │ ├── favicon.ico │ │ ├── index.html │ │ └── js │ │ │ ├── 4add81f750.js │ │ │ ├── data.js │ │ │ ├── index.js │ │ │ ├── react-dom.development.js │ │ │ ├── react.development.js │ │ │ ├── translate.js │ │ │ └── utils.js │ │ ├── China │ │ ├── README.md │ │ ├── _config.yml │ │ ├── getOnsInfo.json │ │ ├── index.html │ │ ├── js │ │ │ ├── echarts.min.js │ │ │ └── map │ │ │ │ ├── china.js │ │ │ │ └── province │ │ │ │ ├── anhui.js │ │ │ │ ├── aomen.js │ │ │ │ ├── beijing.js │ │ │ │ ├── chongqing.js │ │ │ │ ├── fujian.js │ │ │ │ ├── gansu.js │ │ │ │ ├── guangdong.js │ │ │ │ ├── guangxi.js │ │ │ │ ├── guizhou.js │ │ │ │ ├── hainan.js │ │ │ │ ├── hebei.js │ │ │ │ ├── heilongjiang.js │ │ │ │ ├── henan.js │ │ │ │ ├── hubei.js │ │ │ │ ├── hunan.js │ │ │ │ ├── jiangsu.js │ │ │ │ ├── jiangxi.js │ │ │ │ ├── jilin.js │ │ │ │ ├── liaoning.js │ │ │ │ ├── neimenggu.js │ │ │ │ ├── ningxia.js │ │ │ │ ├── qinghai.js │ │ │ │ ├── shandong.js │ │ │ │ ├── shanghai.js │ │ │ │ ├── shanxi.js │ │ │ │ ├── shanxi1.js │ │ │ │ ├── sichuan.js │ │ │ │ ├── taiwan.js │ │ │ │ ├── tianjin.js │ │ │ │ ├── xianggang.js │ │ │ │ ├── xinjiang.js │ │ │ │ ├── xizang.js │ │ │ │ ├── yunnan.js │ │ │ │ └── zhejiang.js │ │ ├── libs │ │ │ └── axios.min.js │ │ └── province.json │ │ └── Ranking │ │ ├── color_ranges.js │ │ ├── config.js │ │ ├── imgs.js │ │ ├── index.html │ │ ├── nCov_china_0319.csv │ │ ├── nCov_world_0516.csv │ │ ├── nCov_wuhan_0319.csv │ │ ├── stylesheet.css │ │ ├── university.csv │ │ ├── university_ranking.csv │ │ └── visual.js ├── src │ ├── API.js │ ├── App.vue │ ├── Home.vue │ ├── Scraper.js │ ├── assets │ │ ├── logo.png │ │ └── logo.svg │ ├── components │ │ ├── Chart.vue │ │ ├── DailyReport.vue │ │ ├── FatalityRateByAge.vue │ │ ├── FatalityRateByComorbidity.vue │ │ ├── FatalityRateBySex.vue │ │ ├── MainlandChina.vue │ │ ├── Map.vue │ │ ├── Ranking.vue │ │ ├── RecoveredChart.vue │ │ ├── Reference.vue │ │ ├── SearchDialog.vue │ │ ├── Timeline.vue │ │ ├── TotalCases.vue │ │ ├── TweetDialog.vue │ │ ├── Tweets.vue │ │ └── WHO.vue │ ├── helpers │ │ └── index.js │ ├── main.js │ ├── plugins │ │ ├── vue2-filters.js │ │ ├── vue2-perfect-scrollbar.js │ │ └── vuetify.js │ ├── registerServiceWorker.js │ └── store │ │ └── index.js └── vue.config.js ├── LICENSE ├── README.md └── img └── home.png /3d/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": ["@babel/plugin-transform-runtime"] 3 | } 4 | -------------------------------------------------------------------------------- /3d/.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | .cache 3 | node_modules 4 | package-lock.json 5 | **/.DS_Store -------------------------------------------------------------------------------- /3d/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "semi": true 4 | } -------------------------------------------------------------------------------- /3d/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "covid3d", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "dev": "parcel src/index.html", 8 | "build": "parcel build src/index.html --public-url /COVID-19-Dashboard/3d/" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "devDependencies": { 14 | "@babel/core": "^7.9.0", 15 | "@babel/plugin-transform-runtime": "^7.9.0", 16 | "parcel-bundler": "^1.12.4" 17 | }, 18 | "dependencies": { 19 | "csvtojson": "^2.0.10", 20 | "d3": "^5.15.0", 21 | "dayjs": "^1.8.23", 22 | "globe.gl": "^2.8.5" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /3d/src/TimeSeries.js: -------------------------------------------------------------------------------- 1 | const request = require('request'); 2 | const csv = require('csvtojson'); 3 | const fs = require('fs'); 4 | 5 | class TimeSeries { 6 | constructor() { 7 | this.timeSeriesURL = 8 | 'https://raw.githubusercontent.com/bumbeishvili/covid19-daily-data/master'; 9 | this.countryRenameMapper = { 10 | USA: 'United States of America', 11 | UAE: 'United Arab Emirates', 12 | UK: 'United Kingdom', 13 | "Cote d'Ivoire": 'Ivory Coast', 14 | DRC: 'Democratic Republic of the Congo', 15 | Bahamas: 'The Bahamas', 16 | }; 17 | } 18 | 19 | async fetchTimeSeries() { 20 | const roundOffCoord = (coord) => parseFloat(coord.trim()).toFixed(5); 21 | 22 | let countryMapper = {}; 23 | 24 | // Load confirmed cases 25 | const confirmedRows = await this.getConfirmedCases(); 26 | const headers = Object.keys(confirmedRows[0]); 27 | 28 | // Load recovered sheet 29 | const recoveredRows = await this.getRecovered(); 30 | 31 | // Load recovered sheet 32 | const deathRows = await this.getDeaths(); 33 | 34 | confirmedRows.forEach((row) => { 35 | headers.slice(4).forEach((header) => { 36 | // Check if there's matching row in recovered csv 37 | const recoveries = recoveredRows.find( 38 | (i) => 39 | roundOffCoord(i.Lat) === roundOffCoord(row.Lat) && 40 | roundOffCoord(i.Long) === roundOffCoord(row.Long) 41 | ); 42 | 43 | // Check if there's matching row in death csv 44 | const deaths = deathRows.find( 45 | (i) => 46 | roundOffCoord(i.Lat) === roundOffCoord(row.Lat) && 47 | roundOffCoord(i.Long) === roundOffCoord(row.Long) 48 | ); 49 | 50 | const countryName = this.countryRenameMapper[row['Country/Region']] 51 | ? this.countryRenameMapper[row['Country/Region']] 52 | : row['Country/Region']; 53 | 54 | if (countryMapper[countryName]) { 55 | countryMapper[countryName][header] = { 56 | confirmed: Math.round(+row[header]) || 0, 57 | recoveries: recoveries ? Math.round(+recoveries[header]) : 0, 58 | deaths: deaths ? Math.round(+deaths[header]) : 0, 59 | }; 60 | } else { 61 | countryMapper[countryName] = { 62 | [header]: { 63 | confirmed: Math.round(+row[header]) || 0, 64 | recoveries: recoveries ? Math.round(+recoveries[header]) : 0, 65 | deaths: deaths ? Math.round(+deaths[header]) : 0, 66 | }, 67 | }; 68 | } 69 | }); 70 | }); 71 | 72 | return countryMapper; 73 | } 74 | 75 | parseCSV(url) { 76 | return new Promise((resolve, reject) => { 77 | const rows = []; 78 | csv() 79 | .fromStream(request.get(url)) 80 | .subscribe( 81 | (json) => { 82 | rows.push(json); 83 | }, 84 | () => { 85 | reject(); 86 | }, 87 | () => { 88 | resolve(rows); 89 | } 90 | ); 91 | }); 92 | } 93 | 94 | getConfirmedCases() { 95 | return this.parseCSV( 96 | `${this.timeSeriesURL}/time_series_19-covid-Confirmed.csv` 97 | ); 98 | } 99 | 100 | getRecovered() { 101 | return this.parseCSV( 102 | `${this.timeSeriesURL}/time_series_19-covid-Recovered.csv` 103 | ); 104 | } 105 | 106 | getDeaths() { 107 | return this.parseCSV( 108 | `${this.timeSeriesURL}/time_series_19-covid-Deaths.csv` 109 | ); 110 | } 111 | } 112 | 113 | module.exports = new TimeSeries(); 114 | -------------------------------------------------------------------------------- /3d/src/app.js: -------------------------------------------------------------------------------- 1 | import Globe from 'globe.gl'; 2 | import { request, getCoordinates, numberWithCommas, formatDate } from './utils'; 3 | const TimeSeries = require('./TimeSeries'); 4 | import { 5 | GLOBE_IMAGE_URL, 6 | BACKGROUND_IMAGE_URL, 7 | GEOJSON_URL, 8 | CASES_API, 9 | WORLD_COUNTRIES, 10 | } from './constants'; 11 | import * as d3 from 'd3'; 12 | 13 | // Globe container 14 | const globeContainer = document.getElementById('globeViz'); 15 | 16 | const colorScale = d3.scaleSequentialPow(d3.interpolateYlOrRd).exponent(1 / 4); 17 | const getVal = (feat) => { 18 | return feat.covidData.confirmed / feat.properties.POP_EST; 19 | }; 20 | 21 | let world; 22 | 23 | const flagEndpoint = 'https://corona.lmao.ninja/assets/img/flags'; 24 | 25 | init(); 26 | 27 | function init() { 28 | world = Globe()(globeContainer) 29 | .globeImageUrl(GLOBE_IMAGE_URL) 30 | .backgroundImageUrl(BACKGROUND_IMAGE_URL) 31 | .showGraticules(false) 32 | .polygonAltitude(0.06) 33 | .polygonCapColor((feat) => colorScale(getVal(feat))) 34 | .polygonSideColor(() => 'rgba(0, 100, 0, 0.05)') 35 | .polygonStrokeColor(() => '#111') 36 | .polygonLabel( 37 | ({ properties: d, covidData: c }) => ` 38 |
39 | flag 40 |
41 | ${d.CNNAME}
42 |
43 |
44 |
45 | 确诊: ${numberWithCommas(c.confirmed)}
46 | 死亡: ${numberWithCommas(c.deaths)}
47 | 治愈: ${numberWithCommas( 48 | c.recoveries 49 | )}
50 | 总人口: ${d3.format('.3s')(d.POP_EST)} 51 |
52 |
53 | ` 54 | ) 55 | .onPolygonHover((hoverD) =>world 56 | .polygonAltitude((d) => (d === hoverD ? 0.12 : 0.06)) 57 | .polygonCapColor((d) => 58 | d === hoverD ? 'steelblue' : colorScale(getVal(d)) 59 | ) 60 | ) 61 | .polygonsTransitionDuration(200); 62 | 63 | getCases(); 64 | } 65 | 66 | let dates = []; 67 | let countries = []; 68 | let featureCollection = []; 69 | 70 | // Play button 71 | const playButton = document.querySelector('.play-button'); 72 | // Slider 73 | const slider = document.querySelector('.slider'); 74 | // Slider date 75 | const sliderDate = document.querySelector('.slider-date'); 76 | 77 | var CN_COUNTRIES={}; 78 | WORLD_COUNTRIES.forEach(element => { 79 | CN_COUNTRIES[element.name.toUpperCase()]=element.translation; 80 | }); 81 | function toChina(name) 82 | { 83 | var uname=name.toUpperCase(); 84 | if(CN_COUNTRIES.hasOwnProperty(uname)) 85 | { 86 | return CN_COUNTRIES[uname]; 87 | } 88 | else{ 89 | return name; 90 | } 91 | } 92 | 93 | async function getCases() { 94 | //countries = await request(CASES_API); 95 | countries = await TimeSeries.fetchTimeSeries(); 96 | console.log(countries) 97 | featureCollection = (await request(GEOJSON_URL)).features; 98 | document.querySelector('.title-desc').innerHTML = 99 | '选中国家查看具体疫情数据.'; 100 | 101 | dates = Object.keys(countries.China); 102 | 103 | // Set slider values 104 | slider.max = dates.length - 1; 105 | slider.value = dates.length - 1; 106 | 107 | slider.disabled = false; 108 | playButton.disabled = false; 109 | 110 | updateCounters(); 111 | updatePolygonsData(); 112 | 113 | updatePointOfView(); 114 | featureCollection.forEach(element => { 115 | element.properties.CNNAME=toChina(element.properties.NAME); 116 | }); 117 | } 118 | 119 | const infectedEl = document.querySelector('#infected'); 120 | const deathsEl = document.querySelector('#deaths'); 121 | const recoveriesEl = document.querySelector('#recovered'); 122 | const updatedEl = document.querySelector('.updated'); 123 | 124 | function updateCounters() { 125 | sliderDate.innerHTML = dates[slider.value]; 126 | 127 | let totalConfirmed = 0; 128 | let totalDeaths = 0; 129 | let totalRecoveries = 0; 130 | 131 | Object.keys(countries).forEach((item) => { 132 | if (countries[item][dates[slider.value]]) { 133 | const countryDate = countries[item][dates[slider.value]]; 134 | totalConfirmed += +countryDate.confirmed; 135 | totalDeaths += +countryDate.deaths; 136 | totalRecoveries += countryDate.recoveries ? +countryDate.recoveries : 0; 137 | } 138 | }); 139 | 140 | infectedEl.innerHTML = numberWithCommas(totalConfirmed); 141 | deathsEl.innerHTML = numberWithCommas(totalDeaths); 142 | recoveriesEl.innerHTML = numberWithCommas(totalRecoveries); 143 | 144 | updatedEl.innerHTML = `(as of ${formatDate(dates[slider.value])})`; 145 | } 146 | 147 | function updatePolygonsData() { 148 | for (let x = 0; x < featureCollection.length; x++) { 149 | const country = featureCollection[x].properties.NAME; 150 | if (countries[country]) { 151 | featureCollection[x].covidData = { 152 | confirmed: countries[country][dates[slider.value]].confirmed, 153 | deaths: countries[country][dates[slider.value]].deaths, 154 | recoveries: countries[country][dates[slider.value]].recoveries, 155 | }; 156 | } else { 157 | featureCollection[x].covidData = { 158 | confirmed: 0, 159 | deaths: 0, 160 | recoveries: 0, 161 | }; 162 | } 163 | } 164 | 165 | const maxVal = Math.max(...featureCollection.map(getVal)); 166 | colorScale.domain([0, maxVal]); 167 | world.polygonsData(featureCollection); 168 | } 169 | 170 | async function updatePointOfView() { 171 | // Get coordinates 172 | try { 173 | const { latitude, longitude } = await getCoordinates(); 174 | 175 | world.pointOfView( 176 | { 177 | lat: latitude, 178 | lng: longitude, 179 | }, 180 | 1000 181 | ); 182 | } catch (e) { 183 | console.log('Unable to set point of view.'); 184 | } 185 | } 186 | 187 | let interval; 188 | 189 | playButton.addEventListener('click', () => { 190 | if (playButton.innerText === '播放') { 191 | playButton.innerText = '暂停'; 192 | } else { 193 | playButton.innerText = '播放'; 194 | world.controls().autoRotate=false; 195 | clearInterval(interval); 196 | return; 197 | } 198 | 199 | // Check if slider position is max 200 | if (+slider.value === dates.length - 1) { 201 | slider.value = 0; 202 | } 203 | 204 | sliderDate.innerHTML = dates[slider.value]; 205 | world.controls().autoRotate=true; 206 | world.controls().autoRotateSpeed=4; 207 | interval = setInterval(() => { 208 | slider.value++; 209 | sliderDate.innerHTML = dates[slider.value]; 210 | updateCounters(); 211 | updatePolygonsData(); 212 | 213 | if (+slider.value === dates.length - 1) { 214 | playButton.innerHTML = '播放'; 215 | world.controls().autoRotate=false; 216 | //world.controls().autoRotateSpeed=5; 217 | clearInterval(interval); 218 | } 219 | }, 200); 220 | }); 221 | 222 | if ('oninput' in slider) { 223 | slider.addEventListener( 224 | 'input', 225 | function () { 226 | updateCounters(); 227 | updatePolygonsData(); 228 | }, 229 | false 230 | ); 231 | } 232 | 233 | // Responsive globe 234 | window.addEventListener('resize', (event) => { 235 | world.width([event.target.innerWidth]); 236 | world.height([event.target.innerHeight]); 237 | }); 238 | -------------------------------------------------------------------------------- /3d/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 11 | 15 | 16 | 3D-展示 17 | 18 | 19 | 20 |
21 |
22 |
3D-展示
23 |
24 | 加载中 ... 25 |
26 |
27 | 28 |
29 |
30 |
31 | 34 | 42 | 46 |
47 |
48 |
49 | 总计 50 |
51 |
52 | 确诊: 0 • 死亡: 53 | 0 • 治愈: 0 54 |
55 |
56 | 57 | 原项目地址(我仅仅去掉后端加汉化) 58 |
59 |
60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /3d/src/styles/main.css: -------------------------------------------------------------------------------- 1 | * { 2 | margin: 0; 3 | padding: 0; 4 | } 5 | 6 | body { 7 | font-family: 'Space Mono', monospace; 8 | overflow: hidden; 9 | background: black; 10 | } 11 | 12 | .top-info-container { 13 | z-index: 1; 14 | top: 20px; 15 | position: absolute; 16 | color: white; 17 | text-align: center; 18 | width: 100%; 19 | } 20 | 21 | .bottom-info-container { 22 | z-index: 1; 23 | bottom: 20px; 24 | position: absolute; 25 | color: white; 26 | text-align: center; 27 | width: 100%; 28 | } 29 | 30 | .title { 31 | font-size: 35px; 32 | color: #e6f1ff; 33 | } 34 | 35 | .title-desc { 36 | margin-top: 5px; 37 | color: #ccd6f6; 38 | padding: 0 5px; 39 | } 40 | 41 | #infected { 42 | color: goldenrod; 43 | } 44 | 45 | #deaths { 46 | color: #ff4848; 47 | } 48 | 49 | #recovered { 50 | color: #1ae021; 51 | } 52 | 53 | .card { 54 | font-family: 'Space Mono', monospace; 55 | transition: 0.3s; 56 | background-color: black; 57 | width: 190px; 58 | border: 2px solid steelblue; 59 | border-radius: 10px; 60 | z-index: 2; 61 | } 62 | 63 | .container { 64 | /* padding: 3px 16px; */ 65 | padding-top: 1px; 66 | padding-bottom: 8px; 67 | padding-left: 12px; 68 | padding-right: 12px; 69 | text-align: left; 70 | } 71 | 72 | .card-img { 73 | object-fit: contain; 74 | width: 100%; 75 | border-top-left-radius: 10px; 76 | border-top-right-radius: 10px; 77 | } 78 | 79 | .card-title { 80 | font-weight: bold; 81 | } 82 | 83 | .card-spacer { 84 | height: 5px; 85 | } 86 | 87 | .bottom-info { 88 | display: flex; 89 | flex-direction: column; 90 | font-size: 11px; 91 | } 92 | 93 | .scene-tooltip { 94 | z-index: 2; 95 | } 96 | 97 | .timeline-container { 98 | z-index: 1; 99 | position: absolute; 100 | display: flex; 101 | color: #fff; 102 | width: 60%; 103 | align-items: center; 104 | } 105 | 106 | @media only screen and (max-width: 768px) { 107 | .timeline-container { 108 | width: 90%; 109 | } 110 | } 111 | 112 | .slider { 113 | -webkit-appearance: none; 114 | height: 2px; 115 | width: 100%; 116 | margin-right: 10px; 117 | border-radius: 5px; 118 | background: #ccd6f6; 119 | outline: none; 120 | opacity: 0.7; 121 | -webkit-transition: 0.2s; 122 | transition: opacity 0.2s; 123 | } 124 | 125 | .slider:hover { 126 | opacity: 1; 127 | } 128 | 129 | .slider::-webkit-slider-thumb { 130 | -webkit-appearance: none; 131 | appearance: none; 132 | width: 25px; 133 | height: 25px; 134 | border-radius: 50%; 135 | background: #000; 136 | cursor: pointer; 137 | border: 2px solid #ccd6f6; 138 | } 139 | 140 | .slider::-moz-range-thumb { 141 | width: 25px; 142 | height: 25px; 143 | border-radius: 50%; 144 | background: #000; 145 | cursor: pointer; 146 | border: 2px solid #ccd6f6; 147 | } 148 | 149 | .play-button { 150 | border-radius: 5px; 151 | padding: 5px; 152 | font-size: 14px; 153 | cursor: pointer; 154 | background-color: rgba(1, 1, 1, 0); 155 | border: 1px solid #ccd6f6; 156 | color: #ccd6f6; 157 | outline: none; 158 | width: 5em; 159 | } 160 | -------------------------------------------------------------------------------- /3d/src/translate.js: -------------------------------------------------------------------------------- 1 | 2 | 3 | export function toChina(name) 4 | { 5 | var CN_COUNTRIES={}; 6 | WORLD_COUNTRIES.forEach(element => { 7 | CN_COUNTRIES[element.name]=element.translation; 8 | }); 9 | name=toUpperCase(name); 10 | console.log(name); 11 | if(CN_COUNTRIES.hasOwnProperty(name)) 12 | { 13 | return CN_COUNTRIES[name]; 14 | } 15 | else{ 16 | return name; 17 | } 18 | } 19 | 20 | 21 | -------------------------------------------------------------------------------- /3d/src/utils/index.js: -------------------------------------------------------------------------------- 1 | import dayjs from 'dayjs'; 2 | 3 | export async function request(url) { 4 | try { 5 | const res = await fetch(url); 6 | const data = await res.json(); 7 | return data; 8 | } catch (e) { 9 | throw e; 10 | } 11 | } 12 | 13 | export async function getCoordinates() { 14 | try { 15 | const { latitude, longitude } = await request( 16 | 'https://geolocation-db.com/json/' 17 | ); 18 | 19 | return { 20 | latitude, 21 | longitude, 22 | }; 23 | } catch (e) { 24 | throw e; 25 | } 26 | } 27 | 28 | export function numberWithCommas(x) { 29 | return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','); 30 | } 31 | 32 | export function formatDate(date, format = 'MMMM D, YYYY') { 33 | return dayjs(date).format(format); 34 | } 35 | 36 | export const isMobile = (function (a) { 37 | return ( 38 | /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test( 39 | a 40 | ) || 41 | /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test( 42 | a.substr(0, 4) 43 | ) 44 | ); 45 | // @ts-ignore 46 | })(navigator.userAgent || navigator.vendor || window.opera); 47 | -------------------------------------------------------------------------------- /Dashboard/.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | -------------------------------------------------------------------------------- /Dashboard/.editorconfig: -------------------------------------------------------------------------------- 1 | [*.{js,jsx,ts,tsx,vue}] 2 | indent_style = space 3 | indent_size = 2 4 | end_of_line = lf 5 | trim_trailing_whitespace = true 6 | insert_final_newline = true 7 | max_line_length = 100 8 | -------------------------------------------------------------------------------- /Dashboard/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true 5 | }, 6 | extends: ['plugin:vue/essential', '@vue/airbnb', 'prettier'], 7 | plugins: ['prettier'], 8 | rules: { 9 | 'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', 10 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', 11 | 'prettier/prettier': ['error'], 12 | 'camelcase': "off", 13 | 'no-unused-vars':"off", 14 | 'vars-on-top':'off' 15 | }, 16 | parserOptions: { 17 | parser: 'babel-eslint' 18 | } 19 | }; 20 | -------------------------------------------------------------------------------- /Dashboard/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | # local env files 6 | .env.local 7 | .env.*.local 8 | 9 | # Log files 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 13 | # Editor directories and files 14 | .idea 15 | .vscode 16 | *.suo 17 | *.ntvs* 18 | *.njsproj 19 | *.sln 20 | *.sw? 21 | 22 | package-lock.json -------------------------------------------------------------------------------- /Dashboard/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": true, 3 | "singleQuote": true 4 | } -------------------------------------------------------------------------------- /Dashboard/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ['@vue/cli-plugin-babel/preset'] 3 | }; 4 | -------------------------------------------------------------------------------- /Dashboard/deploy.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # abort on errors 4 | set -e 5 | 6 | # build 7 | npm run build 8 | 9 | # navigate into the build output directory 10 | cd dist 11 | 12 | # if you are deploying to a custom domain 13 | # echo 'www.example.com' > CNAME 14 | 15 | git init 16 | git add -A 17 | git commit -m 'deploy' 18 | 19 | # if you are deploying to https://.github.io 20 | # git push -f git@github.com:/.github.io.git master 21 | 22 | # if you are deploying to https://.github.io/ 23 | git push -f git@github.com:TjFish/COVID-19-Dashboard.git master:gh-pages 24 | 25 | cd - -------------------------------------------------------------------------------- /Dashboard/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "2019-ncov-frontend", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "build": "vue-cli-service build", 8 | "lint": "vue-cli-service lint" 9 | }, 10 | "dependencies": { 11 | "@mdi/font": "^5.0.45", 12 | "animated-number-vue": "^1.0.0", 13 | "apexcharts": "^3.15.3", 14 | "axios": "^0.19.2", 15 | "cheerio": "^1.0.0-rc.3", 16 | "core-js": "^3.4.4", 17 | "countup.js": "^2.0.4", 18 | "csvtojson": "^2.0.10", 19 | "d3": "^5.16.0", 20 | "jquery": "^3.5.1", 21 | "leaflet": "^1.6.0", 22 | "moment": "^2.24.0", 23 | "register-service-worker": "^1.6.2", 24 | "remove": "^0.1.5", 25 | "request": "^2.88.2", 26 | "vue": "^2.6.10", 27 | "vue-apexcharts": "^1.5.2", 28 | "vue-countup-v2": "^4.0.0", 29 | "vue-router": "^3.3.2", 30 | "vue2-filters": "^0.9.1", 31 | "vue2-leaflet": "^2.4.2", 32 | "vue2-perfect-scrollbar": "^1.3.0", 33 | "vuetify": "^2.2.17", 34 | "vuex": "^3.1.2", 35 | "vuex-persistedstate": "^2.7.1" 36 | }, 37 | "devDependencies": { 38 | "@vue/cli-plugin-babel": "^4.2.2", 39 | "@vue/cli-plugin-eslint": "^4.2.2", 40 | "@vue/cli-plugin-pwa": "^4.2.2", 41 | "@vue/cli-service": "^4.2.2", 42 | "@vue/eslint-config-airbnb": "^5.0.2", 43 | "babel-eslint": "^10.0.3", 44 | "eslint": "^6.7.2", 45 | "eslint-config-prettier": "^6.10.0", 46 | "eslint-plugin-import": "^2.20.1", 47 | "eslint-plugin-prettier": "^3.1.2", 48 | "eslint-plugin-vue": "^6.1.2", 49 | "prettier": "^1.19.1", 50 | "sass": "^1.19.0", 51 | "sass-loader": "^8.0.0", 52 | "vue-cli-plugin-vuetify": "^2.0.4", 53 | "vue-template-compiler": "^2.6.10", 54 | "vuetify-loader": "^1.3.0" 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /Dashboard/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | 14 | 18 | 19 | 20 | 24 | 25 | COVID-19 Dashboard 26 | 30 | 31 | 32 | 38 |
39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /Dashboard/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: 3 | -------------------------------------------------------------------------------- /Dashboard/public/static/Chart/css/index.css: -------------------------------------------------------------------------------- 1 | .covid-data-table-wrapper { 2 | overflow-y: auto; 3 | height: 350px; 4 | } 5 | 6 | .covid-data-table-wrapper > table > thead th { 7 | position: sticky; 8 | top: 0; 9 | box-shadow: 0 0 0 1px #343a40; 10 | } 11 | 12 | .covid-data-table-wrapper > table > thead th[sortable] { 13 | cursor: pointer; 14 | white-space: nowrap; 15 | } 16 | 17 | #CovidChart { 18 | width: 49%; 19 | height: 350px; 20 | float: left; 21 | } 22 | 23 | #RegionsTable{ 24 | width: 49%; 25 | float: right; 26 | } 27 | #TableFilters{ 28 | width: 49%; 29 | float: right; 30 | 31 | } -------------------------------------------------------------------------------- /Dashboard/public/static/Chart/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TjFish/COVID-19-Dashboard/7eb23976176e7a1545c27bc05707581d06f40f80/Dashboard/public/static/Chart/favicon.ico -------------------------------------------------------------------------------- /Dashboard/public/static/Chart/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 12 | 13 | 14 | 15 | COVID-19 Dashboard 16 | 17 | 18 | 19 | 20 | 26 | 31 | 32 | 33 | 34 |
35 |
36 |
37 |
38 |
39 |
40 | 41 |
42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 53 | 58 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /Dashboard/public/static/Chart/js/4add81f750.js: -------------------------------------------------------------------------------- 1 | window.FontAwesomeKitConfig = {"asyncLoading":{"enabled":true},"autoA11y":{"enabled":true},"baseUrl":"https://kit-free.fontawesome.com","license":"free","method":"css","minify":{"enabled":true},"v4shim":{"enabled":true},"version":"latest"}; 2 | !function(){!function(){if(!(void 0===window.Element||"classList"in document.documentElement)){var e,t,n,i=Array.prototype,o=i.push,a=i.splice,s=i.join;r.prototype={add:function(e){this.contains(e)||(o.call(this,e),this.el.className=this.toString())},contains:function(e){return-1!=this.el.className.indexOf(e)},item:function(e){return this[e]||null},remove:function(e){if(this.contains(e)){for(var t=0;t fetch(dataType.dataSourceUrl) 120 | )) 121 | .then(responses => Promise.all( 122 | responses.map(response => response.text()) 123 | )) 124 | .then(dataTypesTicks => { 125 | return dataTypesTicks.reduce( 126 | (dataContainer, dataTypeTicksCSV, dataTypeIndex) => { 127 | const dataType = Object.keys(covidDataTypes)[dataTypeIndex]; 128 | const dataTypeTicks = Papa.parse(dataTypeTicksCSV).data; 129 | dataContainer.labels = dataTypeTicks.shift(); 130 | dataContainer.ticks[dataType] = dataTypeTicks 131 | .filter(regionTicks => { 132 | return regionTicks.length === dataContainer.labels.length; 133 | }) 134 | .map(regionTicks => { 135 | return regionTicks.map((regionTick, tickIndex) => { 136 | if (tickIndex < covidSchema.dateStartColumn) { 137 | return regionTick; 138 | } 139 | if (!regionTick) { 140 | return 0; 141 | } 142 | return parseInt(regionTick, 10); 143 | }); 144 | }) 145 | .sort((regionTicksA, regionTicksB) => { 146 | const regionNameA = getRegionKey(regionTicksA); 147 | const regionNameB = getRegionKey(regionTicksB); 148 | if (regionNameA > regionNameB) { 149 | return 1; 150 | } else if (regionNameA < regionNameB) { 151 | return -1; 152 | } 153 | return 0; 154 | }); 155 | return dataContainer; 156 | }, 157 | defaultDataContainer 158 | ); 159 | }); 160 | } 161 | 162 | function getRegionKey(regionTicks) { 163 | if (!regionTicks || !regionTicks.length) { 164 | return null; 165 | } 166 | const country = regionTicks[covidSchema.countryColumn]; 167 | const state = regionTicks[covidSchema.stateColumn]; 168 | return state ? `${country} - ${state}` : `${country}`; 169 | } 170 | 171 | function getRegionIndexByKey(covidData, dataTypeKey, regionKey) { 172 | return covidData.ticks[dataTypeKey].findIndex( 173 | regionTicks => getRegionKey(regionTicks) === regionKey 174 | ); 175 | } 176 | 177 | function getRegionByKey(covidData, dataTypeKey, regionKey) { 178 | const regionIndex = getRegionIndexByKey(covidData, dataTypeKey, regionKey); 179 | return covidData.ticks[dataTypeKey][regionIndex]; 180 | } 181 | 182 | function getGlobalTicks(covidData, dataTypeKey) { 183 | const totalTicks = covidData.ticks[dataTypeKey][0].length; 184 | const globalTicks = new Array(totalTicks).fill(0); 185 | globalTicks[covidSchema.stateColumn] = ''; 186 | globalTicks[covidSchema.countryColumn] = covidCountries.all.title; 187 | globalTicks[covidSchema.latColumn] = ''; 188 | globalTicks[covidSchema.lonColumn] = ''; 189 | covidData.ticks[dataTypeKey].forEach(regionTicks => { 190 | regionTicks.forEach((regionTick, tickIndex) => { 191 | if (tickIndex < covidSchema.dateStartColumn) { 192 | return; 193 | } 194 | globalTicks[tickIndex] += regionTick; 195 | }); 196 | }); 197 | return globalTicks; 198 | } 199 | 200 | function getTotalCount(covidData, dataTypeKey, regionKeys) { 201 | if (regionKeys.includes(covidCountries.all.key)) { 202 | const globalTicks = getGlobalTicks(covidData, dataTypeKey); 203 | return globalTicks[globalTicks.length - 1]; 204 | } 205 | return regionKeys.reduce((total, regionKey) => { 206 | const regionTicks = getRegionByKey(covidData, dataTypeKey, regionKey); 207 | if (!regionTicks) { 208 | return total; 209 | } 210 | total += regionTicks[regionTicks.length - 1]; 211 | return total; 212 | }, 0); 213 | } 214 | 215 | function searchRegionTicks(covidData, dataTypeKey, regionKey) { 216 | if (!regionKey) { 217 | return null; 218 | } 219 | const regionsTicks = covidData.ticks[dataTypeKey]; 220 | return regionsTicks.find((regionTicks) => getRegionKey(regionTicks) === regionKey); 221 | } 222 | 223 | function getCovidRegions(covidData) { 224 | return covidData.ticks[covidDataTypes.confirmed.key] 225 | .map((regionTicks, regionIndex) => { 226 | const key = getRegionKey(regionTicks); 227 | const numbers = {}; 228 | Object.values(covidDataTypes).forEach((covidDataType) => { 229 | const regionTicksOfType = covidData.ticks[covidDataType.key][regionIndex]; 230 | const regionKeyOfType = getRegionKey(regionTicksOfType); 231 | if (regionTicksOfType && regionTicksOfType.length === regionTicks.length && regionKeyOfType && regionKeyOfType === key) { 232 | numbers[covidDataType.key] = regionTicksOfType[regionTicksOfType.length - 1]; 233 | } else { 234 | const foundRegionTicks = searchRegionTicks(covidData, covidDataType.key, key); 235 | if (foundRegionTicks && foundRegionTicks.length === regionTicks.length) { 236 | numbers[covidDataType.key] = foundRegionTicks[foundRegionTicks.length - 1]; 237 | } else { 238 | numbers[covidDataType.key] = -1; 239 | } 240 | } 241 | }); 242 | return {key, numbers}; 243 | }); 244 | } 245 | 246 | function getLastUpdatedDate(covidData) { 247 | const dateLabel = covidData.labels[covidData.labels.length - 1]; 248 | return formatDateLabel(dateLabel); 249 | } 250 | 251 | function formatDateLabel(dateLabel) { 252 | const date = new Date(dateLabel); 253 | const options = {month: 'short', day: '2-digit'}; 254 | return date.toLocaleDateString('en-US', options); 255 | } 256 | 257 | function groupCovidDataByCountries(covidData) { 258 | const covidDataByCountries = { 259 | labels: [], 260 | ticks: {}, 261 | }; 262 | covidDataByCountries.labels = [...covidData.labels]; 263 | Object.values(covidDataTypes).forEach((covidDataType) => { 264 | covidDataByCountries.ticks[covidDataType.key] = Object.values(covidData.ticks[covidDataType.key] 265 | .reduce((countriesTicksMap, regionTicks) => { 266 | const countryName = regionTicks[covidSchema.countryColumn]; 267 | if (!countriesTicksMap[countryName]) { 268 | countriesTicksMap[countryName] = [...regionTicks]; 269 | countriesTicksMap[countryName][covidSchema.stateColumn] = ''; 270 | return countriesTicksMap; 271 | } 272 | for (let columnIndex = covidSchema.dateStartColumn; columnIndex < regionTicks.length; columnIndex += 1) { 273 | countriesTicksMap[countryName][columnIndex] += regionTicks[columnIndex]; 274 | } 275 | return countriesTicksMap; 276 | }, {})); 277 | }); 278 | return covidDataByCountries; 279 | } 280 | 281 | function filterToUrl(filterKey, filterValue) { 282 | try { 283 | const url = new URL(document.location); 284 | url.searchParams.set(filterKey, JSON.stringify(filterValue)); 285 | history.pushState(null, null, url.href); 286 | } catch (e) { 287 | console.error('Cannot send filters to URL'); 288 | } 289 | } 290 | 291 | function filtersFromUrl() { 292 | const filtersInUrl = {}; 293 | try { 294 | const url = new URL(document.location); 295 | Object.values(covidFilters).forEach((covidFilter) => { 296 | if (url.searchParams.has(covidFilter.key)) { 297 | filtersInUrl[covidFilter.key] = JSON.parse( 298 | url.searchParams.get(covidFilter.key) 299 | ); 300 | } 301 | }); 302 | } catch (e) { 303 | console.error('Cannot fetch filters from URL'); 304 | } 305 | return filtersInUrl; 306 | } 307 | 308 | function deleteFiltersFromUrl() { 309 | try { 310 | const url = new URL(document.location); 311 | Object.values(covidFilters).forEach((covidFilter) => { 312 | url.searchParams.delete(covidFilter.key); 313 | }); 314 | history.pushState(null, null, url.href); 315 | } catch (e) { 316 | console.error('Cannot delete filters from URL'); 317 | } 318 | } 319 | 320 | function calculateMortality(confirmedNumber, deathsNumber) { 321 | if (confirmedNumber === 0) { 322 | return 0; 323 | } 324 | const mortality = deathsNumber / confirmedNumber; 325 | if (mortality < 0) { 326 | return 0; 327 | } 328 | return Math.floor(1000 * mortality) / 10; 329 | } 330 | -------------------------------------------------------------------------------- /Dashboard/public/static/Chart/js/utils.js: -------------------------------------------------------------------------------- 1 | function useWindowSize() { 2 | const [width, setWidth] = React.useState(document.documentElement.clientWidth); 3 | const [height, setHeight] = React.useState(document.documentElement.clientHeight); 4 | React.useEffect(() => { 5 | const setSize = () => { 6 | setWidth(document.documentElement.clientWidth); 7 | setHeight(document.documentElement.clientHeight); 8 | }; 9 | window.addEventListener('resize', setSize); 10 | window.addEventListener('orientationchange', setSize); 11 | return () => { 12 | window.removeEventListener('resize', setSize); 13 | window.removeEventListener('orientationchange', setSize); 14 | } 15 | }, []); 16 | return [width/3, height]; 17 | } 18 | 19 | // @see: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions 20 | function escapeRegExp(string) { 21 | return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string 22 | } -------------------------------------------------------------------------------- /Dashboard/public/static/China/README.md: -------------------------------------------------------------------------------- 1 | # 中国疫情地图,支持省市两级联动 2 | 3 | - 地图数据来自 echarts 官方数据 4 | 5 | - 操作提示,点击省份能进入当前省的疫情地图,双击省份地图可以返回全国地图,或者点击右上角按钮直接返回全国地图。 6 | 7 | - echarts 地图数据(官方)在线地址为:
1. 全国:http://echarts.baidu.com/gallery/vendors/echarts/map/js/china.js
2. 省级:http://echarts.baidu.com/gallery/vendors/echarts/map/js/province/(省份拼音) 8 | 9 | -------------------------------------------------------------------------------- /Dashboard/public/static/China/_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-architect -------------------------------------------------------------------------------- /Dashboard/public/static/China/js/map/province/aomen.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed to the Apache Software Foundation (ASF) under one 3 | * or more contributor license agreements. See the NOTICE file 4 | * distributed with this work for additional information 5 | * regarding copyright ownership. The ASF licenses this file 6 | * to you under the Apache License, Version 2.0 (the 7 | * "License"); you may not use this file except in compliance 8 | * with the License. You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, 13 | * software distributed under the License is distributed on an 14 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | * KIND, either express or implied. See the License for the 16 | * specific language governing permissions and limitations 17 | * under the License. 18 | */ 19 | 20 | (function (root, factory) { 21 | if (typeof define === 'function' && define.amd) { 22 | // AMD. Register as an anonymous module. 23 | define(['exports', 'echarts'], factory); 24 | } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') { 25 | // CommonJS 26 | factory(exports, require('echarts')); 27 | } else { 28 | // Browser globals 29 | factory({}, root.echarts); 30 | } 31 | }(this, function (exports, echarts) { 32 | var log = function (msg) { 33 | if (typeof console !== 'undefined') { 34 | console && console.error && console.error(msg); 35 | } 36 | } 37 | if (!echarts) { 38 | log('ECharts is not Loaded'); 39 | return; 40 | } 41 | if (!echarts.registerMap) { 42 | log('ECharts Map is not loaded') 43 | return; 44 | } 45 | echarts.registerMap('澳门', {"type":"FeatureCollection","features":[{"id":"820001","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@LADC^umZ@DONWE@DALBBF@H@DFBBTC"],["@@P@LC@AGM@OECMBABBTCD@DDH"]],"encodeOffsets":[[[116285,22746]],[[116303,22746]]]},"properties":{"cp":[113.552965,22.207882],"name":"花地玛堂区","childNum":2}},{"id":"820002","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@MK@CA@AAGDEB@NVFJG"],"encodeOffsets":[[116281,22734]]},"properties":{"cp":[113.549052,22.199175],"name":"花王堂区","childNum":1}},{"id":"820003","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@EGOB@DNLHE@C"],"encodeOffsets":[[116285,22729]]},"properties":{"cp":[113.550252,22.193791],"name":"望德堂区","childNum":1}},{"id":"820004","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@ŸYMVAN@BFCBBDAFHDBBFDHIJJEFDPCHHlYJQ"],"encodeOffsets":[[116313,22707]]},"properties":{"cp":[113.55374,22.188119],"name":"大堂区","childNum":1}},{"id":"820005","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@JICGAECACGEBAAEDBFNXB@"],"encodeOffsets":[[116266,22728]]},"properties":{"cp":[113.54167,22.187778],"name":"风顺堂区","childNum":1}},{"id":"820006","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@ ZNWRquZCBCC@AEA@@ADCDCAACEAGBQ@INEL"],"encodeOffsets":[[116265,22694]]},"properties":{"cp":[113.558783,22.154124],"name":"嘉模堂区","childNum":1}},{"id":"820007","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@MOIAIEI@@GE@AAUCBdCFIFR@HAFBBDDBDCBC@@FB@BDDDA\\M"],"encodeOffsets":[[116316,22676]]},"properties":{"cp":[113.56925,22.136546],"name":"路凼填海区","childNum":1}},{"id":"820008","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@DKMMa_GC_COD@dVDBBF@@HJ@JFJBNPZK"],"encodeOffsets":[[116329,22670]]},"properties":{"cp":[113.559954,22.124049],"name":"圣方济各堂区","childNum":1}}],"UTF8Encoding":true}); 46 | })); -------------------------------------------------------------------------------- /Dashboard/public/static/China/js/map/province/ningxia.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed to the Apache Software Foundation (ASF) under one 3 | * or more contributor license agreements. See the NOTICE file 4 | * distributed with this work for additional information 5 | * regarding copyright ownership. The ASF licenses this file 6 | * to you under the Apache License, Version 2.0 (the 7 | * "License"); you may not use this file except in compliance 8 | * with the License. You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, 13 | * software distributed under the License is distributed on an 14 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | * KIND, either express or implied. See the License for the 16 | * specific language governing permissions and limitations 17 | * under the License. 18 | */ 19 | 20 | (function (root, factory) { 21 | if (typeof define === 'function' && define.amd) { 22 | // AMD. Register as an anonymous module. 23 | define(['exports', 'echarts'], factory); 24 | } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') { 25 | // CommonJS 26 | factory(exports, require('echarts')); 27 | } else { 28 | // Browser globals 29 | factory({}, root.echarts); 30 | } 31 | }(this, function (exports, echarts) { 32 | var log = function (msg) { 33 | if (typeof console !== 'undefined') { 34 | console && console.error && console.error(msg); 35 | } 36 | } 37 | if (!echarts) { 38 | log('ECharts is not Loaded'); 39 | return; 40 | } 41 | if (!echarts.registerMap) { 42 | log('ECharts Map is not loaded') 43 | return; 44 | } 45 | echarts.registerMap('宁夏', {"type":"FeatureCollection","features":[{"id":"640100","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@@CFGUKGQCMBSH[НJSEGmUQBLYgSeHECWBUJgBGV[DAPHHBrDDAG]DG@[FBCV[VP’GA[GYMYWu{‰sUoOWECCE_FgF‹DMAk¹FÅ`KY}WkMEGCJOTGJSLONW^OJja^[\\EFcTUJaDaZYLS^GJaRg^BLM@CDKAIBSBUH@H@BUJCHGF@DGLBDFB@BIFFFBDI@BFE@@BJTCD@BJBADHBzB\\FD@FCTBBBXVHRID@xIBaBA`EBw@MLADBFJDTV@B]TIP@FABQJUKA@M`GDCD@BH@BDADIB@JEFDD@DQLKFEDKVCPIJMHSFAFCFBD@HHXHHTJFH@LS^CJBHiHABGHSFDPCBKCOBIDMJIDOAEAAAMOGIGBArED]JFF@DAD[FAAEGC@WDADJJADGH@DNDADMD@DNFBDADIAAAWUICCCCKAEWUEAkRMBEHAG@GGOsLEGW}s`HRVj^xBDEJ™`aJEFGJGDGLJLXFTHNBDQZ]\\K`GJIHAPIJCLBFFLV^@DGXENBVDNGJBFJHT@PL@DINCPKNCRJJ@NPPAJENBLXPJJBV@TCPIT@PFNBBVFBBDHBHADKHABAJCJOLARELAH@NDHJLNJJFFDBFCNBFFFNJV\\BBAJQ\\@FBDTLHJJDBBDL@JCNCFCDADFRFHBDKJGHAL@HDBVDFFPFLLR@BBAHBDLNDFFHVPNFFHDLTFXRHLDLLHBHN@jKZ@NAFAXUJ@PITIRI\\C^ADCBMDILGFEDANCxAJALEV@BKLCJ@`PPFJIHQBCH@VDFAZMJGLABOH@LBPLZBBAEI@CBGHGJAVBHHXENEfDRFBGKSAKnEAK@iHE^GF@JFNEP@FKMODQBEhNLPZ@NC^O€ALGLKXEjEr@@[EOKIbChM`GHGAgPKZY[ŅUco•]oįÏ@ENOBEZEH@BCVGHCRQ^aRK„Yv[ZIVAhGPCRIvMfQRAZSVUbQVGŽKPC"],"encodeOffsets":[[109389,39080]]},"properties":{"cp":[106.278179,38.46637],"name":"银川","childNum":1}},{"id":"640200","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@J{AQWËIO¥‘ue“‡_]gkEKCCQWEKWYcqŸ{MU‘ěYZOLBhGH_HgNaDLJFP@\\q@iFWFKLKHB]PMDY@KOgMAFCRNPELO@MFIEE@]HGF@jBLmFBLLTAHQEeCMFWFGGUAIBGHAH@DFJABYAOKKAG@APKBIHYNEBUCG@ADGRIJOE_OI@KDALU@KFIBwBQFQRCFANAD{FQJSJOJI@WVEBMBY@iLM@@@GB[CKLOVCNANHNNLZRFBZRRZNN\\NLBPATLDJ@JJTFFLBHNLNDJBLABGHGFEHFHJH@@IFFN@RJZLNDVJLPLHJL^JNFJLR\\bVP\\FNIHMRORERAHAzENGJALFNHZHPHDDBJLTDLCPKVAR@JDfCLAVGVC`BFHJLHJ@ND\\ANDJA^LfH\\FLAVDNBJBPCV@`CPEbCRGBA\\GjGHBJHBF@LJF@LBDDBALFBDFCFR@NPJBFFPFDDBDHDFFDHLNHDJHJRRXDFJHzSPKJCjEV@LBXRpTVCLBTLNDD@DIDELAV@TALIFIP[@CIO@ELQPO@GIW@SH_COUaCM@IJGFKAICK@MLKXKXQHYHa^uLkJQXUVMlMFCDAFAFBHAF@VGFBHIHABEBIDCPBLKDCLB"],"encodeOffsets":[[109535,39993]]},"properties":{"cp":[106.376173,39.01333],"name":"石嘴山","childNum":1}},{"id":"640300","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@IHKHCHIFEbIš_FIAC]wUiGQt_X~FHtKHP@HBHFGNAlQFBXVBFDLDDJDXVBBJBBCACME@CNCBCMC@CHGBCIIBCXCD@FHBB\\EBC@CEE^IFCBqHAHJNPBBFBPBJCNIJCPALDDACOTEHGBAjGAGDIT]@KEGSIGGGW@GACDEBETENGJIDOLUFCLERK@CCCFE@IJABCACG@@ADCHCN_B@VLRIBA@EJO^S@ASUICAEBCNKx@FAB_bAJA@wJCGQWUAASAEDC@[EyAGABCIA@ADCIS@AF@AEJ@ACEEJE@AEAACHK@CHEDGVI@A@GVGTAJALBDCN@AKh]bQHIT]ZKbYbCVIdSFE\\[b]ŽiPIX]PMTKHIPSDIFHlN~XLZÆ_ºEBlCNEŒEhF`DDXFpPtV|ŠXvNZHZB\\‘HUOU\\ADEŽ@\\CHH^CBqCGAOGCBU\\AHIhAVDXGFTfZhŽKRAnVFHIT‰°G\\ATDNHRVLEH@DQZIVER@bM‚Q°Q`CDLFBJALBRGJAN@DDPNDHLHFAJGTGB@FHDBF@HCPDTCJDHDBNDJLLJLDBHAHIhETADBLFD@DCRODGXQ^GFIJOPK`IbEVK`AN@XGXKFEDGPUPKLEDOBC^UPOVaFCLAjENCFCDE@EJEBAo…KYBCNK~ORR`Ff@HELMf]uÜkVMJCLID]SqG]KSggK@KDGNEDEJC@KCGDBLEBGCIG@ABCJELBF@@A@EM@YMg@{GoMIKG]DYCWCMGOMMYQOCI@mII@EBUNIBgCEKJ[zIJAA[CCgHEAomCCQK@CDGGEGCOGeBCCGA[HhsXEtNHIBGEICOCECSESEKIGESIK[UkYGC]IMMCG@SBm@IS“ESSg@MBCDWAIIOAKFI@GHWL[FKLILEBCJCBEDB@EDC@AFABCAAHEACDEBB@EDABKDAACBEACBA@C@CAAE@SFGBOGUCEC@C@EJGXM^URIFEJB@EFCBCE@FCD@BCBGDA@GFAACDA@EFAACDAACDEBEACDCEABEB@@AGEFCCEBAAABCEADCGCBCAE@EIE@CCCEKECC@AC@CG@BGIMKRIFADCAEFADCFEF@@CBBBABAAGFEACEHEBM@@KACEHAHDD@@AGCBKHGJE@AMFGAKDgNEAIKME@DCFA@@DC@GJCBADGBADC@CDCD@BGFCFGBADKFEFGDORUGK@UCE@KCI@KCCAGCAAEAECGACBQE@COKEACFGDGLE@IFG@IAGCCCC@SHEFGAQPGBCDIQ@ABIDCBGDGAQC@ADGFE@QFICIJQFIGDAHCBGJCCCCAIDM@UFKBODAD@HINWTKDEDGDADKDABM@SJKCAA@GKECA@CZMB@DBNADMDCUA@K@CHCBEAAE@K@CAGEACBGGAIHKLUPWCG@]XGFCCIJEBIJCFEFGDS@UNADCDEBCA@BGDCAE@@@DAEAD@DCFE@AEEC@CL@AEA@CCMEABECC@CJQDE@CKKCGIGGIDENGEIASA@KHGJCJDFCFIBKACFBHACCAMJ@NDJABIAQAKDQGGDGHGNAAKKISECGACFALAHEDCBUESIGTK@GFOFEBCAACDGEFA@GCCCBAHIFM@EJMFQFGDAFMLANQHS@EAEBC@CDEBOFGACBGNI@KHEHCBCKOECQJE@IADE@C@AHIAECEEODKGMBKFKMB[GCDEAEBOBSJCDACGG@K@EDEBMDGGAGCGCGAIDGLCFBBH@FCHDUVBDCBCDGBGFQPGPGFC@ACAIFG@GNOHMFEECAECIBELGFBHIPCDDNALIFINANCHKFEBIECCEFK@CCBIFAABC@CFGHEACDABEHLHBBHNFD@JEDELG@AAAGBECAAFEBCHE@ECAKFDE@AEAGECBAAJE\\K@ACAFGAC@GAE@GGENAJBACBCBCPIBEC@AC@CDCAEE@ECEFA@AABIE@CA@CFC@GAGEE@CEB@EAADACCDCAA@A@CBG@ECC@KCEAGK@AAJOCKD@@GFEDADEJABCBAAAEAKFECA@a^@@ACCAAIKNCHG@IL@FCBG@EKAAEBMDC@@A@EEEDICCG@YJA@AIAAG@EAABCAAIEBIHAC@GIEGEKAEEJK@AD@DCBEBCLWC@KDAC@AGACFA@CDAACBECEB[KAC@GBIHOCOHKDK@CG@@AC_SC]MKBEAEFSDEACBEBKRCBAA@I@ASGACEDI@MISDMBE@ICHG@CACEEO@QCyQ]KUBEBMTCHOBKAOGABCNUJIDCC@C@GMKC@EDQFIB]EEACG@M@UBGC@IJUBYCWOEA]RCVGNLZAJgjYLAZW\\A`y|SlHd[VU\\cXD`E\\qd[CMJOEIF@H\\XILBX_TCTKHI@AJJB@HiZAREBK@CA@I@A]QGAECEBCFEBC@IELQ^[@IIIKEDGIMOQIEKECCBKACCCSCCA@GGE[GECCO@OCOIEEACBCN@NCJKJODKAOEKGM@OAOBGJC@WQECA@ILBBDHGPCNAZ@JDHJBJD@HEXBH\\^ABGLQJOND@HEDBJAHCFETCAHBFLJJDJ@BJDFBBF@HFRJDDJDHHPDLJDD@FDDALBDADDHBBB@NHD@FDF@MNÔ]rED}@MJspIF]H[NOXKbAJFFBH@RCFEB@PADCDmAGAkPWBIA[@IBKHCLMJSDHDT@LBDBBDFB^ARDf`LFLJZZfTJLFDB@HGBCGAAA@ADCBIHCHGHUFK@OGEACAGEGACLEBEDC^WJI@IZBX@LDL@FD`BNDNJADE@CHBDBDFADBDDADKHECCBAFBFADB@DCD@@BABOJDHF@@BEFMHCAGHBDABDDGDBLED@DCB@BCD@HAHQZGH@BjNNBZHLLLBJFDNBBŌUPHPRDJBF@HGHKHKLWLU@aRWDIDoZKHADDFDRDBDBhG^@DBAHSb@BPPNFpJD@LGDCB@FDL@DBFJAZžLB@ABEBBDEABDE@FFE@@DEB@DGFABA@BDIECDE@ABC@AFPDJAR@NHHALEH@HFLBLNBLDJBFDBNLNFFRFDF@FCL@FFBDFDVFLADBBBIJGFMTOHYBMHEJDBDAB@@BsrILEN@DDPJHZAHHCNAJBHFH@JALEDSFIJCB_@KDEDEBW@OCM@SHILEDE@@ABK@EAIIOKGGMKMEMAMAAAAkBABFHRN@DKRCLMH@DDDBD@JCDJPFXBb@fVTFFCXABMEUAcHW@QUGD_HGBICQDUBQDG@UKWIM@Y@qHGCUCKCS@OAaIUIEIgEgAFHHX@€LrHDNDL@JAREdCNGL@tPTFNJhJNHRHXVN`DPFJFJXXLLDHFTC\\EREJCNAjBNBFXlX\\P`PVBNCHCDMXUXS\\_`YdQpG\\BPAJDPDrFRAHBPLXDH^^LFLDXJZNRNBLTf"],"encodeOffsets":[[108394,39184]]},"properties":{"cp":[106.199409,37.986165],"name":"吴忠","childNum":1}},{"id":"640400","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@AKGACBBDABD@BDDDDA"],["@@AGBAC@EJBHHG"],["@@@@A@OLBPAHBBB@JKHC@AEIBI"],["@@NABFjVRPVN‚XNJLDNBDED@BCVCFI@O@CJGLEJIFIAIFAFCLEDGFAHK`WLKNI\\EH@LDTZPJXDXAPADBFHHDJ@TIJOLWYUKEGIDEL@LHHDJ@JCPBPFH@JCFKBMBCJEDBRNVXRHPLJ^LRRVRLCPALBJBJDDr@tEX@JC^Q^MZCR@E^AbMlQ`UlIPBHFHNDDBBHCLBFHH\\C`GHJBJJJ\\@fLFAJEVIDBBHBFJ@DALO^OH@NLLDJB^@bN`HPFZDFDFPFHpffTFBF@\\CJBDFBJNjBBJGFANBJHF@NCHBBBAVBNDNHRPX@BA@KKEAC@@RCXADEB@FBFJDLFPBBBJLDPVADDDJHHLFF@LFH@HA\\IR@PHDDAFNCHELBJFB@RSXUHAJFHGFDDAF@FCBMLMH@BDF@CFBHDHDBPS`GFCBCCIFG@CCGAKGIKCKKAC@CEK@AHAHEDG@GGCCICDE@ALKBAIBKAC@IGGBAHCXFHCLQB@FHFCJABCCEACBELEDEAECAI@MHODCBCCBUACC@CECAB@AA@DEBKEBAAA@HIDANIBKAGDI@CCAINIDCNKPIFCHCCGDAAOCAABKNOLSBGFEH@FIHADGDADIFBDHLBHCLKTGJKDAHLHCD@DBHFFJAFDD@FELBFCHDH@DJEF@PEDBBCHFF@@IDI@AD@DABCDCBEDJF@@DBDCH@JDF@DFFD@B@DGBAB]DEFBBFF@FKD@LGD@HCD@BLDTHHB@HEEAAC@GDMAIDGLCDBBRD@LGHDDHNBBB@AHAADABHDHGFSNQBG@ID@BEDAJB@CDCLGBFDDTINJ@AFIFC@DFAJMRIBABABBDCDB@BD@DED@DCBRBDD@PKBPHBBAJCFGBEDABCHCDABHDDADLDDDDCFB@CJGFXFDLQD[AB@CD@DEDBFC@@ADBDBDF@HADBAC@CJIFIBQFEFCDED@DDDAFE@CJMF@DDJBBA@CHGFKHCFACIEGDECIACFGD@BDDGBAFBCK@CDFDG@JBJDBHLFB@AAMAG@AESHEHDHPHHDAHEIG@GAABMABA@A@AAE@PMP@DU@B@FDC@FDABC@GCGDC@IDAEAGB@@DB@BM@DGAEBBBAAEMCCACC@GACBCFABBJ@CEE@@C@@AK@WECQC@GAEAM@GFCDCRAFENBAGCABOCGGGQEGKAAEDA@AKIEEK@]ACC@EDAF@JDD@FCDEDACEBGCA@BHADA@CCCDABAAHUBKFGFCJCDBTCFPDDFBHAH@FFHKBGDC@CGQGFEACEMGMDCDGDGI@CAAEBBO@IG@IHIDE@MESSA@CDIAEDA@BCECDCDI@EQIE@AA@CFGJCLATCB@BHBBHEDE@EDEAEEDCBCFE@GG@CF@BCJ[@ABBABBJD@DCAOBCTU@CJGDEDATJBADCJSEE@CBARABE@CCCICA@EFCBKAGBEDGAAEDCFBD@BSDAHBBAEABAHBBA@KECHKGB@ABKAEEAMNCAACCOBE@AWBA@DJ@HCDQJE@C@EE@CBGCSB[CKCAGBMJGBMCMBCKCBCJEDK@EAAC@ELQAAEDEEFC@EEKKKIEIBEFALABECCAED@DC@AAA@CHGAAAA@EFIE@B@JCBEAMIC@AFE@AABICWDEKGAADEJDD@DKAEGAIDE@GCAAEFAECBAFA@GDYTiVIJAJA@CCE@ABHH@BEBKCAIEG@AFK@AKF@GEBEGI@CBELCB@IAAI@CBCDOFKPCDADCX@HCBC@EECK@ICAAB@PADE@AHABG@CA@E@EFE@CAAGGC@KDO@EHK@GHCBS@KDKAWDE@AABK@QAACHEVK@IEK@GBSAECBC@AKEDC@ECA[EMCU]EEIMEAE@MG@YBGFG@ACC@CBCLDB@BQFGBETGCIGEAGDELGJIBCAI@OBAFCDCJ]AGDCJEBCA@EAKDMHG@A@IWEQCIACFKCKDABEMEMO@AFMLADCCG@EVIFEBKDGAUJCNDH@LDD@BECSESJAIIAGBGHGR]BOHEBA@ACCKSEUBAFADICG@KJIBECEBAPMAAG@KKIBACCQEGFOAAIGIMECEECCQEK@@CCAQKACEAADE@CAAAKEEKGECKGEC@IHC@GGWCKGULI@ECAEDKLQBKACIEACKIK@CBEFANABGDUAKHGNEDGBADDN@HMJGLIAIBCDAFEDIFGF@FBDBHOTITMBK@EBKLCTGHIHAHDHLHBH@FKHG\\@FANCRS@QFC@CCOAM@KBEDCHEXC@@CCACAAD@PADIDECCOEMQG[[SKK@DGAECEAKEGBCAEC@CDE@ECACHMAEI@CBCHANGN@FFFBDABMD@FFH@FABY@KXDFBHMRDJ@HEJ@F@BGBADD@BAHF@BCDE@GHDJBFCRCNAB@JDDLBHAH@BBH@DJBBLDDB@FADGHCDQBICEGBGCOCCC@ABCVCBAA@EAAE@CBEBCAA@@CYCSCSAEBAD@JKJADBBH@DFATCDG@CACEC@OLGDQBIDC@EBUA]JU@[FQBMFGFCDC@KCM@GCBGAIUBIHGSAOCMCCGCGYIOEAC@KJAdALFJADAD@NANCDSIADFHFF@DG@CJADFJEHAJELMIMCEECBOREHMH@BEF@DB@J@DD@DGFDBABGFODI@GBKJBHCBIACFBDHBJ@DD@HHNADGDCACEAGGEQF@FFPAFEDG@IAEEE@KNABE@CB@BADFPHH@BAHBDDBBD@DEJGDMBIJYEABBP@DAJJHHDJCDBBFHHDNFHJJF@BCAGAAFKBUBEH@LCFBHLLJFJDBBDFPAFEFKCEFC@GEAICAEBMPEBK@CBEHI@EAGGWHAB@PABI@C@AC@KAAC@EBADAJAFABG@@AIAIEEBCEG@CCMAECACG@@CEAOGaEMECC@CBCACSBICMDI@@CFMDG@GCKGCEGC@CFCPNVBJCJILEBWDQKC@KJE@WGKGC@GHE@IACFCBSBGFAFG`ADABGDEAKII@@PDJDXAFSLMCEBIPCtALCBEAIIA@ABANADC@IASQGGO]EEEBABKTBDVX@BKEE@CBBFDF@DEVGNAD^TLMHABBBDBLCLGHKHMHICGBKDMLCEKAQHORKZAHFFFDF@FADBENAZCFQNAFBDDDBFFFF^ANDNCjFFD@AB@BH@@PBDEFBFBBABDDAFDDBHFAFBDANFDAJ@ELCB@DFLJJFABHLJH@DBDCDLDEBD@RBDJ@FFLIDBT\\HFFBLVJ@DABBB@FIBHH@FBBCDABDJHH@DABCFEBBFCDBDABDB@FEDBHABBBDFAPfBB@FENPCBJDLNPCFQLGF@LKFBFENGPBFAF"],["@@AIAAABCHI@EB@F@F@BCBGJAFCBEAGCCEMAAA@EOK@EFI@CMIC@ABBHAFOJAADGAOACQAKCEAACBCKCCACAABELABC@EGO@AC@IA@A@IFQBCCGGE@EAMCCCO@KGCDAD@JELAT@HBJDHJF`DB@FGH@HBNHLJJ@PBFFL@NFHHJBFCRHDDBBF@FBJ@D@NHF@HANDLJFBPCFDFBTBFCBECEIMAMFIEGFI@A"]],"encodeOffsets":[[[109061,36594]],[[108620,36306]],[[108619,36271]],[[108021,37060]],[[108600,36305]]]},"properties":{"cp":[106.285241,36.004561],"name":"固原","childNum":5}},{"id":"640500","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@BECCOGQ@cLG@KEE@KEGGCICCUBCOKMOAKEICAIHGDW@QD@FBLLB@@AOWGQCMAMBUAAGAMDE@IGMAEBIHAAMiAICEIA[DE@EAeSoeEGEOECYCOE_GaM]@IAKCMKG@]PKPCBI@AEAGCAUJIFEBeK[@IIAIGI_H[DGGAEDKAGCAMCEGAGJOVkR_NkBaF]Q@YD]N]RIDW@sFq@CCAIAIBKDOQKQUKQI]OKQGUWQMCAIFADANELIDG@OEOAIDI@GCKGK@CFHJLFZVKXIPSJI@GCEGCAOBWBWCOISYKCG@[FMJKL_XGLEBCHKFEDEBBJEJIJKFIH@D@PEJUDADC@CFMAKCMIWUMQOiUAEMBGJ@LEAABBJ@FEHEBADIFKDGFEZBHHHHPENGJ@HDDJJL@DDFR@LGNIJOJCFCFAPABQFU@EFMD@PABEBCDADDFG@ADC@EDAFCDBBABEBAF@DELB@X@FD@DFHINWBA@In@LFX@HCBIFGFAFED]G@IAAABIJAFBFLX@JBFCDELBLDFAJCNGPYVIJMHCHQNINC@OEECIKCAC@EDMBGAKECHEAA@CFAFEACBEFA@EAEVQDHNTJF@JHH@DBELDLAFIHGPBBHFAFONUCKXE@@B@V@BO@CBAFE@CDGACBADFFAHFJBTFJEJa`M\\@JAHBDFJFDRdTJJCP@BDAJ@DBB^@^EFB@JHJ@DBBNCP@NCRMH@RBTRHVHBHD@FI^@LCN@JCLIAOHQNKFIJCF@LGDCB@FBBF@BHeTBBBHAL@HADGB]VWVEEC@ADFFIFEEE@OOCDALGEEDUJGCGDAEEAECBEC@BC@AYLFLGBBDHCBHC\\IZTEEF@BDB@HADBJGDBDGDCRBFEHIDCDE^@ZODUAOBS@ODGBMB_LGFOFOBQJOJKEG@MMEKAAK@EDCDaNF^SHYAEHAACGA@YCEAGBUR@~ANEHEDaF]TCFHR@DAFINEDIHMDBBAB@BDBCFDD@HBDGAEH@FGNCHIB@DIHYLAB@LADIHADBfEFBDADOJ_LKLABMBO@IJCACCKCEAAFCBAFGLUJSOOAMEEKICIIMECGWMW@YGKBGEIDI@IAIJA@AAACICUBECGAMBIFCNKHGJGDShAD@PHTLPDHADFDJBHAFF@JKLBHHFPBZQH@H@JLNFBXLJNFH@N@\\VDBPCDDBHFHAXG@UIMBIFSFODIDM\\AHBFHHDFDJBTBDPJBFQH[BGDCDSDGBQEQ@GDE@KNEBqB_FUGKAGCKJGBEDADSDGICAI@EGOGOAMDgEMBQJGVOTC@KCsKIEQEIIUCGIKCiD…KYAUP@N`\\hNJ@PIJ@bLPPNHjA`HFdR~VAFHĤHâHþRîNJBv`†XŽ@lLĈNbN¢xjdDDRFJ@VD~\\nLVLNLbPTD^B`JbDbPhNR@L@^F`BZF`APDHBXC\\CfQpEHBhApBh@¨H^@JDLJhBhFFJVJbJPBT@LDVDHDrGZ@N@XJVLH@RCVARCJDHA`GHCRVX@dGVBNFBADWEEUS@eAaEWIODC@IACCC@CNGDKLQ@CQMEGBAlABBBBBNFNLNHNLHJPBJ@FAL@BF@FCJKTGN@PDX@FAFCLC`@DAJITEFCBK@IEGAGBIDMGGYBIGCO@CFMJKtq@AA@CBCAFINGZAPGNSHEJIAACAKBUEECACEEK@EDE@ECEQMEMKCAAECIAKKMKAGEG@KFGBMGQ@IBOCBED@BAF@DCJFACB@BAHE@CFA@CF@EEF@ACFBACFABAA@KBYEICAK@ECA@CDKHC@oIMEOO@ATaBGCA]@gHCACACQCEBCTMhSJCXCbQV@XKDCTOHG@GEOOQOGŋVAACMIEKAKKYGMAiM@AHGRYBG@GDC@ADA@CFCAKHCCCBAACHGDBNGFE@AE@CGPIBA@AC@CDA@BCAEBEDAFDLGBCCCCAEBCEDIF@BCMIMC_AECK@KCW@YA@JIJ]XCDAFKFBDFHBHBDHF@PELGVGHGDAJCD@BBBHBADGHA@ECIKeSYYKIKEe_QC]BEAACCAKAS@GCTCNIDKLGJA\\@JBXAlOHBnBDCBC@OFADE@QAGEEBILaPW\\M^GJEtoNI~@FC^qžÓNME@ECC@MGA@AACGBCACBKCC@ECCKIOCGGICCCQIGEE@AACEAII@ICKIAEBGSDEFGDIBCAGFC@PMRIHKBA[]AGFW@GICIACG@IBYDMHOCGAAJKB@FDXRD@HIPAPBN@LHPFLBPCLIDI@MDMDAFBJFDP@PDPFD\\HHF@HDBTDDDBDALDDLFJFPRJNCHLFJJ@J]\\KRJFD@FADEFAFDLBPNJD@B@JDBL@FABQjY@GIABIJ@LGDS`SAWJK[W@GJEPFNI\\DrcF[C_dWV[\\UGcTkz{B_X[BYZKhiBIKYHMDU^QFBXPZDVAJID@AH@V@NDHFB^FJAREFCD@NL@H@DDDJCVIDMBAPHLBPADGNSFAVA^LzRRDP@FFBD@DGHJDF@NATCNJJ@FCBDTH@B@JDBNSFAFABCBO@ECC@EA@@KDEDCL@FEFABCBEHC@CNEM@QEM@@ABAJCHIAECAAIO@EEKFQASFCBADSPWJ@ADCACAGEIDGEGEDIJC@INKFEHC@CBA@BEEA@ETY@QXGNFN@JCJM@EJCJEDICAAEIE@A"],"encodeOffsets":[[108965,37396]]},"properties":{"cp":[105.189568,37.514951],"name":"中卫","childNum":1}}],"UTF8Encoding":true}); 46 | })); 47 | -------------------------------------------------------------------------------- /Dashboard/public/static/China/js/map/province/shanghai.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed to the Apache Software Foundation (ASF) under one 3 | * or more contributor license agreements. See the NOTICE file 4 | * distributed with this work for additional information 5 | * regarding copyright ownership. The ASF licenses this file 6 | * to you under the Apache License, Version 2.0 (the 7 | * "License"); you may not use this file except in compliance 8 | * with the License. You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, 13 | * software distributed under the License is distributed on an 14 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | * KIND, either express or implied. See the License for the 16 | * specific language governing permissions and limitations 17 | * under the License. 18 | */ 19 | 20 | !function(B,A){"function"==typeof define&&define.amd?define(["exports","echarts"],A):"object"==typeof exports&&"string"!=typeof exports.nodeName?A(exports,require("echarts")):A({},B.echarts)}(this,function(B,A){var D=function(B){"undefined"!=typeof console&&console&&console.error&&console.error(B)};A?A.registerMap?A.registerMap("上海",{type:"FeatureCollection",features:[{id:"310101",type:"Feature",geometry:{type:"Polygon",coordinates:["@@AHV@BDCPEPLENFHCJHFBNCAGBGXWFIBGCGMUKKCCcGCDGBALCPIAAPGR"],encodeOffsets:[[124373,31970]]},properties:{cp:[121.490317,31.222771],name:"黄浦区",childNum:1}},{id:"310104",type:"Feature",geometry:{type:"Polygon",coordinates:["@@CEAMMAA@C@AFA@@BC@ABC@@BD@@BH@@BB@EHDDCBECADGEEAEBFNET]CMRELQjOEGRFBAHDBAHH@@B@BDA`H@F@BC@AB@FD@DD@@@CH@DDAFDD^LEPF@DFTDPHHQBOJBDOBKHADCOGCEAE@EFOBMAEUW@GBEHILMBE@KGM"],encodeOffsets:[[124381,31859]]},properties:{cp:[121.43752,31.179973],name:"徐汇区",childNum:1}},{id:"310105",type:"Feature",geometry:{type:"Polygon",coordinates:["@@@AACE@FO]KCCBECCG@@D@@CCmBSAcKG@EBAEGC@DC@QE@CA@@BEBMTNFAFDBA`D@BDA@AA@FFBBLD@@@IBDBABDB@@DBADB@CHA@@DC@C@@@BBABFDH@AHD@ACDA@FD@BCA@@CJCNWJ@BCHAFEF@XCV@DFH@VFBBCFD@HEFFFBB@@IDAJFBABIFK"],encodeOffsets:[[124354,31964]]},properties:{cp:[121.4222,31.218123],name:"长宁区",childNum:1}},{id:"310106",type:"Feature",geometry:{type:"Polygon",coordinates:["@@AB@PCJBNG@ABBDBB@DNBAJJ@@FB@@H@@@DF@ENB@BDD@BAT@BENDFDPB@AF@A]G@BOCKCEBA@G@KBEDCLMVQ@EACDECABCDKECGDMEKFFODOACU@BGOGUCELAJABIECBBNFHJBTLHB@BADDD@FB@@DC@BHOVUJCFIG"],encodeOffsets:[[124340,32022]]},properties:{cp:[121.448224,31.229003],name:"静安区",childNum:1}},{id:"310107",type:"Feature",geometry:{type:"Polygon",coordinates:["@@DB@DHBBCDBB@A@DF@@DFDDHGBDDALZCB@@EBA@ACQ@@DGBEFBB@FD@J@BFMBCCCDID@AODAEIDBDEBABBB@DC@AF@@AFGACBADBB@@NFADD@@BB@B@BAB@@@BBDA@HBB@AJ@@AD@@BB@AFHBDCJFHBGQAAJA@ALCBBF@@AB@@BD@@@JABDABD@@BHBBBNACEJA@ADAAA@B@ADAAAJBIQB@FCBBD@AGJ@@EJA@EHADDAB@BFANNDEVIPUAGD@@CA@@ECCBC@AGASKIAEGACA@EAEEA@EFC@DEAAUEG@CEU@WDE@EFGBADI@MV"],encodeOffsets:[[124267,31987]]},properties:{cp:[121.392499,31.241701],name:"普陀区",childNum:1}},{id:"310109",type:"Feature",geometry:{type:"Polygon",coordinates:["@@@OHWVFBABIKK@MJCJGBKV[C@@I[AOEODCACCCLADDBCFBD@FURQT@J@F@HABDFDLAPH@BTVCLBBE"],encodeOffsets:[[124402,32064]]},properties:{cp:[121.491832,31.26097],name:"虹口区",childNum:1}},{id:"310110",type:"Feature",geometry:{type:"Polygon",coordinates:["@@@JD@U\\ALIHID@NLLAJABUEGX@PVA@ZDDADGFX`ZKDHFAFHpSNGDCDGDM@cBGL[BKAGEGMOcY[GWA"],encodeOffsets:[[124433,31997]]},properties:{cp:[121.522797,31.270755],name:"杨浦区",childNum:1}},{id:"310112",type:"Feature",geometry:{type:"Polygon",coordinates:["@@@EBAD@@A@E_GCB@A@AG@BGCABGEAHQPFRiFKNQ^DFSEMFAFBHFBCFDDACCFGA@@AG@@AC@@AD@BAD@@AB@BED@B@F@B@FBBNDFLCDBCBFB@DFG@CBBABDB@CDBAFCB@DABD@B@DB@BD@@B@BB@B@@FJ@DKLFB@DMDBBABBCFDB@@HB@BBABBDCBGNBDAB@@BPDBAF@@AB@@AB@@CDB@BF@DGB@@CD@FDADF@BADDDCBBDCAAC@BCFEAAB@FECABC@ADBBEB@@EGCABAB@@CAA@CAIABAAA@@ECDGD@BCBBD@BBHBFALABAFBD@@CGA@BC@BCEAA@A@@AEA@@AAA@G@DCG@CCBAAA@ADBDAEAC@ACE@BCC@BG@ACBBAEAAA@B@CECDEAEBAB@BDB@DBD@BBD@FDBGBBFCAABCBDBCEC@UBACA@AAA@ABB@CCCE@AA@ADCD@@BF@@FB@@BDB@CDB@ED@DFB@ABB@HDAADCBE@CCACC@CACIABA@@@BD@@AD@DICABCECFA@AMEO@@CC@ABA@@ABA@GCACBADCDA@@BAAAB@BICADE@@BEAABC@GHC@E@@FD@@BA@CFC@@BC@AASEKG@ACAIZBFGDYCIAKGKAU@OCGAKIMIMCOEeC‘WOBQHI@C@CBB\\HBPTBHJHABECM@ADBB@J@F@D@B@FBDAD@NBBBN@T@DBBADFCFDDGTDJFAFNB@DB@EFFBADD@@DFDDCDBADERCDAB@DELGAADMCEPHB@AB@@BHF@@GNQV@DEJCDC@ADD@@BCFABADA@@FCB@DCD@DABA@EJEF@BEJCLGJABCHAB@BABCFCB@BED@BA@@BABADGFAAA@@CAAKGCAKAUTC@CDDBADIHDFCF@@CDBDCHDBAHGDBDCDABCAABAFKACBDDABBF@@@BHBBDDBC@BDFFFBBDD@@AH@HB@EFC@ABC@FFCFBB@LCFBBAEGFEDABGJMJCL@XGNFH@PDBB@FHDBAAA@@D@D@@CB@DGA@BCCA@@CABACAJA@@C@AKEA@EBBB@ACC@B_CABEMENSFA@AB@@DRFD@@CHDBFFAH@dLTBjA"],encodeOffsets:[[124327,31940]]},properties:{cp:[121.375972,31.111658],name:"闵行区",childNum:1}},{id:"310113",type:"Feature",geometry:{type:"Polygon",coordinates:["@@@JE@@BOAECMCAFS@ABC@ACA@FME@@C@@@GA@@EI@BIMA@CCA@CBAH@AMDI@OBACEEB@ABACCGB@FIB@FI@BHC@AAEDA@JRIABBCB@B@ABBCB@BIBDFMBAAGA@AC@BAACIB@@C@@AA@@BE@AAKD@BIBBBHRC@ICCCCDGABEA@@AC@@BI@@BAA@GCBAAA@ABBBCDAAEJFDB@P\\J@@FB@@DGA@FD@@DAAADCF@@ABBBCDDB@DF@CLCAEFEB@DG@@HD@DB@BB@@FHD@BADA@CFCFABDB@BED@BCDEFFBABB@ADG@GNCBFHAFA@@DCAIB@DB@@FBBEF^JBAH@AFD@A@@DA@@BFDABD@@JB@@BA@AD@DB@@FCJ@FA@C@ABAAABENDB@BCDCFG@ADDBEDDDABA@ADB@ADF@BD@BEACD@BCBJF@BABA@BBCFE@ABCLABBBAFEB@A@BCDEBADD@CBBBBAADBBD@B@BBADFADDDA@ED@ACB@FF@DFBBCB@@AC@@GF@B@AFD@@DB@@AD@@BD@\\PfK^I|]BAEGBE\\Q`W|i\\UdSXUBD@DFAEG\\UQQQY@QJONIVIEGEBCGYLW_HEBCCC@YUBAFKAUD"],encodeOffsets:[[124384,32068]]},properties:{cp:[121.489934,31.398896],name:"宝山区",childNum:1}},{id:"310114",type:"Feature",geometry:{type:"Polygon",coordinates:["@@A@A@@AC@BCME@@AABCDAHBBE@@BED@@CAABAFAACJCBFPC@BJCDCDDNAAEI@C@@EAAFEHA@CR@BDB@FA@@DAKYCBACGHCCCE@@CEB@A@CAADGA@CCAADGB@DB@ADC@@ECBBDC@BGG@CCIC@EAAOCG@OEUHK@IDINAHCBEFFHABEAKDA@EAED@EAD@BED@FGAG@@BC@@AC@@DA@@CCBEA@DGAKFOB@CG@@BAA@CGCBAEA@CA@@DEA@FCFB@ABAAABAC@AAACFGEBCABCCABCCABCAB@@CC@ADGDEEC@EDCA@BA@BDA@ACEFECABC@@BB@BDC@AJIJCAADC@CGEB@@AB@BDF@JDD@DHBABD@B@@BCHE@@BC@@DCA@DC@@DDBADA@EDFBIPCFIIBCMAE@AJ@B@FAB@DAJDB@DDB@FD@@BCBBBB@@DABAB@DCBBBAHBB@FMCKB@HF@EHIACBE@BFCBBLAH@DD@@CD@D@BFNBCDGBAFTHBEBB@DB@@AJD@ANFABBBD@ABD@@ANDBDCD@BABA@ABLDCFDBF@ABC@ABDB@BFDADJDDCCDBDCDAAABBB@BC@ABA@ABC@@HA@C@@DJ@@DFB@BD@HB@AD@ABBDFA@HA@@CA@BDABOBMFAFB@ADBDAB\\LDAHBBADBHAPFJFAFBFFD@BJHRD@FHFNHDACCLADBH@DDFABHCB@BHJF@AJ@@FAFDB@AEFE@CBIHB@AC@@AA@DEHD@BD@ADB@BDB@AKD@@DBA@@@AD@DBBDBBDBD@@FDDBA@CDAHDBBHDADB@FA@BD@DCD@BFFCJD@DA@FBBDFADC@A@BFABEAABADKBAF@DEAAB@BA@AIEDA@ADCFB@AACE@BCA@BCB@BACCFCCABCH@DEDC@ACAFMBABBBAD@B@@EDI@EA@@CBCB@@AA@@IC@BAEC@AB@@CB@C@BEG@AB]IFEAA@EA@@CJADB@CB@BEEGDAHMH@BCA@BAEAFEDC@AFC@ACABALQGC@ECCE@@GH@@CFAFEDBDKE@@CCADCAABA@@DEBCBB@CC@@EHB@CA@@EI@GMEMICFIBBBABAAA"],encodeOffsets:[[124249,32046]]},properties:{cp:[121.250333,31.383524],name:"嘉定区",childNum:1}},{id:"310115",type:"Feature",geometry:{type:"MultiPolygon",coordinates:[["@@bM²WLCļÑNI^_È€sJQ¶±`e`Z¡LƒD‡CsEWOWs@GBI\\wsYg|QNUBģFq„AZHZB@@JHBAJFRA@BB@HABB@@J@HBDBLAJC@@BD@ABA@B@AD@FB@@BA@@BA@G@@FC@AB@DA@ABCAC@@DEA@DD@BDEF@FQJE@CAGJA@ABCAEDBDGHADWR_TYJI@G@SD@AA@@AA@IDGB@A@BQBmAA@CBOAGFELC@AAaDACS@C@@AIAABKA@BEBFDADDBCJC@@BC@@A@@ABJBBD@DDDDB@DAFCDBBGCA@BAA@CEC@@FCA@DCA@AA@@EE@@AC@CD@BBBF@DD@DAA@BBB@BDBAB@VFDADACADBBEDAAAHECC@AAC@CAA@ACA@ABBFCFFD@D@ABBFBABDA@BAHD@ADF@BDD@FBCBCA@BBBABDDH@CDH@B@BB@@FB@BB@B@FBADD@@AHB@DC@EAABKBEBGAAAC@AAADC@CHFD@@BBABJBDBB@DB@@BABAHD@FA@AFCA@BADDBEFA@BBEFADD@BBCDAACDCCABE@BCECC@@DA@CHE@@ACA@DA@@BA@@BE@ABOC@AA@CBMAAHCDAAAB@AGA@@CADEAAABCACNA@KECLC@E@@EA@A@@A@AC@@AAAA@A@C@BA@CDABEAAADCABAAA@DEH@CEADACAKDHN@LAFKNGJAF@D@DBFNLHLANEP@FBFJJJDdHDDLLNVDHAHEJWXAF@FJFHDtDXHhZNPFHBHALK\\AH@dCNCHCDMHoTUJMJIP@RRZRR"],["@@PDNAvOFGBKCeEQGEI@IBMNY\\GJELATBJ"],["@@HRHJNBX@XCRGfEFGBM@eYuGIgCIAK@KDMPIREVCXARBP"]],encodeOffsets:[[[124438,32149]],[[124808,31991]],[[124870,31965]]]},properties:{cp:[121.567706,31.245944],name:"浦东新区",childNum:3}},{id:"310116",type:"Feature",geometry:{type:"MultiPolygon",coordinates:[["@@DBBAGCBD"],["@@HADA@AGCKHBBF@"],["@@FACAAD"],["@@DB@EB@@CB@@GEQ@IEKAM@ATE@EHADF@GDCFFPD^BBED@@BD@@DPBB@@CDB@BLC@ADB@BF@@CF@@DB@BDCDA@@DCACBC@AB@HDBRTHGBCHBDB@AF@B@NACQ@@@AC@@CC@CIEE@CFCFHDBHABDN@BED@BDNA@HAF@FCBADDLD@DAAC@AB@@ANC@ANC@TDBL@DGJC^BDBDBJ@^F\\VHGPB@CD@BAF@DKDBBCA@BAC@FK@E@BD@@BNABCF@@AFB@AD@BADB@GA@@AF@BCFBDKB@@BDBB@BEDBBDF@@CFB@HD@@F@@@HA@BBA@BDC@BJADBBLB@AA@@ED@DIHA@BB@BDDBBCBA@@@BF@@CB@ABFBBCFB@BD@FCF@DBBAD@BAD@BABBBAHDJ@ABDDABDBHCBDJIBOFE@IDKJAFCBAJELAAEBCBKAA@GD@AIBEAIDOK@@EDEAABA@A@BB@@@B@B@AAD@@ADA@EJ@@CB@H@BLDBFA@@B@@GEB@EB@@CB@DETAAADA@GH@BHLAPA@ABBD@JU@ABBFCB@‚£«ugW›OCOCgB‡DaAE`@HCBBFCBAJA@AFDFAFFD@FDFCFBBA@BBAFBDA@CDAAA@STCBWLAAABBBCBAACB@AABBBIFAPCHCFBBCB@HA@CAABGPIBO@ICCEDMGAILADACCBCA@CECEAKCADCBADAAKAEC@HEBCAEDQBACEAAB@BGCYDEJCB@BBFN@B@@JDbHRJL@D@FA@@CCB@DABBDEFACSDA@AAA@DDBLFHAB@BABCAIDADABCEKCABC@CDABBBC@@B@BA@BBcO[@MGDCC@DK_KFMGBCFGADEA@AGCA@@DAD@AFB@BCB@DGOCCLKR]JADEAMMABBCA@CB@BABCAACB@CEAB@CAAGBDFGFHFGBBDFHF@BDB@ABBFDADFF@DHD@DFFADDGDDDADDABDA@DDCDFFBDEBFFDCDBCBDDEBBDB@@@CDCDI@GB@BBFAB]DAHCDDH@DDBHB@DHABDB@@FG@CABJBl@FEFCFBB@LB@J@@GPDA@DD@AD@D@@CCA@BCA@CB@A@@AF@BGFAADDB@ARF"]],encodeOffsets:[[[124321,31442]],[[124337,31429]],[[124341,31419]],[[123933,31687]]]},properties:{cp:[121.330736,30.724697],name:"金山区",childNum:4}},{id:"310117",type:"Feature",geometry:{type:"Polygon",coordinates:["@@@DLB@BFTHAFB@DABHFELFBBAH@DIHB@GB@@CB@BEDAB@LAPB@DFBADD@@BBBN@@DRB@BADALHABlH@@\\ABAFQPOLDBDBDCJBBJFA@FCJC@@DCAABDDBDKHB@CDBDEBCEINHDABFB@DDDD@F@@ABCAA@EB@@CH@B@BCBABD@DLBBCB@R@ADD@BAJ@BBBB@BA@@NG@AFELC@AB@@CBA@KJAAA@CAC@CLD@ABBBGJDBBDCFBBDCFDADBBDCABB@@BA@HHDBABFFDCBBDCB@BABB@AFEBBBED@FEDDBED@BALB@CD@DEHBBGDBBCB@BFB@@LC@@FJA@AJB@@B@@FB@@HH@@BJ@CJDDADDBB@B@BCJD@DB@AB@FC@@FC@@D@FDA@X\\ILF@CAA@ABBJ@DEXFPBI_CM@CF@NFF@BBB@BAADBLFBJABHKB@@L@BHXCAGBAF@@BB@@BCFBDDBD@BB^ENNEFEAEHCC@DBB@BB@AH@BFCD@B@ABDB@@FAF@ABXFnNHKB@BA@CDC@CDA@EB@BCBADE@AC@BCD@DCFI@CRUHM@@GE@AA@@BGAFONDBCHBFK@CBAHODICACDEC@CC@BCEAFEA@@CMABEIESCCHECEDBCAA@WAMAA@MBCAC@E@A@C@E@IAABCN@FDBAIGAGOSGAA[DAD@J@XIJ@PDDI@ODK@UD@BCAAGADSG@CAA@AABAAAA@@BECBC@IFCBC@CIG@A@AGDCABACCBAA@@@G@GCCB@AABC@ABC@ABCAE@EDC@@AEAADEABAA@@DE@@A@@ABADCAACA@@AGBCJC@@FB@@BMCBCAID@ACB@AAB@@G@@@EC@@GEA@DE@ACCAAFA@CA@AA@CLEAADE@@BB@@HCAABC@@BEA@BE@ADMB@AC@@A@FELD@ABB@ADCACLE@ABC@@DOAGH[U]EI@CACA]AIDCHK@CA@SMD@BMD@BA@@BBDCBC@CKBCDA@EBE@GMBACC@AFM@ACGBCAEGED@DFFDJD@@DD@@B@@DRMBA@E@@BCAGAADGHQSCA@GBAD@DADB@CB@DCACA@@CE@@DE@@ACA@BKD@ACA@DA@OA@CC@@AC@AF]AOCEECD@HCEGB@FSF@BBNFL@JFR@HA@@DA@@FCA"],encodeOffsets:[[123933,31687]]},properties:{cp:[121.223543,31.03047],name:"松江区",childNum:1}},{id:"310118",type:"Feature",geometry:{type:"Polygon",coordinates:["@@@GCIBA@@FADHD@BCDBJIBID@ACA@@AD@BAFDFEBDB@ACB@@ADBFCD@FFHCBCD@@DA@DBBADDBADDBAADHFDEBB@BBDBABBBAA@DE@EFB@CB@@DFBABHD@DBB@AH@@DPALEHB@CFBDA@DB@@CD@AAEAEEACD@CAACGA@A@@AEBACCDALBBEBADBBADCACHCBGCADGACDC@@DECEJGBCCADCD@VSLBDBLHBB@DB@BBFCDEBA@AB@@AFC@ADADEBA@ABADGBAHIDKJOmMWEBAE@EB@@CABAA@C@ED@ABGA@@AAA@CDDFGFBFEMM]FAAC@CAACDE@AA@@AE@ABBHWDAGK@@@LAAGIBEAAKBCABA@AAE@MEE@@DDNJ`OAWECFI@AA@BBB@DKE[J@WCB@E@CD@@ED@@EBAA@@CICADA@A@CABCCCDII@@AG@@GA@@EA@@@IA@BIB@ED@@KA@AEA@ADCAAHGACFC@@DKAABC@AFCCEFC@AFAAEF@BAAABA@CDAACDEEBACAGGB@@AA@BACDAABCECCDAADGAACAHIAABAC@@EDEB@HBBBLIB@DA@@BAD@FKBEH@@MB@@AAAAAI@ABC@BCQ@A@ADKA@CACABADA@G@@DA@@FBBAD@BE@C@CC@CEABAGCJMDFFAACDCA@LGACCCBADB@CD@DI@EEBAIIACDCACAPKROBEBA@[G@AkGBBKBC@AQA@CM@AA@AC@BCEA@COAKBA@CBAFA@@DA@@HGACJG@ABEAFKGEBA@CEAGBEUKA@CQE@BCABCEBAHE@@BB@A@@DDB@ADB@DC@C@@BCCB@OC@HM@AHC@AHF@CHBF@BC@@DB@ADBB@BNB@BB@@FDB@DC@A@CRA@CFBBAFGAADDB@HA@@DB@@D@@ADBBEJDBM@ADg@ABFFABGBCNGBC@CACBAADAAEFACK[AAAJK@AC@GBEDG@ACOFOEAD@JQ@@FBdCDEL@FCD@H@JHXBPHABDEJ@BEDCACHCFAHA@@EG@QB@BBDE@@DE@AAE@@CG@ABADA@ABCAABCDBLD@DHNJDD@HDHHHJFdDPCTD\\JnE€MPDvBJHADHBBD@BD@@EHBFCBEDB@AD@HREB@FHD@DHBBGD@H@ABDBL@@AB@@AD@@CFA@BAFFD@BBB@CB@@FHDADB@@DEAADJB@DCHEAABBB@BFBAFEFADJDABIAADFB@DAB@B@BDBABCB@BE@@DD@Kz@DD@@HD@@DC@ADA@A@AFFB@HBA@BAB@FC@@AIBDBDABD@NA@BBBBABBRA@@@dFFDDHEBBHDNFFABDBDADCB@@AB@BCFO@ABCHCD@BBC@@@FDPRF@FA@DB@@AHAACFCHA@DFAACD@BBDAAABAD@BBD@@CDALBFB"],encodeOffsets:[[124062,32028]]},properties:{cp:[121.113021,31.151209],name:"青浦区",childNum:1}},{id:"310120",type:"Feature",geometry:{type:"Polygon",coordinates:["@@LBBAJB@BD@T@BDbCBBD@FKHEPBDAB@nBRA@A@BHAJCB@@BB@@BTCH@J@ZI`SXQBCHGACFCDBBAB@HIDBF@NGDA@EFEACC@@CFB@CD@DBBAB@@CBAD@@EH@B@@AB@@AA@@EBCA@B@BAC@@AD@BIAKAC@G@IA@BA@GAAB@EQBIGA@IA@GYBYrƒĥDƒEŸU¡_‰[g¤A@EDAA@BIVC@AA@BOBKBAGG@@HCBBBSBCFA@@DA@@FFA@HA@@@EBCAAKG@A@@DI@@FCB@BC@BBA@A@@@A@@A@BABBBCF@FL@CPBJAFBJC@@HBBALADBFKBIFABEDIBCL@JEFAPKJHFBFADED@JADFD@AB@BBABBBB@DBH@CTHBBBADC@@VCL@PCJ‚TfD^JNJLJHBPDV@LBLHJBZDHCAEJYDB@BLHTFBBD@@AD@DEB@@AC@@EF@D@HGD@BAFB@AF@BCJD@ABABB@AB@DCBCDADB@HAB@BB@BAD@@DP@NF"],encodeOffsets:[[124489,31743]]},properties:{cp:[121.458472,30.912345],name:"奉贤区",childNum:1}},{type:"Feature",properties:{name:"崇明区"},geometry:{id:"310151",type:"MultiPolygon",coordinates:[["@@Ɯp@dG¶ƒY€IЏtuÆu¬RWˆWckĜyPVĆgðÕTUm…U¥c}S“H¥|÷Œ^oGĝ¬åеxƒb™žcAXor‘š]dš€"],["@@”MšURm@kYiD[YRwRmdS^ChQv"],["@@¬Q˜SzoMUægLShQ”e^sFwS_aL“’ïž{d\\ungZeNGZ"]],encodeOffsets:[[[124119,32586]],[[124716,32134]],[[124427,32249]]]}}],UTF8Encoding:!0}):D("ECharts Map is not loaded"):D("ECharts is not Loaded")}); -------------------------------------------------------------------------------- /Dashboard/public/static/China/js/map/province/tianjin.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed to the Apache Software Foundation (ASF) under one 3 | * or more contributor license agreements. See the NOTICE file 4 | * distributed with this work for additional information 5 | * regarding copyright ownership. The ASF licenses this file 6 | * to you under the Apache License, Version 2.0 (the 7 | * "License"); you may not use this file except in compliance 8 | * with the License. You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, 13 | * software distributed under the License is distributed on an 14 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | * KIND, either express or implied. See the License for the 16 | * specific language governing permissions and limitations 17 | * under the License. 18 | */ 19 | 20 | (function (root, factory) { 21 | if (typeof define === 'function' && define.amd) { 22 | // AMD. Register as an anonymous module. 23 | define(['exports', 'echarts'], factory); 24 | } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') { 25 | // CommonJS 26 | factory(exports, require('echarts')); 27 | } else { 28 | // Browser globals 29 | factory({}, root.echarts); 30 | } 31 | }(this, function (exports, echarts) { 32 | var log = function (msg) { 33 | if (typeof console !== 'undefined') { 34 | console && console.error && console.error(msg); 35 | } 36 | } 37 | if (!echarts) { 38 | log('ECharts is not Loaded'); 39 | return; 40 | } 41 | if (!echarts.registerMap) { 42 | log('ECharts Map is not loaded') 43 | return; 44 | } 45 | echarts.registerMap('天津', {"type":"FeatureCollection","features":[{"id":"120101","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@BhB`R@DA@CD@DCFCHBLDF@DABKFIJGQG@COEQM@@OASB"],"encodeOffsets":[[119992,40041]]},"properties":{"cp":[117.195907,39.118327],"name":"和平区","childNum":1}},{"id":"120102","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@XFFIE@BGGA@KVBN_]CCCLg†MGE@CD@AGB@AEGMEACB@BA@BFWFACKA@DA@@DA@C@CCCDGIAKMBWLGFERWT]bADCNE@DDIDEFBHTHBD@DLMPJj@ARX@"],"encodeOffsets":[[120075,40099]]},"properties":{"cp":[117.226568,39.122125],"name":"河东区","childNum":1}},{"id":"120103","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@TAPB@@RNPF@DRHPSXSFQHEXK‚E@CMIFUQA@DC@CCA@CDE@CEE@FOc@@D{@ch]IGFCFE`A\\"],"encodeOffsets":[[119992,40041]]},"properties":{"cp":[117.217536,39.101897],"name":"河西区","childNum":1}},{"id":"120104","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@C@@DCBQ@AcAmBOFaDEHEgKID]ZQTINCJEdkhHDRNCB@FD@BAFDFHB@JIDANFDECCZCBA\\B@Hd@LB@CAU"],"encodeOffsets":[[120007,40074]]},"properties":{"cp":[117.164143,39.120474],"name":"南开区","childNum":1}},{"id":"120105","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@FBBAJBFDJK\\NFEFBLKBBBATP`]QOLB@AHBBEJ@DDDE@QW@BQi@OIKN@CACQECG@CFCJCCCMCGAEDCFBT@DSTQN@BFDBDCJBJAHKAIFDDXDAB"],"encodeOffsets":[[119993,40130]]},"properties":{"cp":[117.201569,39.156632],"name":"河北区","childNum":1}},{"id":"120106","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@JELBBGAIDIACEC@ARMTSKAc@@G[AABYDDDCFMECBIJC@CPHZ@LHNFFNHBCDAZBB@DEJE"],"encodeOffsets":[[119980,40125]]},"properties":{"cp":[117.163301,39.175066],"name":"红桥区","childNum":1}},{"id":"120110","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@CK@QOCEAEK@KAAKAKEoRECIYK{\\Af@BMb@@WAGBC@GV@KYBUkB@@OD@AEUE@IQDAGSJEDFD@CIDAAKDE@KECOKKEABMVMRGBSGE@KDCDADDN@FCHCBGAIGUKUEcB]JULINIZGD[AU@QDMDGFQR_NODiBcDBLHJDCDDF@@CB@@CLBBDXEAEB@@ADAFBHNBFA@BHC@@DHF…NKhDD^DM`UA@LHBAHF@EJWE@RCFCCI@AFGA@BKARP_^ZXZL\\JfHNHEdEAAFBBQCAFPHRGtMBEB@NB^Cb@lECFHDPD@DNBJCFE@CEG@GTCPHBF`@JFBCHJJKRCP@JGTIAQGIDAPAVH@GCEKEEBAAVEBDADPFBBCFBBHE@WHClQPCFBTARE"],"encodeOffsets":[[120391,40118]]},"properties":{"cp":[117.313967,39.087764],"name":"东丽区","childNum":1}},{"id":"120111","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@CGECABC@@EDAQMGClgD]DM^c^YHCF@‚VrwJBBINBHAFAHBDAN@LDDGCCA@AC@AACBAAEFKA@KDCCJCJDFGF@DCBGDQJERFHGMCLEAAGAFGMMAWE@BHQLKIBAJECCCAAGQW[DAAjS@AIYXKGGƒT@NBFEBABOJBDMFADGG@BGH@@AACFKGCG@FMWMDABCBAACLCIGCAE@[P¥\\]N¯˜MNORU^Ž]XKF`_XIIAIkDDZF@@FMDJLmTSDaHgDBJE@@DOBDH[HFJCBCGCBIMKH[L@AAAADUBACECGHWKCHTHBHaJDLF@JNF@FNLAH\\FABPD@EF@@HELCHVF@GXBB@DJBI\\PB@BN@BHK@GBAJ\\F@AACLABBAB@DFHB@FFJCDL@BA@@DF@JEBKHB@CjHBENDH@HSFBDKEAFG\\H@DE@AF@HHBANH@BQ@CBGNFT@`LFABIN@ALDBCFRHFB`D`ANANCG[DM"],"encodeOffsets":[[119940,40092]]},"properties":{"cp":[117.012247,39.139446],"name":"西青区","childNum":1}},{"id":"120112","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@ZAZEVKXSPGVEnDHCJYJMVKNEPCdAZHRJJHHBDADG@ECMBCDCLCF@THHANQPWD@DBXRJ@HAJERSJAJBDCEOCAKYBQCA@GBCDSGAGBIHSNA@KCQMCF]IN‡aCuOSGU{zm_yENH@HDELBD@BG@AHH@CHEBCNIAAPABEFMAS@„HHWLJZ@BiTBB\\CRXBHDBDDIFABLJRKAGF@BXNNEHHBBBKFNDGHQEIFCRAHCDE@EHICIDDDLCB@ELBFABBD@BBDB@DDCHKCM@CBGAEBGBMAAJIAMP|@@Cd@EPF@DFF@DCB@DDD@@CRBEVNJ@D"],"encodeOffsets":[[120108,40016]]},"properties":{"cp":[117.382549,38.989577],"name":"津南区","childNum":1}},{"id":"120113","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@PQFFJICABACCDAKGJGLHRMVMMERKHH`WBFFCRFJHHIBOK_MC@QLCDIBAMA@COCGCDEkFa@]DMAA@AFsNQHOGBERDAABEFBFcMGeG[IQGGCmgABAAKLEAEF[MILECKA@BA@CABAWCCCIFEFYACBADICIIGM@KMDgDO@UCWIDECABKM@AJEB_KS@MEAH@DARG@BMGA@GBEF@@C[GEHFBCLEAGTG@MCAFgGA@@DGAALIFE@@CB@@ACKIDIGQJ@DHD@@GAAH@FDPbB@BDEJ@BBAFBNBHDBCDBDHBEJFBBDCFANA@AFTFFARPBNLABARA@DD@BB@HFA@PXBBLDACRKEAJF@GPD@AN@BjHCGZFJUN@BA^F@FIAAFNDCF@B\\LONADtJTAFBDCPBDGPETBADNDFFDFCD@LHBBKJFALIA@DB@@BNFBGHBBEN@@DHD@FFBDAH@AHBBCLDBF@@HFBBGJ@BBAFfLLABCH@ADLFJENAHKLAFBDEH@AHBDJB@DB@B@AADEFCLBNCDMDER@BKGA@ADEZDBELH"],"encodeOffsets":[[120140,40274]]},"properties":{"cp":[117.13482,39.225555],"name":"北辰区","childNum":1}},{"id":"120114","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@DKEC^QZS^QwVMAAB@CCI@@CB@H@JCBCFEDBCFF@D@H@FALIXMBIECM@ADE@OABEPA@CBCD@HEDIGEC@AC@KJ@DCH@@DFADEDAFBFALGBMFABKGAAA@CAALEJOFAFIFEB@JKDEJBDCCAEAFI@IDIDINECABGBQBCFC@AOKIHED@EKG@JDFOH@EIEDEFOC@BCEACAACAEI@AAHUXC@GD@AMDED@BEF@BBHAKADID@BGCIBEIIGCAFOAGAEF@BHBALQ@CFCNMDKAEDCFBBC@@CIAACBGG@CFEAKBGLMBIFKEBCG@ADKBeKBEAAI@AHEA@GE@CADKAABGG@CBEA@EGC@CM@AFGAAHME@AA@@CJBBKIEALGA@KDCCEEEMCBCSAOFCHOACDEASBsIBCPM[K@ADEMCBEJB@E]EABM@IVYEDHiG@ABMC@HOE@BILFDQCBAKWA@OEB@GAAC@@CQBABKBAMQOEBSEBEB@BMDEACEAFIGAACDCCAAGAMBEAAI@CF@AaACO@EBGHB@@GC@CRICE@CBAAAKBBD@B[EBIHAL@AGM@@AOAJ[IA@CAAHWM@AHJ@G^G@AF@DA@@FEBBFcJqAEDECFFABBRCHBFEDDNAHA@@`@@CHG@AT`D@AH@@PBBCJDBFABGB@@BBAB@BIFBBDJ@@FE@DHKD@JA@@FGCCDE@AZFDM\\JBCZCRKA@FGA@JHB@FBBXFBCFB@BB@CRJ@DJ@HCTF@ADB@AHEAIFKACH@CA@CLA@FBAFB@@DH@CFE@ADIEKA@FAABIB@BCG@@CC@BAOMCJGG[C@BABG\\AAAD@FL@@DJBADHB@BA@ABOCCDC@@BC@ADB@ADA@AFL@@A\\D@FFBBEB@CLB@ELB@@BAB@DBB@DEA@DD@AFCACDBHJDALF@AFFBBCPB@DB@ABBBBBD@@DDBFB@DHBCHDBLEJNMF@DKCIFCFQCBAA@@AEBAA@@EA@DOICDGD@BB@ALDA@BYLKA@BBGGA@AMHEABCC@GNLE@NC@@DAAAFEAAJKBBBF@CB@BF@AFH@@BN@ADZF@DD@@DF@DCFBEBF@@JB@EDCPA@@FI@@BF@@DDCCTH@C@TD@BB@G^FAGPECBGG@@BSAEDALG@AJA@AHC@ABC@@FEAAHB@@DB@BDF@AHHFA@DBABD@D@CBBBCBXH@DB@AFH@EHCACFCBCFA@CFDACL@BB@AFB@BCDBBA@BBBBCFBADE@B@@BCBBBD@ABE@ABAA@BLD@BHDBEGA@AD@CABEL@CJHBEHDBEJBBPDFCBEJDDBH@@FADHBMNIHFDEFFD@AJFADBBBAF@D@AHDBRDBD@RCBBJV@@BD@BDPBFEBBCDTHL@DAHBBCDBABTDCJJBGJNBAND@ADFBHE@DED@H@@@FH@X@BCBBBCB@DFZ@DMA@CFA@GMCADGAGBCNMAAIA@KXGCODOJMD@LJJC@C@KC@BCFAFDRDBAD@CD^F@DF@BFFA@FJB@DbEPEbElMTIZGAAFA@CJ@BE@@@FHA@EJA@CHBADBGPA@BG@AFBBVGHFL@BBABD@"],"encodeOffsets":[[119960,40574]]},"properties":{"cp":[117.057959,39.376925],"name":"武清区","childNum":1}},{"id":"120115","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@GBAAE@AFC@CFBNC@@HWDGVBBJ@BFBDDBFBADD@EPCFJF@FPGCE@ILH@FFCJGPL@BEDADARAHDBMFCJCJ@JEJFBDBCDIACFILA@EFEJEBIPKFBB@DBBHBALEBANKHEBEACBCFEB@CG@CDI@@LBDD@HFCJGFC@AD@DOBAFPBF@BCN@FDAJWNKJEBG@C@E@DECAEFADIDG@ADJ@DDA@BBUNx]RYT]RFDCLJBADDBGDBDHBFJJ@TBBHB@@DH@AFKBCB@HE@@BEA@D@@ADBHC@@AA@@DCB@DB@@FJ@@FD@@HH@E\\F@ADB@ARBBBFED@BD@@BCA@HD@AJE@@ACAAHDB@BH@AHCB@EAAADGB@BE@BBK@FLEBDDADA@BDNB@DJCBBIR@DBBDBFALDX@DHL@DJFA@BH@HHKJAB@DC@GFOHED@BCBAZE@ADE@AFGACEEDA@@AGAAVJ@IVB@@DB@@DHGJB@JpFBCFBEPPBBCNFBGHBPC@EHBFFRDRA^GD@JCFDJGHBLGFECCBGHBBCFBDCFB@EFGD@@BF@@DPALEDCECDEDABED@HCHJH@FDDEFDHENCLBDDDA@ERABEN@JEDDBACEJ@AINMRBJGAIDCZEJCLAFRTJHAHJHFD@@AEKBAFBRJGF@BPAFBHEDBFHBAFO@@NFH@BEFGHAD@BFBBJID@BFDBDEB@J@AGDCL@FBNIBBFJD@HKDCNDF@DAFGFCdE@A@AICBCJC@C@AGAEFC@@MIBAABC@CKA@CBANACAGC@ARBJG@GLGHCX@LENBNE@EDAFBHHD@DCDIIMLCBGN@@AIEBANEGKLEJDDAAGIKHKCIBECIECSF@GBKGCIDC@FKAAGCBOC@OB@MKGC@CHCAAEFUB@HDLPJDBCAIFGDARDHGBC@EIKDGB@N@PHJHBLHBNARQXGFG@GIGK@IDEFEAAC@EHILCP@JCDGCEOFCBGABCKCBSEEK@ADIGO@AEOCEDDBqNAAH]MKiIAW@@CA@GA@DIMA@CGAAD_EEH@FIA@HIAAHUEDOHAFIOSKGSEcDAEI@@CBCOEC@CDCFEBKEFIMEGEA@@BIA@ERFBDQCABADQDCCAHMJBDEMEADGAUCCC@CDA@CCCICGO@BDJG@CADGK@CCGFICCBKEEDGBCAAEKDAABGFE@ACABCAAeA@HM@GBYD@BE@@NABGB@CCAW@@ACAEF_BYECII@CG"],"encodeOffsets":[[120145,40295]]},"properties":{"cp":[117.308094,39.716965],"name":"宝坻区","childNum":1}},{"id":"120116","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@@LCFBLCBDJC@CEIFHTCBJRF@FXPC@@lAAVLZU@@HADBH@Xa@ANe@[BL|J\\FBpQLFLBBB@LFLFBPD@RDLpMpGBPNREHE@@dVF@BJB@BD@@DFDLBDGHGDA^c\\@@cFDŠ@@jEBJZFLhrePFBEJGAENE@IVC@@RBLV@DPT@zJLHPFVDNECC@SACjQJBJCACIDMQhQD@tŽCD]LBHDBH@GLHNB@DQHBAFDHE@@DEBDFFAD@@BF@BBAB@BNFBEHCXDT@JGAGVEBEDCDB@BF@@DRC@BZ@PAP@BCFAJ@@B@BTC@DB@JEAAB@FB@ACAB@@CC@BCHOF@BADAAADCHBH@HECEB@BCHBDBBCFDBAACBAD@BBPGJF@@ABDB@BD@ABBDDAFCBC@CB@CCAKNECG@EF@@EzQBiAC@Ey@BUI@±]GaQaý¥Y_YeK]EaDqPmHcD{DK˜QBMMaKEUC_BOASY_YAYD—XSIaa¹JgCeOQ[@‘RUbK¶MPGJMA¯CUSQÓgOKMWEa³OqIGFG@EBEACIGCFK]EE@@DFD@B@BG@BHCFC@@EEAIHEACBC@BFCBQCaDFKACEBECADE@SSKMIKHQKHEJ@[UGCoO@d[CFSMIAIE@AH[A@DOA@AQKOEEBARGNI@G@BSgE@AOACJSKMVC@IXF@hJAFmKCHB@PVVFAHHB@JC@CH@BABD@ABMFC@@BSB@BAAAHG@JL@BBBWABHHB@N@BMBMAEEESMA@EA@@CCE@FC@AEQ@@GCAA@AJC@BEK@AAABSGA@@FEA@BCBC@@EC@@DK@LHBD@HCDBFCBABB@F@@FB@@DFJ@HB@BLADK@HBDBCBG@@DH@@F@DCJIB@JK@AJFBCLBHH@DCBJFF@PATBHB@ABDTbB@DaCAAE@@CAACAOF@HADE@@BICAFBHEBhTBPDBJCFCªvEFeVTROJVT`O„€FH®_\\OF@DBJHKDBDABADCB¶ˆn`|yHVPTŽvbDMˆ^JDERNLDB@TMJGHAHBCTAD@HDBARLZDBFPCDIAGBUVOFGB"],"encodeOffsets":[[120348,39943]]},"properties":{"cp":[117.654173,39.032846],"name":"滨海新区","childNum":1}},{"id":"120117","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@ABCJKD@RNDL`APGJIGQEEDAE_XGGQLNFUNQNKGIHLHCBDDABDBIJEEORFFAFDJAHC@CJLBDHJ@DJZF`AFEDB@BX@DB@DHABA@MF@@AZCHAN@@GfBBBADDB@BEFAHBBLCBFDBHAFCLFDAJDHEDDL@CHDBH@CI@AHPJDDD@DCB@DDDVDHBBCNFCFIAGNDBCDCRABDBCREAQ‚@FJB@AB@HFNFEJLFFADEDCD@PFAD@DJ@BFdCTFLHPTEJGBCPVFBGJB@GJB@EFG`FBCHB@DNBCJB@@HDB@@BXjJNLGZ@DBBrMACFANDBFP@JHBCL@FFATLDADHBDAPEAC@EBIFIJGNJJ@JBJJHJHFSZA@BND@@LVB@BJ@AFDBBDEDILjTABlEHHTBvWVAPDHCDFL@LHHB`MFALDNC^M^GJIEKABEGACC@IMA@AOB@EACIGAAEBAECCBDAAAAADAAEFCBDB@ACB@AAAABEBAD@AG@ADFAEB@A@GKSCCgG@AEJA@AFO@ECCQEEEOBGYG@B—qGBKXBFKCYJKOIKNEASCeA_ECSBGFENEF@HDZ@FCBE`TEFB@EFHFFEECBCFDFADBDEUWCOGBAIECLG@CEIFA@CF@CGBEGACRA@GMHKG@CAAG^KDCsC@gRNRJCBDIDIAiRBD@TDDMFUCOEKGyIS@COU@AK@QD@JUF@FMHBFIEAfOgqEKIYFA@i‰@EC@d[@]dCBGHCHKAEC@CC@@AIA@AUE@cF@FGMQAOgF‰VSBEAODkRGD@XGFAADEAAOEBCACUFBBFALFDF@HUGOBCBHJBRSJIHO@QDILGIADIE_@AEOGSD@HFH@DEFID"],"encodeOffsets":[[120221,40183]]},"properties":{"cp":[117.82828,39.328886],"name":"宁河区","childNum":1}},{"id":"120118","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@AHC@@FCA@DHB@JS@@DA@@H]BCTKfG@BHK@@FEAADJD@RJhNNI@@FQBBDCBQA@BBLMIBNFJADHHEBuK@IA@AKU@UDDH—KI@HAGAAC]@CDCA@MSAHPGBOEMEIA@EC@@DA@MBAASB@BCB@TE@@BBBBDAHCBDFABFNGBBFKBBFC@BDB@FPC@BPCPMACEoBE@AAC@@DcB_D@ECB@A@BA@B@@DC@@CA@@IE@AAG@BDK@EBABQA@JE@@HC@ABA@@BB@ADOA@DIAACA@NxQB@FIBHXHABFKBFLIDLPDTF@DNC@CAGB@FA@BJDXmBAœ[@@ˆD@@NL@BHB@H\\BTD@HRB@JF@FL@FHDNDABJDCDTD@DTA@@LF@BB@XGBADE@@B@B@DJXJ@XEDFHAFHCBBDBDJBBHTCAIGBAAGBEA@EC@BCB@@BBAC@@AB@@CD@@DB@@DJ@DDF@DAF@@CLABBF@@AB@BBJ@@IBBDBB@ACJBJDR@@HD@@GfBAFXBCLH@GTPFjKAGSGDGXLHGFDBDVABCBB@B\\KLGJNDADHDAEI\\GCGPA@CF@AIhCbGTCnSIKNC@EE@CYlCBJJJ`W~W\\M^W€V]^_°—VIEGƒ_PUSPISQfUFE©uEDIDCAAOgSFAAGBEJD@AF@BC@GPEDBBB@DF@BBbD@CaACSBAA@AGBS@OEEAICDG@AGDKEABIL@@IJADI@C@EG@@CH@DACAGAL@@OA@@GEI@CA@@EE@A@BADAAEDC@GACOKB@BMEB@ESEAABECAWBAECBBCC@CIBCS@@IWD"],"encodeOffsets":[[119909,39513]]},"properties":{"cp":[116.925304,38.935671],"name":"静海区","childNum":1}},{"id":"120119","type":"Feature","geometry":{"type":"Polygon","coordinates":[],"encodeOffsets":[]},"properties":{"cp":[117.407449,40.045342],"name":"蓟州区","childNum":0}}],"UTF8Encoding":true}); 46 | })); -------------------------------------------------------------------------------- /Dashboard/public/static/China/js/map/province/xianggang.js: -------------------------------------------------------------------------------- 1 | /* 2 | * Licensed to the Apache Software Foundation (ASF) under one 3 | * or more contributor license agreements. See the NOTICE file 4 | * distributed with this work for additional information 5 | * regarding copyright ownership. The ASF licenses this file 6 | * to you under the Apache License, Version 2.0 (the 7 | * "License"); you may not use this file except in compliance 8 | * with the License. You may obtain a copy of the License at 9 | * 10 | * http://www.apache.org/licenses/LICENSE-2.0 11 | * 12 | * Unless required by applicable law or agreed to in writing, 13 | * software distributed under the License is distributed on an 14 | * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | * KIND, either express or implied. See the License for the 16 | * specific language governing permissions and limitations 17 | * under the License. 18 | */ 19 | 20 | (function (root, factory) { 21 | if (typeof define === 'function' && define.amd) { 22 | // AMD. Register as an anonymous module. 23 | define(['exports', 'echarts'], factory); 24 | } else if (typeof exports === 'object' && typeof exports.nodeName !== 'string') { 25 | // CommonJS 26 | factory(exports, require('echarts')); 27 | } else { 28 | // Browser globals 29 | factory({}, root.echarts); 30 | } 31 | }(this, function (exports, echarts) { 32 | var log = function (msg) { 33 | if (typeof console !== 'undefined') { 34 | console && console.error && console.error(msg); 35 | } 36 | } 37 | if (!echarts) { 38 | log('ECharts is not Loaded'); 39 | return; 40 | } 41 | if (!echarts.registerMap) { 42 | log('ECharts Map is not loaded') 43 | return; 44 | } 45 | echarts.registerMap('香港', {"type":"FeatureCollection","features":[{"id":"810001","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@D@bKBoCWKACBGCI@CJSVGFIBKCM@ABAF@LFHPFJJPFVB"],["@@ABD@@AA@"],["@@AAEAAB@DDBFC"]],"encodeOffsets":[[[116895,22829]],[[116861,22818]],[[116860,22817]]]},"properties":{"cp":[114.154334,22.281931],"name":"中西区","childNum":3}},{"id":"810002","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@BMHBBGD@BAHBD@HKDEF@FHDEDECCGCIAAQWCUBSBDXApREHD"],"encodeOffsets":[[116927,22822]]},"properties":{"cp":[114.18299,22.276345],"name":"湾仔区","childNum":1}},{"id":"810003","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@rWAGBEJKRO@ACCBEAIAEGEACKPA@MDICIDOBKDGAIBIABRNDHFEHADEGE@CFGLC@GAABC@AHECABAN|TTI"],"encodeOffsets":[[116967,22827]]},"properties":{"cp":[114.225965,22.279779],"name":"东区","childNum":1}},{"id":"810004","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@JBJAHBLCPAJCJDPCLOJM@IBAFBBA@CE@AAE@AAFIBQBADAFECCBEA@GFCAYBABIRC@QEGEACBEHMACECQACFE`A@GCK@AFFHADMJBBF@BB@FBHCFI@KLEBCAGWAAQDGCGJQHOPOHS`KLN@LDJAHETUDIJ@HDxCZD"],["@@ACCBFB"],["@@D@@ACCCB@CC@CFBDJA"],["@@BA@AG@@B@BF@"],["@@DABAGCADADBBDA"],["@@BAEBD@"]],"encodeOffsets":[[[116946,22787]],[[116886,22776]],[[116934,22767]],[[117006,22758]],[[116932,22748]],[[116970,22738]]]},"properties":{"cp":[114.160023,22.245811],"name":"南区","childNum":6}},{"id":"810005","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@AIBINQNIHU]IsRC@AvFBHFDCLDV@"],"encodeOffsets":[[116920,22860]]},"properties":{"cp":[114.173347,22.311632],"name":"油尖旺区","childNum":1}},{"id":"810006","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@H[@EEGU@KCCDGEEABQi@AHCF@B^P@BABOFCFBFF@FDNADADHJDjB"],"encodeOffsets":[[116919,22881]]},"properties":{"cp":[114.163349,22.333775],"name":"深水埗区","childNum":1}},{"id":"810007","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@DEBEFC@CJKD@DCHDLDBMEG@CFCLICETSDQSJeMGVKHGJIR@HFJBFG^FDF@"],"encodeOffsets":[[116925,22883]]},"properties":{"cp":[114.193047,22.312373],"name":"九龙城区","childNum":1}},{"id":"810008","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@AC@IH_BAYCEDIAGDICGCCDC@IL@DEDAFCFNDVD@BADBBHCFDJA^D"],"encodeOffsets":[[116970,22892]]},"properties":{"cp":[114.203985,22.336112],"name":"黄大仙区","childNum":1}},{"id":"810009","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@F@HWF@DABD@IHBB@GOAENMBE@AEAGOBCFE@CqXCRSTDFKJED@DFHANFCJBFCZD"],"encodeOffsets":[[116974,22868]]},"properties":{"cp":[114.214083,22.320679],"name":"观塘区","childNum":1}},{"id":"810010","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@AEDQ@WQACIKIGCQCABAHC@]I@ADC@ECICCKEGA@NuASIHyO@IEQW@CÙF~bNJFL@D@FLBBNPJJFIDAHEDBDHBDDBBTCB@AHDB^@@JHHF@DDLFJFDBHCD@PPD@L@RLLBDHVBNAHBBABGhB"],"encodeOffsets":[[116914,22950]]},"properties":{"cp":[114.121234,22.368458],"name":"荃湾区","childNum":1}},{"id":"810011","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@AC@G]@CABGA@SDAACCGAACFCBGJCIEOIAMKAEHGFgFgPS@E@MEGEEGCAO@E@SLUNCH@DDH@H@JEHAJCHQFAB\\`ZHTCFKBAHFFJFJBBZ@FC^CND@AEINGXA@OL@@U˜@@HN@BEE@@KTA@G"],["@@BAFADAAC@AACDACGEBBHAFGFBDD@"],["@@B@B@@CA@AD"],["@@BAB@CCA@ABDD"],["@@D@CGABAFD@"],["@@@ACICABJFD"],["@@DA@ACCC@ADBFBBBC"],["@@@A@@ABB@"]],"encodeOffsets":[[[116810,22924]],[[116618,22917]],[[116612,22891]],[[116626,22888]],[[116629,22880]],[[116725,22874]],[[116708,22866]],[[116720,22861]]]},"properties":{"cp":[113.976308,22.393896],"name":"屯门区","childNum":8}},{"id":"810012","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@BMDIEK@CDCAMHG@C@MCG@YBAZHZDLIJA[gAGBEHMTO@EAIKAQKK@C@OOC@GDCAIEKECCE@EE@HSB@LF@AFM@@G—@@VK@@PWBMHFJ@BMC]DEDY@AAEIEIGEABELSDVHNRJPHJLHXHFBP^ZVBRB@\\CJIDEH@DDAJHDFF@DGL@FFB^CRED@JFDPJHPBHED@HFFF"],"encodeOffsets":[[116828,23059]]},"properties":{"cp":[114.032528,22.44132],"name":"元朗区","childNum":1}},{"id":"810013","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@A@@HIEK@EA@BDH@BBBD@BBBAB@MN@DH@@BEFBDFBDA@C@@VABBDAJ@B@D@D@@CC@ECGB@ACACCA@IFEBAC@CFABEHGF@BACGGB"],["@@DC@CEDAFB@BA"],["@@AABB"],["@@@AC@DB"],["@@AABB"],["@@BAAAEABDDB"],["@@@A@CEDBBD@"],["@@@AABB@"],["@@DA@CIE@JFB"],["@@@@@@@@"],["@@DCD@BNDBDIAE@I@EE@ABABOHAJDDFABC"],["@@@A@B"],["@@B@B@ECAFB@BA"],["@@AA@BB@"],["@@@@A@B@"],["@@A@B@@@"],["@@@A@B"],["@@BCAB@B"],["@@@A@B"],["@@@FBCDBDABBBBBABCB@ABDBBDB@DH@JABBDNEBE@CD@FCKKG@AEC@EBA@ACIEA@EDBB@DB@ED"],["@@A@B@"],["@@D@BCG@ADBBBA"],["@@@@@@"],["@@BAAB"],["@@A@B@"],["@@@@AABB"],["@@QCKMECAKH@FDD@FFDABAFBBHJBPZBDJ@BCD@BBHA@DF@HAAAEEDA@EF@DGF@BC@CGE@GFBLABBADBBDAH@D@@AEIBAFF@ADBDAGGAEA@EIBCLBBA@CDBBCHBBABCTKLFZHRJH@DASMQGGIOEGAGBaNM@eEK@EDKLGBCFEBAAAGGGEEEIIGAEIDU@GBK@IDUAIAEEEGCIEBEAAHM@AABC@EKCWOMEIBKJYCYGAB@ZDH@N@DGHBNCFFNEN@JBFMJBDNDFHFBHEDALDFAFD@KFAFDBFH@FHDBF@DFHAHDLABAFBBDFF@BAAA@@D@DD@@HH@LLDCJFFCJ@BABEFABBJAB@DADDH@BBB@FBDCPBFEJBFC@AFADC@IDA"]],"encodeOffsets":[[[117049,23071]],[[117017,23092]],[[117013,23092]],[[117010,23091]],[[117004,23090]],[[117009,23086]],[[117081,23081]],[[117014,23081]],[[117057,23081]],[[117015,23077]],[[117062,23071]],[[117020,23075]],[[117024,23072]],[[117021,23072]],[[117029,23071]],[[117037,23071]],[[116974,23071]],[[116957,23067]],[[117036,23065]],[[117043,23049]],[[117033,23064]],[[117035,23059]],[[117043,23052]],[[117049,23053]],[[117040,23048]],[[117054,23039]],[[116975,23082]]]},"properties":{"cp":[114.147404,22.496143],"name":"北区","childNum":27}},{"id":"810014","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@HGNA@ACGC@G@OFADCL@FDDJDBA@M"],["@@@EACUMIMGGGCE@@CACIEMCMISGG@CESIGKGEQGG@CBABALQTCDABC@GCK@EBCACAAKBAHABAB@HA@AE@@ENADBDLFBFABACGEEICG@ICQB@B@J@@GBAAEEAODERKMIGMAAUAAAUA@ACAAA[ASAAHABGAMBUAAA@D@FSPIRBJ\\hNFXPLD@FADBBN@BGFBFAHPDFHD\\BJCL@HAV@JCBFJHFJFFHHBHDBHGHALKFCL@fFN@bMLATHHJRHTN"],["@@CIEAEJBBBDBBBBHAFBEG"],["@@@CFABAAGCC@ECCEACB@HAJAB@FEDJJDBHABA@CAC"],["@@BAEBBBBA"],["@@^DLCFBBBBJFJNLH@DHN@NXJFFHPHDABABKDAFDDABGAEBCDBFFALDDBFDBDADIBIFOCCICAAAI@CDG@KJ@HEBBDJCBALDBFBBBDB@HBHHALEDE@IEG@EGA@EDIBYEGAIEEICADMFOLA@KEE@OHKHYDAC@KCECAS@CCAEBGGOK@CACIYCEAGEBLCH@JGJ@FBXCHDL@P"],["@@AEA@ABB@@FB@BA"],["@@@CABBB"],["@@BAAAABBB"],["@@BACDBA"],["@@@A@B"],["@@@DHBAEC@A@"],["@@AA@BB@"],["@@BB@CAA@D"]],"encodeOffsets":[[[117183,23086]],[[117087,23049]],[[117113,23039]],[[117114,23018]],[[117122,23021]],[[116998,22974]],[[117082,23017]],[[117084,23018]],[[117081,23013]],[[117180,23003]],[[117039,23001]],[[116966,22997]],[[117006,22983]],[[116968,22976]]]},"properties":{"cp":[114.171713,22.44573],"name":"大埔区","childNum":14}},{"id":"810015","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@B@@@C@BB@A"],["@@FIJBFCF@JDF@DDBEDBDEHACGDK@EFEFK@EGAI@CDILEBEAIG@C@EECCKBCJEFGFAJGAGDKEGDG@GCCC@CBCFC@AIGAACFEEACC@CEAGB@EC@@AID@KBC@CACCGE@ABALGLBFA@GGEAE@GJAFBFIFCJHN@JOFGFG@@DBHABCFKAAEDCACI@GBGAAFI@GJEBE@ECAEBICCCU@KJI@IGKIBAAHcDEFENAFADE@CDGDET@BCBEJGDKAIKEEEGAACBCF@DA@MHI@CACCAE@AGE@OLEHGBAA@CECCGEAEBITGDANHRGLCDG@QSEG@DEDADHPFB@BEJIJBFHPA@GA@JACCBEBGVE@ABG`@JBDB@ADBFPBPJLLBJRDAJHFFBZDFLN@HPAHBFDDT@DBDF@LBDZCLGPGF@LFB@PKNEBCJDFFBJFHAZCJ@FHB"],["@@A@@@B@"],["@@@@@@"],["@@AABB"],["@@BAC@@DBA"],["@@BAA@ABB@"],["@@@AABB@"],["@@@AABB@"],["@@B@BACEC@@DDD"],["@@A@B@"],["@@@AADBA"],["@@DC@CA@ADA@ADD@"],["@@DBFADBLC@MDEBIA@@GJAHGCCBEAA@CCA@CAEKBEBGACBEDEJAFHHAB@LABBDA@@AA@CBBB@DD@@DCDCB@JBBHA"],["@@@AAAAD@@D@"],["@@@A@B@@"],["@@HE@C@ICAA@AHAHCEEFBF@BD@FA"],["@@BACA@CC@@DFD"],["@@@AA@BB"],["@@BCFE@ACCDQCACB@FCBCLGHFFBHFDB@DE@AEBBE"],["@@@ACAAFFA"],["@@BA@@CBB@"],["@@B@C@BB@A"],["@@@AABB@"],["@@@AA@@DBB@C"],["@@ACABDB"],["@@BAAB"],["@@@@@@"],["@@BACA@BBB"],["@@A@BB@A"],["@@FADIFEAICAACC@ABI@CFBDCD@BCHFFLB"],["@@CEBEBACA@AA@KD@JBHH@@BF@BE"],["@@@@A@B@"],["@@@CE@BFB@BA"],["@@AB@FDC@AAA"],["@@DHFEDAFGACBCMBEJ@D"],["@@BADABAB@BCKBCFDB"],["@@B@B@C@"],["@@A@@BB@@A"],["@@D@C@@@"],["@@BAAB"],["@@@AA@BB"],["@@BAAB@@"],["@@@AADBA"],["@@@@@@"],["@@@A@B"],["@@AA@DBA"],["@@@A@B"],["@@@A@B"],["@@@AABB@"],["@@BAEBBBBA"],["@@@@@@"],["@@A@B@"],["@@BC@AAAEDBDD@"],["@@B@@AAB"],["@@BACKAAC@@JDDBBB@"],["@@AA@B@@B@"],["@@BCA@@D"],["@@@@@@"],["@@@A@B"],["@@@EAABAE@AAA@@JF@@FBBBA@C"],["@@@CCB@BD@"],["@@AA@GAAEAAE@@E@AJFLDDFADFF@@EEC"],["@@AFDBJBAADCDEACFEGA@EEB@FEDAH"],["@@JDB@ACDC@AA@ACB@@ADA@EC@@EAEC@E@AECAABBFIBED@F@DFHFDDAFF"]],"encodeOffsets":[[[117146,22985]],[[117119,22980]],[[117154,22972]],[[117153,22970]],[[117139,22942]],[[117137,22939]],[[117137,22938]],[[117033,22925]],[[117063,22925]],[[117066,22923]],[[117031,22921]],[[117064,22919]],[[117029,22917]],[[117054,22915]],[[117038,22915]],[[117048,22915]],[[117075,22911]],[[117036,22912]],[[117039,22911]],[[117043,22905]],[[117051,22909]],[[117044,22906]],[[117050,22906]],[[117074,22902]],[[117143,22898]],[[117036,22899]],[[117076,22898]],[[117116,22882]],[[117120,22880]],[[117102,22876]],[[117073,22876]],[[117119,22871]],[[117126,22873]],[[117085,22870]],[[117121,22865]],[[117041,22863]],[[117123,22866]],[[117118,22860]],[[117118,22859]],[[117118,22859]],[[117069,22860]],[[117077,22857]],[[117116,22856]],[[117068,22845]],[[117059,22840]],[[117059,22838]],[[117061,22837]],[[117066,22837]],[[117066,22837]],[[117061,22835]],[[117070,22834]],[[117061,22834]],[[117068,22833]],[[117064,22810]],[[117100,22804]],[[117100,22803]],[[117118,22799]],[[117120,22799]],[[117028,22798]],[[117095,22795]],[[117103,22791]],[[117097,22787]],[[117105,22856]],[[117111,22850]],[[117039,22789]]]},"properties":{"cp":[114.264813,22.314203],"name":"西贡区","childNum":65}},{"id":"810016","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@PGJAVDFD@HDBJBPA@OCKDGAYHM@IDGAKBIQCAIKKOIMACEBC_CIBECGDAABC@AUCKCG@ICeAICAAGHAL@FFJCP@FDHADLBFDLJDJRB@XCRBFHBBBDB@BVBBBXBHPNJ"],"encodeOffsets":[[116956,22970]]},"properties":{"cp":[114.195126,22.379715],"name":"沙田区","childNum":1}},{"id":"810017","type":"Feature","geometry":{"type":"Polygon","coordinates":["@@AECBMBECGA@CDEPEBA]QDGBGj@@cUADF@F@DCFIFSJQTQBaASPEBGzTJvB@MHBLFDDDJ@FCD@@ZJHBBIJBBCCI@GDKEI@EBKHG"],"encodeOffsets":[[116892,22877]]},"properties":{"cp":[114.13918,22.363908],"name":"葵青区","childNum":1}},{"id":"810018","type":"Feature","geometry":{"type":"MultiPolygon","coordinates":[["@@AIIGQCQ@GE@G@ICCGAAABCBA@GBGCA@ADOAGO@KBMLC@ACAEFARSDEACSGCEACLIL@DEPCBACEAECCE@AACEIECCKCMGI@KJGJEJ@FDLIBSGUAOOSEAABE@ECG_CSBUPAHGBICEOUMGCKBC@GCGGMCABDRGDAF@HBFEHAP@JJJH@BNRFDDBHEBICAH@DPHF@DAFFFNLBRFBHNNBD@HEJJVED@DBD’ZD@DEPFBAFCBAI[@CFGF@~dÚE"],["@@DC@AKE@ABADDF@BCFCAAIEG@CBAB@DABAFGDBBXF"],["@@BAAAC@ADDBBA"],["@@BCAAIBA@BDBDJB@CAA"],["@@BCCGGCGBABBHFDL@"],["@@J@FC@AAKFGCIC@EDADAD@B@BCBAAEHI@AF@BB@@DT@"],["@@CEMI@ABEHHFBHBHAFDFBF@BCLBDC@AGIK@OMDKJM@CAAC@YP@AHKAGAACBGHEGC@GBMDCD@HBDFDDDBXCFBNAHEBA@@IEAGCK@CNBDLHHD@BEBDFGD@DVJBBBBBCF@BECGACLGBEAADEDADFF@DE@E"],["@@@CEA@DDDBA"],["@@FEFBD@DEC@@CCAACGF@AE@CCBAC@CCCCCBBBG@AHH@DHH@DFADABE@CD@BD@DF@BABBDDBH@DBDB@E@AEAFABAKCAA@EDA"],["@@D@ACAACD@B@BDA"],["@@BAC@BB"],["@@B@BBBA@EACGAEFA@GDBHJJFA@CB@BCAA@C"],["@@D@BCBEAECCGC@BIB@CAA@FA@@PTD"],["@@DE@KG@CBAHBDDABFB@"],["@@BB@CAB"],["@@BHBB@CAEA@"],["@@BADBDABAD@BAAABAAAABABAA@CA@ADAAAB@DABCACCC@BRHCBC"],["@@@A@ACA@DDB"],["@@DAAC@@CD@BB@"],["@@ABBA"],["@@BAC@BB"],["@@AAA@BDBA"],["@@A@B@"],["@@BBBAAAABCAA@FB"],["@@@BD@DDCDBDDBDAB@FCAAE@@EBABEE@CAI@AACAGF@DFDF@DA"],["@@@A@A@D"],["@@BACA@BBB"],["@@B@@AEABBBB"],["@@DFPFBFF@BCFCFICCDEBIQA@DA@EC@ECCEAE@FJIBABD@@DCAABBJDF"]],"encodeOffsets":[[[116799,22849]],[[116787,22826]],[[116803,22822]],[[116823,22817]],[[116799,22797]],[[116780,22791]],[[116882,22747]],[[116881,22757]],[[116774,22741]],[[116575,22748]],[[116686,22746]],[[116733,22725]],[[117001,22721]],[[117036,22720]],[[117038,22719]],[[117053,22714]],[[116651,22714]],[[117053,22714]],[[116664,22710]],[[116665,22706]],[[116984,22706]],[[116645,22704]],[[116647,22703]],[[116640,22702]],[[116646,22692]],[[116656,22693]],[[116663,22685]],[[116998,22691]],[[117001,22702]]]},"properties":{"cp":[113.946059,22.286371],"name":"离岛区","childNum":29}}],"UTF8Encoding":true}); 46 | })); -------------------------------------------------------------------------------- /Dashboard/public/static/China/libs/axios.min.js: -------------------------------------------------------------------------------- 1 | /* axios v0.19.2 | (c) 2020 by Matt Zabriskie */ 2 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.axios=t():e.axios=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var n={};return t.m=e,t.c=n,t.p="",t(0)}([function(e,t,n){e.exports=n(1)},function(e,t,n){"use strict";function r(e){var t=new s(e),n=i(s.prototype.request,t);return o.extend(n,s.prototype,t),o.extend(n,t),n}var o=n(2),i=n(3),s=n(4),a=n(22),u=n(10),c=r(u);c.Axios=s,c.create=function(e){return r(a(c.defaults,e))},c.Cancel=n(23),c.CancelToken=n(24),c.isCancel=n(9),c.all=function(e){return Promise.all(e)},c.spread=n(25),e.exports=c,e.exports.default=c},function(e,t,n){"use strict";function r(e){return"[object Array]"===j.call(e)}function o(e){return"undefined"==typeof e}function i(e){return null!==e&&!o(e)&&null!==e.constructor&&!o(e.constructor)&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}function s(e){return"[object ArrayBuffer]"===j.call(e)}function a(e){return"undefined"!=typeof FormData&&e instanceof FormData}function u(e){var t;return t="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer&&e.buffer instanceof ArrayBuffer}function c(e){return"string"==typeof e}function f(e){return"number"==typeof e}function p(e){return null!==e&&"object"==typeof e}function d(e){return"[object Date]"===j.call(e)}function l(e){return"[object File]"===j.call(e)}function h(e){return"[object Blob]"===j.call(e)}function m(e){return"[object Function]"===j.call(e)}function y(e){return p(e)&&m(e.pipe)}function g(e){return"undefined"!=typeof URLSearchParams&&e instanceof URLSearchParams}function v(e){return e.replace(/^\s*/,"").replace(/\s*$/,"")}function x(){return("undefined"==typeof navigator||"ReactNative"!==navigator.product&&"NativeScript"!==navigator.product&&"NS"!==navigator.product)&&("undefined"!=typeof window&&"undefined"!=typeof document)}function w(e,t){if(null!==e&&"undefined"!=typeof e)if("object"!=typeof e&&(e=[e]),r(e))for(var n=0,o=e.length;n=200&&e<300}};u.headers={common:{Accept:"application/json, text/plain, */*"}},i.forEach(["delete","get","head"],function(e){u.headers[e]={}}),i.forEach(["post","put","patch"],function(e){u.headers[e]=i.merge(a)}),e.exports=u},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){r.forEach(e,function(n,r){r!==t&&r.toUpperCase()===t.toUpperCase()&&(e[t]=n,delete e[r])})}},function(e,t,n){"use strict";var r=n(2),o=n(13),i=n(5),s=n(16),a=n(19),u=n(20),c=n(14);e.exports=function(e){return new Promise(function(t,f){var p=e.data,d=e.headers;r.isFormData(p)&&delete d["Content-Type"];var l=new XMLHttpRequest;if(e.auth){var h=e.auth.username||"",m=e.auth.password||"";d.Authorization="Basic "+btoa(h+":"+m)}var y=s(e.baseURL,e.url);if(l.open(e.method.toUpperCase(),i(y,e.params,e.paramsSerializer),!0),l.timeout=e.timeout,l.onreadystatechange=function(){if(l&&4===l.readyState&&(0!==l.status||l.responseURL&&0===l.responseURL.indexOf("file:"))){var n="getAllResponseHeaders"in l?a(l.getAllResponseHeaders()):null,r=e.responseType&&"text"!==e.responseType?l.response:l.responseText,i={data:r,status:l.status,statusText:l.statusText,headers:n,config:e,request:l};o(t,f,i),l=null}},l.onabort=function(){l&&(f(c("Request aborted",e,"ECONNABORTED",l)),l=null)},l.onerror=function(){f(c("Network Error",e,null,l)),l=null},l.ontimeout=function(){var t="timeout of "+e.timeout+"ms exceeded";e.timeoutErrorMessage&&(t=e.timeoutErrorMessage),f(c(t,e,"ECONNABORTED",l)),l=null},r.isStandardBrowserEnv()){var g=n(21),v=(e.withCredentials||u(y))&&e.xsrfCookieName?g.read(e.xsrfCookieName):void 0;v&&(d[e.xsrfHeaderName]=v)}if("setRequestHeader"in l&&r.forEach(d,function(e,t){"undefined"==typeof p&&"content-type"===t.toLowerCase()?delete d[t]:l.setRequestHeader(t,e)}),r.isUndefined(e.withCredentials)||(l.withCredentials=!!e.withCredentials),e.responseType)try{l.responseType=e.responseType}catch(t){if("json"!==e.responseType)throw t}"function"==typeof e.onDownloadProgress&&l.addEventListener("progress",e.onDownloadProgress),"function"==typeof e.onUploadProgress&&l.upload&&l.upload.addEventListener("progress",e.onUploadProgress),e.cancelToken&&e.cancelToken.promise.then(function(e){l&&(l.abort(),f(e),l=null)}),void 0===p&&(p=null),l.send(p)})}},function(e,t,n){"use strict";var r=n(14);e.exports=function(e,t,n){var o=n.config.validateStatus;!o||o(n.status)?e(n):t(r("Request failed with status code "+n.status,n.config,null,n.request,n))}},function(e,t,n){"use strict";var r=n(15);e.exports=function(e,t,n,o,i){var s=new Error(e);return r(s,t,n,o,i)}},function(e,t){"use strict";e.exports=function(e,t,n,r,o){return e.config=t,n&&(e.code=n),e.request=r,e.response=o,e.isAxiosError=!0,e.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},e}},function(e,t,n){"use strict";var r=n(17),o=n(18);e.exports=function(e,t){return e&&!r(t)?o(e,t):t}},function(e,t){"use strict";e.exports=function(e){return/^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(e)}},function(e,t){"use strict";e.exports=function(e,t){return t?e.replace(/\/+$/,"")+"/"+t.replace(/^\/+/,""):e}},function(e,t,n){"use strict";var r=n(2),o=["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"];e.exports=function(e){var t,n,i,s={};return e?(r.forEach(e.split("\n"),function(e){if(i=e.indexOf(":"),t=r.trim(e.substr(0,i)).toLowerCase(),n=r.trim(e.substr(i+1)),t){if(s[t]&&o.indexOf(t)>=0)return;"set-cookie"===t?s[t]=(s[t]?s[t]:[]).concat([n]):s[t]=s[t]?s[t]+", "+n:n}}),s):s}},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){function e(e){var t=e;return n&&(o.setAttribute("href",t),t=o.href),o.setAttribute("href",t),{href:o.href,protocol:o.protocol?o.protocol.replace(/:$/,""):"",host:o.host,search:o.search?o.search.replace(/^\?/,""):"",hash:o.hash?o.hash.replace(/^#/,""):"",hostname:o.hostname,port:o.port,pathname:"/"===o.pathname.charAt(0)?o.pathname:"/"+o.pathname}}var t,n=/(msie|trident)/i.test(navigator.userAgent),o=document.createElement("a");return t=e(window.location.href),function(n){var o=r.isString(n)?e(n):n;return o.protocol===t.protocol&&o.host===t.host}}():function(){return function(){return!0}}()},function(e,t,n){"use strict";var r=n(2);e.exports=r.isStandardBrowserEnv()?function(){return{write:function(e,t,n,o,i,s){var a=[];a.push(e+"="+encodeURIComponent(t)),r.isNumber(n)&&a.push("expires="+new Date(n).toGMTString()),r.isString(o)&&a.push("path="+o),r.isString(i)&&a.push("domain="+i),s===!0&&a.push("secure"),document.cookie=a.join("; ")},read:function(e){var t=document.cookie.match(new RegExp("(^|;\\s*)("+e+")=([^;]*)"));return t?decodeURIComponent(t[3]):null},remove:function(e){this.write(e,"",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}()},function(e,t,n){"use strict";var r=n(2);e.exports=function(e,t){t=t||{};var n={},o=["url","method","params","data"],i=["headers","auth","proxy"],s=["baseURL","url","transformRequest","transformResponse","paramsSerializer","timeout","withCredentials","adapter","responseType","xsrfCookieName","xsrfHeaderName","onUploadProgress","onDownloadProgress","maxContentLength","validateStatus","maxRedirects","httpAgent","httpsAgent","cancelToken","socketPath"];r.forEach(o,function(e){"undefined"!=typeof t[e]&&(n[e]=t[e])}),r.forEach(i,function(o){r.isObject(t[o])?n[o]=r.deepMerge(e[o],t[o]):"undefined"!=typeof t[o]?n[o]=t[o]:r.isObject(e[o])?n[o]=r.deepMerge(e[o]):"undefined"!=typeof e[o]&&(n[o]=e[o])}),r.forEach(s,function(r){"undefined"!=typeof t[r]?n[r]=t[r]:"undefined"!=typeof e[r]&&(n[r]=e[r])});var a=o.concat(i).concat(s),u=Object.keys(t).filter(function(e){return a.indexOf(e)===-1});return r.forEach(u,function(r){"undefined"!=typeof t[r]?n[r]=t[r]:"undefined"!=typeof e[r]&&(n[r]=e[r])}),n}},function(e,t){"use strict";function n(e){this.message=e}n.prototype.toString=function(){return"Cancel"+(this.message?": "+this.message:"")},n.prototype.__CANCEL__=!0,e.exports=n},function(e,t,n){"use strict";function r(e){if("function"!=typeof e)throw new TypeError("executor must be a function.");var t;this.promise=new Promise(function(e){t=e});var n=this;e(function(e){n.reason||(n.reason=new o(e),t(n.reason))})}var o=n(23);r.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},r.source=function(){var e,t=new r(function(t){e=t});return{token:t,cancel:e}},e.exports=r},function(e,t){"use strict";e.exports=function(e){return function(t){return e.apply(null,t)}}}])}); 3 | //# sourceMappingURL=axios.min.map -------------------------------------------------------------------------------- /Dashboard/public/static/Ranking/color_ranges.js: -------------------------------------------------------------------------------- 1 | config.color_ranges = { 2 | 'label1': ['#3a6073', '#3a7bd5'], 3 | 'label2': ['#11998e', '#38ef7d'], 4 | }; -------------------------------------------------------------------------------- /Dashboard/public/static/Ranking/config.js: -------------------------------------------------------------------------------- 1 | const config = { 2 | // 数据源的编码方式。 3 | // 默认为UTF-8。 4 | // 如果是国内用户,且使用旧版Execl处理数据,保存的编码很可能是GBK的,如果出现乱码则将这里改成GBK。 5 | // 不建议修改这里。而是建议将自己制作完毕的csv文件的内容复制到example.csv中。因为example.csv的编码格式是所有语言都支持的。 6 | // Encoding is not recommended to be modified. 7 | // Instead, it is recommended to copy the contents of the CSV file produced by yourself to example.csv. 8 | // The encoding format of example.csv is supported by all languages. 9 | encoding: "UTF-8", 10 | 11 | // 每个时间节点最多显示的条目数。 12 | max_number: 14, 13 | 14 | // 控制是否显示顶部附加信息文字。 15 | showMessage: false, 16 | 17 | // 时间自动排序。 18 | // !!!请确保打开此项时,使用的是标准日期格式!(即:YYYY-MM-DD HH:MM) 19 | // 如果关闭,排序顺序为csv表格的时间字段自上而下的出现顺序。 20 | // 如果你的日期格式为标准的日期格式,则可以无视数据排序,达到自动按照日期顺序排序的效果。 21 | // 开启auto_sort可以实现时间的自动补间。 22 | // Auto Sort by Time 23 | // Please ensure using standard datetime format (YYYY-MM-DD HH:MM) when this term is enabled!!! 24 | auto_sort: true, 25 | 26 | // 时间格式化 27 | timeFormat: "%Y-%m-%d", 28 | 29 | // 倒序,使得最短的条位于最上方 30 | reverse: false, 31 | 32 | // 类型根据什么字段区分?如果是name,则关闭类型显示 33 | divide_by: "name", 34 | 35 | // 颜色根据什么字段区分? 36 | divide_color_by: "name", 37 | 38 | // 字段的值与其对应的颜色值 39 | color: { 40 | Chinese: "#1177CC", 41 | Japanese: "#667788" 42 | }, 43 | 44 | // 颜色渐变:颜色绑定增长率 45 | changeable_color: false, 46 | 47 | // 添加功能:不同类型的增长率所用渐变色不同(暗→亮) 48 | // 如果该项为false,那么所有条目全部按照color_range变色 49 | // 如果该项为true,那么按照src/color_ranges.js中的color_ranges变色,默认色板为color_range 50 | // 一个具体的设置模板见src/_color_ranges.js,将其更名为color_ranges.js再设置即可 51 | divide_changeable_color_by_type: false, 52 | color_range: ["#ff7e5f", "#feb47b"], 53 | 54 | // 附加信息内容。 55 | // left label 56 | itemLabel: "国家", 57 | 58 | // right label 59 | typeLabel: "右侧文字", 60 | 61 | // 榜首项目信息的水平位置 。 62 | // Top item information horizontal location 63 | item_x: 250, 64 | 65 | // 时间点间隔时间。 66 | interval_time: 1, 67 | 68 | // 上方文字水平高度。 69 | text_y: 0, 70 | 71 | // 右侧文字横坐标 72 | text_x: 1000, 73 | // 偏移量 74 | offset: 350, 75 | 76 | // 长度小于display_barInfo的bar将不显示barInfo。 77 | // Hide barInfo if bar is shorter than barInfo 78 | display_barInfo: 0, 79 | 80 | // 使用计数器 81 | // 注意!使用计时器和使用类型目前不能兼容,即不能同时开启! 82 | // 计数器会出现在右上角,记录着当前榜首的持续时间。 83 | use_counter: false, 84 | // 每个时间节点对于计数器的步长。 85 | // 比如时间节点日期的间隔可能为1周(七天),那么step的值就应该为7。 86 | step: 1, 87 | 88 | ////////////////////////////////////////////////////////////////////////////// 89 | // 格式化数值 90 | // 这里控制着数值的显示位数。主要靠修改中间的数字完成,如果为1则为保留一位小数。 91 | // 逗号表示每隔三位数用","分割 92 | // '.2f' means keeping two decimals. 93 | format: ",.0f", 94 | 95 | // 后缀 96 | postfix: "", 97 | 98 | // 如果看不懂这是在干什么的话,建议不要修改这里。 99 | // 反格式化函数: 100 | // 格式化操作可能会导致NaN问题。此函数将格式化后的数值反格式化为JS可以识别的数字。 101 | deformat: function(val, postfix) { 102 | return Number(val.replace(postfix, "").replace(/\,/g, "")); 103 | }, 104 | ////////////////////////////////////////////////////////////////////////////// 105 | 106 | // 图表左右上下间距。 107 | // 注意,left_margin不包括左侧的label,修改数值较小会导致左侧label不显示 108 | left_margin: 150, 109 | right_margin: 150, 110 | top_margin: 30, 111 | bottom_margin: 0, 112 | 113 | // 是否开启时间标签。 114 | dateLabel_switch: true, 115 | // 时间标签坐标。建议x:1000 y:-50开始尝试,默认位置为x:null,y:null 116 | dateLabel_x: 1200, 117 | dateLabel_y: 500, 118 | 119 | // 允许大于平均值的条消失时上浮。 120 | allow_up: false, 121 | 122 | // 所有条目上浮 - 用于反向排行榜等情况 123 | always_up: false, 124 | 125 | // 设置动画效果,如果为true,则新进入的条目从0开始。 126 | enter_from_0: true, 127 | 128 | // 如果所有数字都很大,导致拉不开差距则开启此项使得坐标原点变换为(最小值)*2-(最大值) 129 | big_value: true, 130 | 131 | // 如果要使用半对数坐标,则开启此项 132 | use_semilogarithmic_coordinate: false, 133 | 134 | // barinfo太长?也许可以试试这个 135 | long: false, 136 | 137 | // 延迟多少个时间节点开始 138 | wait: 0, 139 | 140 | // 单独控制交换动画速度倍率 141 | update_rate: 1, 142 | 143 | // 开启匀速动画效果 144 | // animation:'linear', 145 | showLabel: true, 146 | 147 | // label x轴位置 148 | labelx: -10, 149 | 150 | use_img: true, 151 | 152 | // 图片路径,本地图片或者网上图片。 153 | // 也可在imgs.js中配置。 154 | imgs: { 155 | item: 156 | "http://i1.hdslb.com/bfs/face/983034448f81f45f05956d0455a86fe0639d6a36.jpg", 157 | 条目: 158 | "http://i1.hdslb.com/bfs/face/983034448f81f45f05956d0455a86fe0639d6a36.jpg", 159 | 任意名称: "path/to/img" 160 | }, 161 | 162 | // 全局背景颜色 163 | background_color: "#FFFFFF", 164 | 165 | // 矩形柱是否为圆角矩形 166 | rounded_rectangle: true, 167 | 168 | // 是否显示x轴轴线 169 | show_x_tick: true, 170 | 171 | // 限制bar info 展示的长度 172 | // limit bar info display length 173 | bar_name_max: 30 174 | }; 175 | -------------------------------------------------------------------------------- /Dashboard/public/static/Ranking/imgs.js: -------------------------------------------------------------------------------- 1 | var external_imgs = { 2 | "label1": "img/path/for/label1", 3 | "label2": "img/path/for/label2" 4 | } -------------------------------------------------------------------------------- /Dashboard/public/static/Ranking/index.html: -------------------------------------------------------------------------------- 1 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 动态排名数据可视化 ver1.7 By Jannchie 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 36 | -------------------------------------------------------------------------------- /Dashboard/public/static/Ranking/stylesheet.css: -------------------------------------------------------------------------------- 1 | /** 2 | * @author Jannchie 3 | * @email jannchie@gmail.com 4 | * @create date 2018-05-03 08:44:46 5 | * @modify date 2019-04-15 15:43:32 6 | */ 7 | body { 8 | margin: 0px; 9 | } 10 | 11 | input { 12 | position: absolute; 13 | top: 50%; 14 | left: 45%; 15 | } 16 | 17 | .domain { 18 | display: none; 19 | } 20 | 21 | .tick line { 22 | stroke: #C0C0BB; 23 | } 24 | 25 | .tick text { 26 | fill: #8E8883; 27 | font-size: 12pt; 28 | font-family: "Fira Code", "Source Han Sans CN" 29 | } 30 | 31 | .label { 32 | fill: #5C5C5C; 33 | font-size: 15pt; 34 | font-family: "Fira Code", "Source Han Sans CN"; 35 | font-weight: bold 36 | } 37 | 38 | .dateLabel { 39 | 40 | fill: #5C5C5C; 41 | display: table-cell; 42 | font-size: 60pt; 43 | font-weight: bold; 44 | font-family: "Fira Code", "Source Han Sans CN" 45 | } 46 | 47 | .dateLabelRed { 48 | 49 | fill: #A72E2E; 50 | display: table-cell; 51 | font-size: 90pt; 52 | font-weight: bold; 53 | font-family: "Fira Code", "Source Han Sans CN" 54 | } 55 | 56 | 57 | .days { 58 | fill: #5C5C5C; 59 | font-weight: bold; 60 | font-size: 55pt; 61 | font-family: "Fira Code", "Source Han Sans CN" 62 | } 63 | 64 | .topLabel { 65 | fill: #5C5C5C; 66 | font-weight: bold; 67 | font-size: 40pt; 68 | font-family: "Fira Code", "Source Han Sans CN" 69 | } 70 | 71 | .top { 72 | fill: #5C5C5C; 73 | font-weight: bold; 74 | font-size: 62pt; 75 | font-family: "Fira Code", "Source Han Sans CN" 76 | } 77 | 78 | .value { 79 | fill: #8A2E2E; 80 | font-size: 20pt; 81 | font-weight: 400; 82 | font-family: "Fira Code", "Source Han Sans CN" 83 | } 84 | 85 | .barInfo { 86 | fill: #FFFFFF; 87 | font-weight: 800; 88 | font-size: 24pt; 89 | font-family: "Fira Code", "Source Han Sans CN" 90 | } 91 | 92 | .axis-label { 93 | fill: #635F5D; 94 | font-size: 32pt; 95 | font-family: "Fira Code", "Source Han Sans CN" 96 | } 97 | 98 | .days { 99 | fill: r#5C5C5C; 100 | font-weight: bold; 101 | font-size: 40pt; 102 | font-family: "Fira Code", "Source Han Sans CN" 103 | } 104 | 105 | .dayslabel { 106 | fill: #5C5C5C; 107 | font-weight: bold; 108 | font-size: 25pt; 109 | font-family: "Fira Code", "Source Han Sans CN" 110 | } 111 | 112 | .growth { 113 | fill: #5C5C5C; 114 | font-weight: bold; 115 | font-size: 40pt; 116 | font-family: "Fira Code", "Source Han Sans CN" 117 | } 118 | 119 | /* MIKU色 */ 120 | .L { 121 | fill: #39C5BB; 122 | } 123 | 124 | /* 龙牙绿 */ 125 | .M { 126 | fill: #006666 127 | } 128 | 129 | .L { 130 | fill: #66CCFF 131 | } 132 | 133 | .N { 134 | fill: #EB0000 135 | } 136 | 137 | .O { 138 | fill: #009714 139 | } 140 | 141 | .P { 142 | fill: #B11111 143 | } 144 | 145 | .Q { 146 | fill: #E24000 147 | } 148 | 149 | .R { 150 | fill: #8605D1 151 | } 152 | 153 | .S { 154 | fill: #00A5BB 155 | } 156 | 157 | .T { 158 | fill: #C21178 159 | } 160 | 161 | .U { 162 | fill: #00A048 163 | } 164 | 165 | .W { 166 | fill: #FFC012 167 | } 168 | 169 | .V { 170 | fill: #F39303 171 | } 172 | 173 | .X { 174 | fill: #933DDA 175 | } 176 | 177 | .Y { 178 | fill: #EE5677 179 | } 180 | 181 | .Z { 182 | fill: #C0620B 183 | } 184 | 185 | .H { 186 | fill: #787878 187 | } 188 | 189 | .G { 190 | fill: #CB1B45 191 | } 192 | 193 | .K { 194 | fill: #0775BE 195 | } 196 | 197 | .J { 198 | fill: #B49D33 199 | } 200 | 201 | .I { 202 | fill: #1B813E 203 | } 204 | 205 | .F { 206 | fill: #DD3287 207 | } 208 | 209 | .E { 210 | fill: #00AF89 211 | } 212 | 213 | .D { 214 | fill: #0F2540 215 | } 216 | 217 | .C { 218 | fill: #2EA9DF 219 | } 220 | 221 | .B { 222 | fill: #0A83E6 223 | } 224 | 225 | .A { 226 | fill: #CF9237 227 | } -------------------------------------------------------------------------------- /Dashboard/public/static/Ranking/university_ranking.csv: -------------------------------------------------------------------------------- 1 | name,type,value,date 2 | 南京大学,220,220,2009 3 | 北京大学,227,227,2009 4 | 上海交通大学,233,233,2009 5 | 清华大学,251,251,2009 6 | 中国科学技术大学,286,286,2009 7 | 浙江大学,302,302,2009 8 | 复旦大学,319,319,2009 9 | 山东大学,343,343,2009 10 | 中国农业大学,410,410,2009 11 | 大连理工大学,412,412,2009 12 | 哈尔滨工业大学,421,421,2009 13 | 华中科技大学,422,422,2009 14 | 吉林大学,426,426,2009 15 | 兰州大学,432,432,2009 16 | 南开大学,440,440,2009 17 | 四川大学,452,452,2009 18 | 中山大学,455,455,2009 19 | 天津大学,458,458,2009 20 | 北京大学,167,167,2010 21 | 清华大学,178,178,2010 22 | 复旦大学,210,210,2010 23 | 南京大学,220,220,2010 24 | 上海交通大学,233,233,2010 25 | 中国科学技术大学,285,285,2010 26 | 浙江大学,300,300,2010 27 | 山东大学,342,342,2010 28 | 四川大学,343,343,2010 29 | 中山大学,347,347,2010 30 | 中国农业大学,410,410,2010 31 | 大连理工大学,413,413,2010 32 | 哈尔滨工业大学,420,420,2010 33 | 华中科技大学,421,421,2010 34 | 吉林大学,425,425,2010 35 | 兰州大学,431,431,2010 36 | 南开大学,437,437,2010 37 | 东南大学,448,448,2010 38 | 天津大学,454,454,2010 39 | 武汉大学,496,496,2010 40 | 清华大学,175,175,2011 41 | 复旦大学,209,209,2011 42 | 南京大学,217,217,2011 43 | 北京大学,224,224,2011 44 | 上海交通大学,231,231,2011 45 | 中国科学技术大学,285,285,2011 46 | 浙江大学,300,300,2011 47 | 中国农业大学,306,306,2011 48 | 华中科技大学,320,320,2011 49 | 山东大学,347,347,2011 50 | 四川大学,348,348,2011 51 | 中山大学,352,352,2011 52 | 北京师范大学,402,402,2011 53 | 北京航空航天大学,403,403,2011 54 | 大连理工大学,413,413,2011 55 | 哈尔滨工业大学,420,420,2011 56 | 吉林大学,421,421,2011 57 | 兰州大学,426,426,2011 58 | 南开大学,435,435,2011 59 | 东南大学,443,443,2011 60 | 北京大学,163,163,2012 61 | 上海交通大学,164,164,2012 62 | 清华大学,173,173,2012 63 | 浙江大学,200,200,2012 64 | 复旦大学,211,211,2012 65 | 南京大学,220,220,2012 66 | 中国科学技术大学,289,289,2012 67 | 中国农业大学,308,308,2012 68 | 华中科技大学,322,322,2012 69 | 吉林大学,328,328,2012 70 | 山东大学,348,348,2012 71 | 四川大学,349,349,2012 72 | 中山大学,353,353,2012 73 | 西安交通大学,400,400,2012 74 | 北京航空航天大学,402,402,2012 75 | 北京师范大学,403,403,2012 76 | 中南大学,409,409,2012 77 | 大连理工大学,413,413,2012 78 | 哈尔滨工业大学,416,416,2012 79 | 兰州大学,422,422,2012 80 | 复旦大学,157,157,2013 81 | 北京大学,166,166,2013 82 | 上海交通大学,167,167,2013 83 | 清华大学,173,173,2013 84 | 浙江大学,200,200,2013 85 | 南京大学,220,220,2013 86 | 中山大学,235,235,2013 87 | 中国科学技术大学,290,290,2013 88 | 北京师范大学,303,303,2013 89 | 中国农业大学,308,308,2013 90 | 哈尔滨工业大学,320,320,2013 91 | 华中科技大学,322,322,2013 92 | 吉林大学,327,327,2013 93 | 山东大学,347,347,2013 94 | 四川大学,348,348,2013 95 | 西安交通大学,400,400,2013 96 | 北京航空航天大学,402,402,2013 97 | 中南大学,409,409,2013 98 | 大连理工大学,413,413,2013 99 | 兰州大学,426,426,2013 100 | 北京大学,119,119,2014 101 | 上海交通大学,122,122,2014 102 | 清华大学,129,129,2014 103 | 复旦大学,152,152,2014 104 | 中国科学技术大学,192,192,2014 105 | 浙江大学,200,200,2014 106 | 北京师范大学,203,203,2014 107 | 哈尔滨工业大学,214,214,2014 108 | 华中科技大学,215,215,2014 109 | 南京大学,225,225,2014 110 | 中山大学,242,242,2014 111 | 西安交通大学,298,298,2014 112 | 北京航空航天大学,301,301,2014 113 | 中南大学,304,304,2014 114 | 中国农业大学,307,307,2014 115 | 大连理工大学,311,311,2014 116 | 吉林大学,330,330,2014 117 | 兰州大学,334,334,2014 118 | 南开大学,337,337,2014 119 | 山东大学,346,346,2014 120 | 北京大学,115,115,2015 121 | 上海交通大学,118,118,2015 122 | 清华大学,126,126,2015 123 | 浙江大学,150,150,2015 124 | 复旦大学,154,154,2015 125 | 中山大学,168,168,2015 126 | 中国科学技术大学,193,193,2015 127 | 北京师范大学,203,203,2015 128 | 哈尔滨工业大学,218,218,2015 129 | 华中科技大学,219,219,2015 130 | 吉林大学,221,221,2015 131 | 南京大学,232,232,2015 132 | 西安交通大学,298,298,2015 133 | 北京航空航天大学,302,302,2015 134 | 中南大学,304,304,2015 135 | 中国农业大学,307,307,2015 136 | 大连理工大学,310,310,2015 137 | 兰州大学,330,330,2015 138 | 南开大学,333,333,2015 139 | 山东大学,345,345,2015 140 | 清华大学,58,58,2016 141 | 北京大学,71,71,2016 142 | 复旦大学,108,108,2016 143 | 上海交通大学,119,119,2016 144 | 中国科学技术大学,143,143,2016 145 | 浙江大学,150,150,2016 146 | 哈尔滨工业大学,154,154,2016 147 | 中山大学,166,166,2016 148 | 西安交通大学,200,200,2016 149 | 北京师范大学,203,203,2016 150 | 华中科技大学,218,218,2016 151 | 吉林大学,222,222,2016 152 | 南京大学,233,233,2016 153 | 四川大学,242,242,2016 154 | 苏州大学,243,243,2016 155 | 华南理工大学,244,244,2016 156 | 东南大学,245,245,2016 157 | 厦门大学,298,298,2016 158 | 北京航空航天大学,302,302,2016 159 | 中南大学,305,305,2016 160 | 清华大学,49,49,2017 161 | 北京大学,72,72,2017 162 | 复旦大学,108,108,2017 163 | 上海交通大学,120,120,2017 164 | 中国科学技术大学,141,141,2017 165 | 浙江大学,150,150,2017 166 | 哈尔滨工业大学,154,154,2017 167 | 四川大学,162,162,2017 168 | 中山大学,163,163,2017 169 | 北京师范大学,202,202,2017 170 | 华中科技大学,217,217,2017 171 | 南京大学,230,230,2017 172 | 苏州大学,242,242,2017 173 | 华南理工大学,243,243,2017 174 | 东南大学,244,244,2017 175 | 电子科技大学,266,266,2017 176 | 武汉大学,297,297,2017 177 | 西安交通大学,298,298,2017 178 | 北京航空航天大学,303,303,2017 179 | 首都医科大学,307,307,2017 180 | 清华大学,45,45,2018 181 | 北京大学,57,57,2018 182 | 浙江大学,67,67,2018 183 | 复旦大学,108,108,2018 184 | 上海交通大学,120,120,2018 185 | 中山大学,121,121,2018 186 | 中国科学技术大学,142,142,2018 187 | 哈尔滨工业大学,154,154,2018 188 | 华中科技大学,156,156,2018 189 | 南京大学,159,159,2018 190 | 四川大学,165,165,2018 191 | 西安交通大学,200,200,2018 192 | 北京航空航天大学,202,202,2018 193 | 北京师范大学,203,203,2018 194 | 中南大学,205,205,2018 195 | 大连理工大学,213,213,2018 196 | 吉林大学,223,223,2018 197 | 苏州大学,244,244,2018 198 | 华南理工大学,245,245,2018 199 | 东南大学,246,246,2018 200 | -------------------------------------------------------------------------------- /Dashboard/src/API.js: -------------------------------------------------------------------------------- 1 | import axios from 'axios'; 2 | import Scraper from './Scraper'; 3 | 4 | const request = require('request'); 5 | 6 | const scraper = new Scraper(); 7 | const http = axios.create({ 8 | baseURL: 9 | process.env.NODE_ENV === 'production' ? 'https://2019ncov-api.now.sh' : 'http://localhost:3000' 10 | }); 11 | // const baidunews = axios.create({ 12 | // baseURL: 13 | // 'http://opendata.baidu.com/data/inner?tn=reserved_all_res_tn&dspName=iphone&from_sf=1&dsp=iphone&resource_id=28565&alr=1&query=%E6%96%B0%E5%86%A0%E8%82%BA%E7%82%8E%E5%9B%BD%E5%A4%96%E7%96%AB%E6%83%85' 14 | // }); 15 | 16 | // export async function request(url) { 17 | // const res = await fetch(url, { mode: 'no-cors' }); 18 | // const data = await res.json(); 19 | // return data; 20 | // } 21 | export default { 22 | async getCases() { 23 | const { data } = await scraper.fetchTimeSeries(); 24 | console.log(data); 25 | return data; 26 | }, 27 | async getTweets(params) { 28 | const { data } = await http('/api/tweets', { 29 | params 30 | }); 31 | return data; 32 | }, 33 | async getFatalityRate() { 34 | // const { data } = await http('/api/fatality-rate'); 35 | // console.log(data); 36 | // console.log(JSON.stringify(data)); 37 | const data = JSON.parse( 38 | '{"byAge":[{"age":"80+ years old","rate":"14.8%"},{"age":"70-79 years old","rate":"8.0%"},{"age":"60-69 years old","rate":"3.6%"},{"age":"50-59 years old","rate":"1.3%"},{"age":"40-49 years old","rate":"0.4%"},{"age":"30-39 years old","rate":"0.2%"},{"age":"20-29 years old","rate":"0.2%"},{"age":"10-19 years old","rate":"0.2%"},{"age":"0-9 years old","rate":"no fatalities"}],"bySex":[{"sex":"Male","rate":"4.7%"},{"sex":"Female","rate":"2.8%"}],"byComorbidity":[{"preExistingCondition":"Cardiovascular disease","rate":"10.5%"},{"preExistingCondition":"Diabetes","rate":"7.3%"},{"preExistingCondition":"Chronic respiratory disease","rate":"6.3%"},{"preExistingCondition":"Hypertension","rate":"6.0%"},{"preExistingCondition":"Cancer","rate":"5.6%"},{"preExistingCondition":"no pre-existing conditions","rate":"0.9%"}]}' 39 | ); 40 | return data; 41 | }, 42 | async getMyTime() { 43 | const { data } = await axios.get( 44 | 'https://api.inews.qq.com/newsqa/v1/automation/modules/list?modules=FAutoNewsArticleList' 45 | ); 46 | return data; 47 | }, 48 | async getChianData() { 49 | const url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5'; 50 | const { data } = await axios.get(`https://bird.ioliu.cn/v1?url=${url}`); 51 | return data; 52 | } 53 | }; 54 | -------------------------------------------------------------------------------- /Dashboard/src/App.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 144 | -------------------------------------------------------------------------------- /Dashboard/src/Home.vue: -------------------------------------------------------------------------------- 1 | 270 | 271 | 432 | 433 | 438 | -------------------------------------------------------------------------------- /Dashboard/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TjFish/COVID-19-Dashboard/7eb23976176e7a1545c27bc05707581d06f40f80/Dashboard/src/assets/logo.png -------------------------------------------------------------------------------- /Dashboard/src/assets/logo.svg: -------------------------------------------------------------------------------- 1 | Artboard 46 2 | -------------------------------------------------------------------------------- /Dashboard/src/components/Chart.vue: -------------------------------------------------------------------------------- 1 | 68 | 69 | 128 | -------------------------------------------------------------------------------- /Dashboard/src/components/DailyReport.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 112 | -------------------------------------------------------------------------------- /Dashboard/src/components/FatalityRateByAge.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 114 | -------------------------------------------------------------------------------- /Dashboard/src/components/FatalityRateByComorbidity.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 109 | -------------------------------------------------------------------------------- /Dashboard/src/components/FatalityRateBySex.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 92 | -------------------------------------------------------------------------------- /Dashboard/src/components/MainlandChina.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 86 | -------------------------------------------------------------------------------- /Dashboard/src/components/Map.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 101 | -------------------------------------------------------------------------------- /Dashboard/src/components/Ranking.vue: -------------------------------------------------------------------------------- 1 | 96 | 97 | 218 | -------------------------------------------------------------------------------- /Dashboard/src/components/RecoveredChart.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 96 | -------------------------------------------------------------------------------- /Dashboard/src/components/Reference.vue: -------------------------------------------------------------------------------- 1 | 80 | 81 | 116 | 117 | 122 | -------------------------------------------------------------------------------- /Dashboard/src/components/SearchDialog.vue: -------------------------------------------------------------------------------- 1 | 49 | 50 | 98 | -------------------------------------------------------------------------------- /Dashboard/src/components/Timeline.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 67 | 68 | 73 | -------------------------------------------------------------------------------- /Dashboard/src/components/TotalCases.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 52 | -------------------------------------------------------------------------------- /Dashboard/src/components/TweetDialog.vue: -------------------------------------------------------------------------------- 1 | 57 | 58 | 121 | -------------------------------------------------------------------------------- /Dashboard/src/components/Tweets.vue: -------------------------------------------------------------------------------- 1 | 45 | 46 | 97 | 98 | 103 | -------------------------------------------------------------------------------- /Dashboard/src/components/WHO.vue: -------------------------------------------------------------------------------- 1 | 55 | 56 | 102 | -------------------------------------------------------------------------------- /Dashboard/src/helpers/index.js: -------------------------------------------------------------------------------- 1 | import moment from 'moment'; 2 | 3 | export default { 4 | URLify(val) { 5 | if (!val) return ''; 6 | 7 | return val.replace( 8 | /((http|https|ftp):\/\/[\w?=&./-;#~%-]+(?![\w\s?&./;#~%"=-]*>))/g, 9 | '$1 ' 10 | ); 11 | }, 12 | fromNow(val) { 13 | return moment(val, 'ddd MMM DD HH:mm:ss Z YYYY').fromNow(); 14 | } 15 | }; 16 | -------------------------------------------------------------------------------- /Dashboard/src/main.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable global-require */ 2 | /* eslint-disable no-underscore-dangle */ 3 | import Vue from 'vue'; 4 | import { Icon } from 'leaflet'; 5 | import VueRouter from 'vue-router'; 6 | import App from './App.vue'; 7 | import Home from './Home.vue'; 8 | import Chart from './components/Chart.vue'; 9 | import WHO from './components/WHO.vue'; 10 | import Ranking from './components/Ranking.vue'; 11 | import './registerServiceWorker'; 12 | import vuetify from './plugins/vuetify'; 13 | import './plugins/vue2-filters'; 14 | import './plugins/vue2-perfect-scrollbar'; 15 | import 'leaflet/dist/leaflet.css'; 16 | import store from './store'; 17 | import Helpers from './helpers'; 18 | 19 | // this part resolve an issue where the markers would not appear 20 | delete Icon.Default.prototype._getIconUrl; 21 | 22 | Vue.config.productionTip = false; 23 | 24 | Vue.filter('URLify', Helpers.URLify); 25 | Vue.filter('fromNow', Helpers.fromNow); 26 | Vue.use(VueRouter); 27 | // 创建路由对象并配置路由规则 28 | const router = new VueRouter({ 29 | routes: [ 30 | // 一个个对象 31 | { path: '/', name: Home, component: Home }, 32 | { path: '/Chart', name: Chart, component: Chart }, 33 | { path: '/WHO', name: WHO, component: WHO }, 34 | { path: '/Ranking', name: Ranking, component: Ranking } 35 | ] 36 | }); 37 | new Vue({ 38 | vuetify, 39 | store, 40 | router, 41 | render: h => h(App) 42 | }).$mount('#app'); 43 | -------------------------------------------------------------------------------- /Dashboard/src/plugins/vue2-filters.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vue2Filters from 'vue2-filters'; 3 | 4 | Vue.use(Vue2Filters); 5 | -------------------------------------------------------------------------------- /Dashboard/src/plugins/vue2-perfect-scrollbar.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import PerfectScrollbar from 'vue2-perfect-scrollbar'; 3 | import 'vue2-perfect-scrollbar/dist/vue2-perfect-scrollbar.css'; 4 | 5 | Vue.use(PerfectScrollbar); 6 | -------------------------------------------------------------------------------- /Dashboard/src/plugins/vuetify.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuetify from 'vuetify/lib'; 3 | import '@mdi/font/css/materialdesignicons.css'; 4 | 5 | Vue.use(Vuetify); 6 | 7 | export default new Vuetify({ 8 | icons: { 9 | iconFont: 'mdi' 10 | } 11 | }); 12 | -------------------------------------------------------------------------------- /Dashboard/src/registerServiceWorker.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | 3 | import { register } from 'register-service-worker'; 4 | 5 | const UpdatedEvent = new CustomEvent('swUpdated'); 6 | 7 | if (process.env.NODE_ENV === 'production') { 8 | register(`${process.env.BASE_URL}service-worker.js`, { 9 | ready() { 10 | console.log( 11 | 'App is being served from cache by a service worker.\n' + 12 | 'For more details, visit https://goo.gl/AFskqB' 13 | ); 14 | }, 15 | registered() { 16 | console.log('Service worker has been registered.'); 17 | }, 18 | cached() { 19 | console.log('Content has been cached for offline use.'); 20 | }, 21 | updatefound() { 22 | console.log('New content is downloading.'); 23 | }, 24 | updated() { 25 | console.log('New content is available; please refresh.'); 26 | document.dispatchEvent(UpdatedEvent); 27 | }, 28 | offline() { 29 | console.log('No internet connection found. App is running in offline mode.'); 30 | }, 31 | error(error) { 32 | console.error('Error during service worker registration:', error); 33 | } 34 | }); 35 | } 36 | -------------------------------------------------------------------------------- /Dashboard/src/store/index.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue'; 2 | import Vuex from 'vuex'; 3 | import createPersistedState from 'vuex-persistedstate'; 4 | 5 | Vue.use(Vuex); 6 | 7 | export default new Vuex.Store({ 8 | state: { 9 | tweetDialog: false, 10 | isDarkTheme: true 11 | }, 12 | mutations: { 13 | SET_TWEET_DIALOG(state, payload) { 14 | state.tweetDialog = payload; 15 | }, 16 | TOGGLE_THEME(state) { 17 | state.isDarkTheme = !state.isDarkTheme; 18 | } 19 | }, 20 | actions: {}, 21 | modules: {}, 22 | plugins: [createPersistedState()] 23 | }); 24 | -------------------------------------------------------------------------------- /Dashboard/vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transpileDependencies: ['vuetify'], 3 | chainWebpack: config => { 4 | config.module 5 | .rule('eslint') 6 | .use('eslint-loader') 7 | .options({ 8 | fix: true 9 | }); 10 | }, 11 | pwa: { 12 | workboxOptions: { 13 | skipWaiting: true 14 | } 15 | }, 16 | publicPath: process.env.NODE_ENV === 'production' 17 | ? '/COVID-19-Dashboard/' 18 | : '/' 19 | }; 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 TjFish 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 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # COVID-19-Dashboard 2 | 新冠疫情数据可视化,包含世界地图,中国地图,3D地球,动态排名,支持省市级交互; 3 | 4 | 数据源:[霍普金斯大学数据](https://github.com/CSSEGISandData/COVID-19) - [世卫组织WHO](https://www.who.int/zh/emergencies/diseases/novel-coronavirus-2019/advice-for-public) - [丁香园实时数据](https://3g.dxy.cn/newh5/view/pneumonia) - [Covid Data](https://github.com/bumbeishvili/covid19-daily-data) - [腾讯新闻](https://news.qq.com/zt2020/page/feiyan.htm#/global) - [国旗图片](https://corona.lmao.ninja/) - [国家中英翻译]() 5 | 6 | ## Demo 7 | 8 | 看这里 9 | 10 | ![Home](./img/home.png) 11 | 12 | ## 参考项目 13 | 14 | ~~我是裁缝王,裁缝王就是我~~ 15 | 16 | - 首页 17 | 18 | - 3d地球 https://github.com/sorxrob/covid3d 19 | 20 | - 国家对比 21 | - 动态排名 22 | - 中国地图 23 | 24 | 框架/组件:[Vuetify](https://vuetifyjs.com/en/) - [Apexchart](https://apexcharts.com/) - [Leaflet](https://leafletjs.com/) - [D3js](https://d3js.org/) - [Globe.gl](https://github.com/vasturiano/globe.gl)- [Material Design Icons](https://materialdesignicons.com/) - [Echart]() - [bird]() 25 | 26 | ## 给学弟学妹的建议(Web课) 27 | 28 | ⛔不要选功能性网站!不要选功能性网站!不要选功能性网站!(如个人博客,网上商城),被怼到怀疑人生 29 | 30 | 👀可以考虑3d游戏,数据可视化,炫酷网页,功能不要求多,重点就是**好看**,金爷爷喜欢 31 | 32 | 👼优秀学长项目 33 | 34 | - 3D魔方 35 | - 探索太空 36 | - 宫崎骏电影小站 37 | - 个人博客 (纯手撸强强强,~~答辩80分反面教材~~) 38 | - WebFPS ——Unity 制作 39 | - Unity导出WebGl了解一下? 40 | 41 | 拿良不难,有成品基本就行,拿优看选题和运气 42 | 43 | ## Q & A 44 | 45 | **Q: Demo网页连接打不开,加载很久?** 46 | 47 | A: 由于部分数据来自国外,需要VPN才能访问 48 | 49 | 50 | 51 | **Q: 项目很好,我想继续开发,有什么建议吗?** 52 | 53 | A: 不要继续开发 54 | 55 | 56 | 57 | **Q: 金👴答辩有什么要注意的吗?** 58 | 59 | A: 只答不辨,问就道歉; 60 | 61 | 老师说的都对,是我没考虑清楚; 62 | 63 | 64 | 65 | **Q: 金爷爷答辩被怼的好惨,咋办?** 66 | 67 | A: 建议心态放轻松, 往年来看被怼也不一定拿良,有时候金爷爷很喜欢你的项目,也会怼你。另外金老师只给70%分数,还有助教捞你一手。 68 | 69 | 70 | 71 | ## Run it 72 | 73 | 运行项目前,需要先安装npm,由于nodejs自带npm,所以直接安装[nodejs](https://nodejs.org/zh-cn/) 即可。 74 | 75 | 下载源代码后,项目分为两个子项目 76 | 77 | - Dashboard 78 | 79 | ```powershell 80 | # 工作目录 81 | cd Dashboard 82 | # 安装依赖 83 | npm install 84 | # 启动server 85 | npm run server 86 | ``` 87 | 88 | ​ open browser http://localhost:8080/ 89 | 90 | - 3d 91 | 92 | ```powershell 93 | cd 3d 94 | npm install 95 | npm run dev 96 | ``` 97 | 98 | ​ open browser http://localhost:1234/ 99 | 100 | **最后,本项目代码混乱,赶工明显,不建议继续开发。谨希望能为学弟学妹们提供一些思路~~** 101 | 102 | **祝好!** 103 | 104 | 105 | 106 | -------------------------------------------------------------------------------- /img/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/TjFish/COVID-19-Dashboard/7eb23976176e7a1545c27bc05707581d06f40f80/img/home.png --------------------------------------------------------------------------------