首页 > 其他分享 >使用阿里的中国地图的json替换echarts中的china.js中的内容

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

时间:2022-10-16 22:02:06浏览次数:76  
标签:alifeature val geometry properties json let china echarts

使用阿里的中国地图的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的格式
展示省市详细信息

https://www.jianshu.com/p/95f03c6d4c42

标签:alifeature,val,geometry,properties,json,let,china,echarts
From: https://www.cnblogs.com/sunny3158/p/16797344.html

相关文章

  • 解决Vue打印带有echarts的pdf问题
    智能中医项目中开发一个打印报告,报告里有患者的基本信息、病况和echarts展示的一些图表,解决了一下午终于解决。彩色打印效果如下:总体效果还是不错,汇总一下处理方法。修......
  • PHP的json_encode失败的问题
    后端收到数据时,exif_read_data可以正常读取到返回数组的Orientation值,但是imagerotate()操作就是无效。然后在写log时,发现用json_encode(exif_read_data($file_path......
  • ECharts笔记
    ECharts笔记使用五步骤:引入echart.js→准备显示的盒子→初始化echarts实例对象→准备配置项→将配置项设置给echarts实例对象通用配置(所有配置项都可以添加)//......
  • hive解析多层json嵌套
    原有的json数据如下:   现在如何取到两层嵌套里面的json? 思路分析:1、重点是取到内层的json并解析,但是内层是一个json数组。怎么解析json数组?2、将内层json数组......
  • XML格式文件转JSON
    XML格式转json格式,需要用到xmltodict库。安装:pipinstallxmltodictimportxmltodictimportjsonxmlStr="""<?xmlversion="1.0"encoding="UTF-8"?><student......
  • golang中json.Marshal自定义浮点数格式化样式
    golang中如果有以下的类型typeQpsObjstruct{Keystring`json:"key"`Qpsfloat64`json:"qps"`}json.Marshal后会输出如下的字符串 {"key":"test","qp......
  • Django ORM QuerySet转json
    下面是Django中两种常用的ORM查询models.Component.objects.filter(...).all()models.Component.objects.values(...)第一种我们可以使用serializers.serialize("json",c......
  • 网络通信——HTTP接口访问——移动数据格式JSON
        网络通信的交互数据格式有两大类,分别是JSON和XML。对于App来说,基本采用JSON格式与服务器通信。JSON相比XML的优势主要有两个:(1)手机流量很贵,表达同样的信息,J......
  • [Java] jackson 和 fastjson 处理 JSON对比
    JSON字符串->对象处理原型数值实体类@Setter@Getter@ToStringpublicclassInfo{privateintage;}测试代码@TestpublicvoidtestString()throwsJso......
  • echarts多表联动初步
    在大数据的学习过程中,后台数据分析、输出很重要,但最终是将其表现在图表上,使用echarts进行数据可视化官网上给出的数据可视化是饼图和折线图的联动,饼图和其他图的联动基本......