使用阿里的中国地图的json替换echarts中的china.js中的内容

文末有相关资源

这两天公司要求做一个地图展示要求每个省份根据用户量多少展示不同的颜色,且给每个市级单位加标注,于是乎研究了一下,找了好多平台(高德,百度,简数科技等)发现还是echarts好用.
但是有一个小问题就是echarts官方提示他们的地图json测绘不符合中国官方标准不提供下载,实际上包里面包含了且可以使用.(小心驶得万年船)

1.先去阿里官方下载中国地图的json文件
https://geo.datav.aliyun.com/areas_v2/bound/100000_full.json(已失效)
2.下载完后在echarts中的china.js直接替换发现可以使用啥事都没有,但是其实是有一个隐藏的坑,要注意一下就是json中各省市的命名要和代码里面的命名相同不同的话好多的操作时不能进行的
3.然后接着往下看发现阿里的json数据字段名称和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('保存的数据为空');
            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
    },
    // 对地图坐标进行压缩
    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('保存的数据为空');
            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舒服多了,但是如何使用呢?复制粘贴到
echarts/map/js/china.js里面即可

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

将china后面之前的删掉把我们生成的json直接粘贴过了即可使用了

注意一定保证china.js中省市名称和自己写的代码中设置的省市名称一致

展示一个简陋的效果图


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

资源列表
china.json/encodeChina.js/china.js/alichina.json
echarts官方给的geojson的格式
展示省市详细信息

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343