博客
关于我
记录使用echarts的graph类型绘制流程图全过程(二)- 多层关系和圆形图片的设置
阅读量:458 次
发布时间:2019-03-06

本文共 4362 字,大约阅读时间需要 14 分钟。

本文主要记录在使用echarts的graph类型绘制流程图时候遇到的2个问题:对于圆形图片的剪切和多层关系的设置

图片的设置

如果用echarts默认的symbol参数来显示图片,会显示图片的原始状态,即圆形就显示圆形的,矩形就显示矩形的,而案例中的图片是矩形的(如上图所示)。但是尼,我们在流程图的绘制过程中,一般用到的又是圆形,所以这时候就需要我们自己进行剪切了。主要运用cavans的clip功能,以下是具体的代码实现:

let picList = [];        let tempNodes = [];        for (let i in this.nodesObj) {          let item = this.nodesObj[i];          // 设置已知的信息          let obj = {            x: item.x,            y: item.y,            name: item.name,            id: item.id,            symbolSize: this.size,            category:              item.id === this.startNode || item.id === this.endNode ? 0 : 1          };                    // 如果有图标信息,进行图片处理,没有的直接放到节点信息中          if (item.icon) {            let p = this.getImgData(item.icon);            picList.push(p);            tempNodes.push(obj);          } else {            this.nodes.push(obj);          }        }                // 将图片处理放在promise中,然后使用promise.all,当所有的图片都剪切完毕后,赋值        if (picList.length > 0) {          let that = this;          Promise.all(picList).then(images => {            for (let i = 0, len = tempNodes.length; i < len; i++) {              tempNodes[i].symbol = 'image://' + images[i];              that.nodes.push(tempNodes[i]);            }            // console.log(this.nodes);            // 再设置节点            that.setLinks();            // 把数据设置到Echart中data            if (this.graphChart) {              var option = this.graphChart.getOption();              option.series[0].nodes = this.nodes;              option.series[0].links = this.links;              this.graphChart.setOption(option);            }          });        } else {          // 设置节点          this.setLinks();        }
// 获取icon的图片信息    getImgData (imgSrc) {      var fun = function (resolve) {        const canvas = document.createElement('canvas');        const contex = canvas.getContext('2d');        const img = new Image();        img.crossOrigin = '';        img.onload = function () {          // 设置图形宽高比例          let center = {            x: img.width / 2,            y: img.height / 2          };          let diameter = img.width;          let radius = diameter / 2; // 半径          canvas.width = diameter;          canvas.height = diameter;          contex.clearRect(0, 0, diameter, diameter);          contex.save();          contex.beginPath();          contex.arc(radius, radius, radius, 0, 2 * Math.PI); // 画出圆          contex.clip();          contex.drawImage(            img,            center.x - radius,            center.y - radius,            diameter,            diameter,            0,            0,            diameter,            diameter          ); // 在刚刚裁剪的园上画图          contex.restore(); // 还原状态          resolve(canvas.toDataURL('image/png', 1));        };        img.src = imgSrc;      };      var promise = new Promise(fun);      return promise;    }

实现效果:

多关系合并

echarts的关系最多支持2条显示,所以当2个节点之间存在多个关系的时候,可以把同一个指向的关系合并到一起如下图,周杰伦与刘德华的关系是偶像和同窗,刘德华和周杰伦的关系是好友

也就是获取两个节点之间同方向的线条的关系,然后进行合并,再显示在一条关系线上即可。

// 设置线条    setLinks () {      this.links = [];      this.relationList.forEach(item => {        let obj = {          source: item.source,          target: item.target,          value: item.relName,          label: {            show: true,            formatter: '{c}'          }        };        if (item.sameTotal >= 2) {          let hasLink = this.links.find(link => {            if (link.source === item.source && link.target === item.target) {              return true;            }          });          if (!hasLink) {            let res = this.findSameLinkRelation(              item.source,              item.target,              item.sameTotal            );            obj.value = res.value;            if (res.setLineStyle) {              obj.lineStyle = {                normal: {                  curveness: 0.2                }              };            }            this.links.push(obj);          }        } else {          this.links.push(obj);        }      });}
findSameLinkRelation (sid, tid, total) {      let value = [];      let setLineStyle = true;      this.relationList.forEach(item => {        if (item.source === sid && item.target === tid) {          value.push(item.relName);        }      });      if (total === value.length) {        setLineStyle = false;      }      value = value.join('、');      return {        value,        setLineStyle      };}

转载地址:http://zfubz.baihongyu.com/

你可能感兴趣的文章
NIFI分页获取Postgresql数据到Hbase中_实际操作---大数据之Nifi工作笔记0049
查看>>
NIFI同步MySql数据_到SqlServer_错误_驱动程序无法通过使用安全套接字层(SSL)加密与SQL Server_Navicat连接SqlServer---大数据之Nifi工作笔记0047
查看>>
Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
查看>>
NIFI大数据进阶_FlowFile拓扑_对FlowFile内容和属性的修改删除添加_介绍和描述_以及实际操作---大数据之Nifi工作笔记0023
查看>>
NIFI大数据进阶_FlowFile生成器_GenerateFlowFile处理器_ReplaceText处理器_处理器介绍_处理过程说明---大数据之Nifi工作笔记0019
查看>>
NIFI大数据进阶_Json内容转换为Hive支持的文本格式_操作方法说明_01_EvaluteJsonPath处理器---大数据之Nifi工作笔记0031
查看>>
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka消费者处理器_来消费kafka数据---大数据之Nifi工作笔记0037
查看>>
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
查看>>
NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
查看>>
NIFI大数据进阶_NIFI监控功能实际操作_Summary查看系统和处理器运行情况_viewDataProvenance查看_---大数据之Nifi工作笔记0026
查看>>
NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
查看>>
NIFI大数据进阶_NIFI集群知识点_认识NIFI集群以及集群的组成部分---大数据之Nifi工作笔记0014
查看>>
NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
查看>>
NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
查看>>
NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
查看>>
NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_01---大数据之Nifi工作笔记0033
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_说明操作步骤---大数据之Nifi工作笔记0028
查看>>
NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
查看>>