自建GraphViz API

本文使用PHP实现了一种与Google GraphViz Charts参数兼容的API,相较于Google GraphViz Charts API的优点是支持中文。

环境搭建

基于Debian,需要安装GraphViz及gd库

API代码

演示

参数与Google GraphViz Charts一致,及

  • cht=gv[:<opt_engine>]  ,  可选参数  , 如果没有,这默认为gv:dot。其他可用引擎有 neato twopi circo fdp sfdp (比Google GraphViz Charts多一个sfdp)
  • chl=<DOT_string>,  必选参数。支持中文
  • chof=<png|gif|jpeg>, 可选参数,默认为png

Discuz插件形式的演示:http://www.tecbbs.com/forum.php?mod=viewthread&tid=6724

WordPress尚未做成插件,暂时直接URL插入图片

GraphViz API演示

GraphViz API演示

中文图片

GraphViz中文演示

问题

直接返回图片内容

API一开始返回的是图片URL,这样程序需要有2次HTTP请求才能确定图片链接,会严重拖慢网页加载速度。因此改为直接返回图片内容,只需要一次HTTP请求。

eval()函数将字符串作为PHP代码来执行。

Gif not recognized问题

如果API搭建在Centos上,可能需要rpm方式安装GraphViz,yum方式的GraphViz版本太旧,不支持gif输出。 需要安装 graphviz-gd。

另外,GraphViz 的repo文件链接是:wget http://www.graphviz.org/graphviz-rhel.repo,下载之后可以直接yum安装最新稳定版本的GraphViz。

urlencode问题

dot源码需要进行urlencode,但是考虑到和Google GraphViz Charts保持一致,只进行部分字符的encode

如果不encode,获得的dot源码不完整

完整的代码是

中文字体问题

需要安装中文字体,否则中文将乱码,可以直接拷贝其他机器的wqy-microhei字体。

$_GET解码问题

PHP官网明确指出:超全局变量 $_GET 和 $_REQUEST 已经被解码了。对 $_GET 或 $_REQUEST 里的元素使用 urldecode() 将会导致不可预计和危险的结果。

本文实现的API会将dot源码保持为文件,文件名使用dot源码的md5值

由于$_GET已经经过了urldecode,所以客户端程序使用dot源码文件名时也需要urldecode,这样才能获取正确的文件名

2.38中文问题

Debian7和Centos6.5软件源里的GraphViz都是2.26版本的,目前(15年6月)最新稳定版本是2.38,手贱升级到了2.38,发现该版本子图中文显示有问题。上文演示的图片,代码如下:

使用2.38生成的图片

subgraph_zh

subgraph_zh

网上搜索的结果,一个说是引号问题

macbook darwin下安装了graphviz 2.38.0。
画有向图digraph的时候,如果label中包含中文字符,生成的图片中会缺文字。
网上的解释是fontname没有设置的原因,可设置fontname后还是会出现同样的问题。

例如:
digraph Geely {
node [shape=record,fontname="SimSun.ttf"];
edge [fontname="SimSun.ttf"];

jlwy [label="吉利万源"];
jlzy [label="吉利兆园"];
volv [label="沃尔沃"];

jlwy -> jlzy [label="87.65%"];
jlzy -> volv [label="100%"];

}

生成的图像中,连接线上的百分比有,但节点中的内容是空的。

偶然原因,在引号中的中文前加了个空格,字符就能显示出来了,可能是个bug吧,总之问题解决了。
volv [label=" 沃尔沃"];

按照此方法能够正常显示图片。

另一个说是shape问题

可是子图里面的节点却依然是空(不是乱码,只是没有内容)。于是我查找半天,最终发现罪魁祸首是:
zongshu_title [label = "研究综述" shape=record]
看到了吧?就是最后这句shape=record。为什么有问题?不知道。但是把它删去,一点不改变原先的图形结构,中文却又都出来了。

按照此方法中文是可以显示了,但是形状效果都没了

subgraph_zh

subgraph_zh

参考资料

One thought on “自建GraphViz API

  1. Pingback: Discuz插件处理大型dot源码 | 知行近思

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注