使用阿里的中國地圖的json替換echarts中的china.js中的內(nèi)容

文末有相關(guān)資源

這兩天公司要求做一個地圖展示要求每個省份根據(jù)用戶量多少展示不同的顏色,且給每個市級單位加標(biāo)注,于是乎研究了一下,找了好多平臺(高德,百度,簡數(shù)科技等)發(fā)現(xiàn)還是echarts好用.
但是有一個小問題就是echarts官方提示他們的地圖json測繪不符合中國官方標(biāo)準(zhǔn)不提供下載,實(shí)際上包里面包含了且可以使用.(小心駛得萬年船)

1.先去阿里官方下載中國地圖的json文件
https://geo.datav.aliyun.com/areas_v2/bound/100000_full.json(已失效)
2.下載完后在echarts中的china.js直接替換發(fā)現(xiàn)可以使用啥事都沒有,但是其實(shí)是有一個隱藏的坑,要注意一下就是json中各省市的命名要和代碼里面的命名相同不同的話好多的操作時不能進(jìn)行的
3.然后接著往下看發(fā)現(xiàn)阿里的json數(shù)據(jù)字段名稱和echarts不同
4.自己拼字段生成一份json文件!

// 這個json是阿里的
import json from '../assets/china.json'

export default {
  methods: {
   disposeJson () {
      let allData = {}
      allData['type'] = 'FeatureCollection'      
      let alifeatures = json['features']
      let features = []
      for (let index = 0; index < alifeatures.length; index++) {
        let alifeature = alifeatures[index];
        let feature = {}
        feature['type'] = 'Feature'
        let id = alifeature['properties']['adcode']
        let cp = alifeature['properties']['center']
        let name = alifeature['properties']['name']
        let childrenNum = alifeature['properties']['childrenNum']
        let coordinates = alifeature['geometry']['coordinates']
        let properties = {}
        feature['id'] = id
        properties['cp'] = cp;
        properties['id'] = id;
        properties['name'] = name;
        properties['childNum'] = childrenNum;
        feature['properties'] = properties
        let geometry = {}
        geometry['type'] = 'MultiPolygon'
        geometry['coordinates'] = coordinates
        feature['geometry'] = geometry
        features.push(feature)
      }
      allData['features'] = features;
      this.saveJSON(allData, 'china.json')
    },
    saveJSON (data, filename) {
        if(!data) {
            alert('保存的數(shù)據(jù)為空');
            return;
        }
        if(!filename) 
            filename = 'json.json'
        if(typeof data === 'object'){
            data = JSON.stringify(data, undefined, 4)
        }
        var blob = new Blob([data], {type: 'text/json'}),
        e = document.createEvent('MouseEvents'),
        a = document.createElement('a')
        a.download = filename
        a.href = window.URL.createObjectURL(blob)
        a.dataset.downloadurl = ['text/json', a.download, a.href].join(':')
        e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)
        a.dispatchEvent(e)
    }
  }
}

5.好了新的json生成了可以使用了,看一眼,我去這么大3M8萬行,壓縮一下
壓縮的方法出處

  disposeJson () {
      let allData = {}
      allData['type'] = 'FeatureCollection'      
      let alifeatures = json['features']
      let features = []
      for (let index = 0; index < alifeatures.length; index++) {
        let alifeature = alifeatures[index];
        let feature = {}
        feature['type'] = 'Feature'
        let id = alifeature['properties']['adcode']
        let cp = alifeature['properties']['center']
        let name = alifeature['properties']['name']
        let childrenNum = alifeature['properties']['childrenNum']
        let coordinates = alifeature['geometry']['coordinates']
        let properties = {}
        feature['id'] = id
        properties['cp'] = cp;
        properties['id'] = id;
        properties['name'] = name;
        properties['childNum'] = childrenNum;
        feature['properties'] = properties
        let geometry = {}
        geometry['type'] = 'MultiPolygon'
        this.disposeCoordinates(coordinates,geometry)
        feature['geometry'] = geometry
        features.push(feature)
      }
      allData['features'] = features;
      this.saveJSON(allData, 'china')
    },
    disposeCoordinates (coordinates, geometry) {
      let coordinateArr = []
      let encodeOffsets = []
      for (let index = 0; index < coordinates.length; index++) {
        let coordinate = coordinates[index];
        let encodeOffset = []
        coordinateArr.push([this.encodePolygon(coordinate[0],encodeOffset)])
        encodeOffsets.push([encodeOffset])
      }
      geometry['coordinates'] = coordinateArr
      geometry['encodeOffsets'] = encodeOffsets
    },
    // 對地圖坐標(biāo)進(jìn)行壓縮
    encodePolygon(coordinate, encodeOffsets) {
      var result = '';
      var prevX = this.quantize(coordinate[0][0]);
      var prevY = this.quantize(coordinate[0][1]);
      // Store the origin offset
      encodeOffsets[0] = prevX;
      encodeOffsets[1] = prevY;
      for (var i = 0; i < coordinate.length; i++) {
        var point = coordinate[i];
        result+=this.encode(point[0], prevX);
        result+=this.encode(point[1], prevY);
        prevX = this.quantize(point[0]);
        prevY = this.quantize(point[1]);
      }
      return result;
    },
    encode(val, prev){
      // Quantization
      val = this.quantize(val);
      // var tmp = val;
      // Delta
      val = val - prev;
      if (((val << 1) ^ (val >> 15)) + 64 === 8232) {
        //WTF, 8232 will get syntax error in js code
        val--;
      }
      // ZigZag
      val = (val << 1) ^ (val >> 15);
      // add offset and get unicode
      return String.fromCharCode(val+64);
      // var tmp = {'tmp' : str};
      // try{
      //   eval("(" + JSON.stringify(tmp) + ")");
      // }catch(e) {
      //   console.log(val + 64);
      // }
    },
    quantize(val) {
        return Math.ceil(val * 1024);
    },
    saveJSON (data, filename) {
        if(!data) {
            alert('保存的數(shù)據(jù)為空');
            return;
        }
        if(!filename) 
            filename = 'json.json'
        if(typeof data === 'object'){
            data = JSON.stringify(data, undefined, 4)
        }
        var blob = new Blob([data], {type: 'text/json'}),
        e = document.createEvent('MouseEvents'),
        a = document.createElement('a')
        a.download = filename
        a.href = window.URL.createObjectURL(blob)
        a.dataset.downloadurl = ['text/json', a.download, a.href].join(':')
        e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null)
        a.dispatchEvent(e)
    }

6.壓完看了一眼100多k舒服多了,但是如何使用呢?復(fù)制粘貼到
echarts/map/js/china.js里面即可

截屏2020-10-22下午3.29.28.png

將china后面之前的刪掉把我們生成的json直接粘貼過了即可使用了

注意一定保證china.js中省市名稱和自己寫的代碼中設(shè)置的省市名稱一致

展示一個簡陋的效果圖


截屏2020-10-23下午1.52.56.png

資源列表
china.json/encodeChina.js/china.js/alichina.json
echarts官方給的geojson的格式
展示省市詳細(xì)信息

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市佑吝,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嚎朽,老刑警劉巖披泪,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绣版,死亡現(xiàn)場離奇詭異锦爵,居然都是意外死亡子房,警方通過查閱死者的電腦和手機(jī)形用,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來证杭,“玉大人田度,你說我怎么就攤上這事〗夥撸” “怎么了镇饺?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長送讲。 經(jīng)常有香客問我奸笤,道長,這世上最難降的妖魔是什么哼鬓? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任监右,我火速辦了婚禮,結(jié)果婚禮上异希,老公的妹妹穿的比我還像新娘健盒。我一直安慰自己,他們只是感情好称簿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布扣癣。 她就那樣靜靜地躺著,像睡著了一般憨降。 火紅的嫁衣襯著肌膚如雪父虑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天授药,我揣著相機(jī)與錄音士嚎,去河邊找鬼。 笑死悔叽,一個胖子當(dāng)著我的面吹牛航邢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播骄蝇,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼膳殷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了九火?” 一聲冷哼從身側(cè)響起赚窃,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎岔激,沒想到半個月后勒极,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡虑鼎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年辱匿,在試婚紗的時候發(fā)現(xiàn)自己被綠了键痛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡匾七,死狀恐怖絮短,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情昨忆,我是刑警寧澤丁频,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站邑贴,受9級特大地震影響席里,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜拢驾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一奖磁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧繁疤,春花似錦署穗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至麻养,卻和暖如春褐啡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鳖昌。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工备畦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人许昨。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓懂盐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親糕档。 傳聞我的和親對象是個殘疾皇子莉恼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353