Google GraphViz Charts API在国内无法正常访问。本文实现了一种代理访问Google GraphViz Charts的方法。
参数列表
- cht=gv[:<opt_engine>] , 可选参数 , 如果没有,这默认为gv:dot。其他可用引擎有 neato twopi circo fdp
- chl=<DOT_string>, 必选参数。注意
不支持 // 风格注释,urlencode换行符后可以支持//风格注释。不支持中文
Google官网的一些说明
- The graph attribute size should be not be used; use the Chart API parameter chs instead.
- The maximum number of nodes is 200, and the maximum for edges is 400.
- Anti-aliasing, transparency, and alternate fonts are not supported.
- The node attributes image and shapefile are not supported, and will result in an error if present.
- The graph attributes ratio, margin, and pad are not supported, and will be ignored if present.
第三条明确说了不支持alternate fonts。
一些演示
搜集一些来自网络的dot源码用来测试。
digraph {
"A" [shape="circle"];
"B" [shape="rectangle"];
"C" [shape="diamond"];
"A" -> "B" [label="A to B"];
"B" -> "C" [label="B to C"];
"A" -> "C" [label="A to C"];
}
效果如图:

更多的展示
digraph {
"Back" [shape="egg" color="green" style="filled" fillcolor="yellow"];
"Forth" [shape="house" color="red"];
"Other" [shape="invtriangle" color="blue"];
"Back" -> "Forth" [color="orange" label="weee"];
"Forth" -> "Back" [color="purple" label="eeew"];
"Other" -> "Forth"
"Other" -> "Back"
}
效果图

再来个状态机
digraph {
node [shape=circle,fontsize=8,fixedsize=true,width=0.9];
edge [fontsize=8];
rankdir=LR;
"low-priority" [shape="doublecircle" color="orange"];
"high-priority" [shape="doublecircle" color="orange"];
"s1" -> "low-priority";
"s2" -> "low-priority";
"s3" -> "low-priority";
"low-priority" -> "s4";
"low-priority" -> "s5";
"low-priority" -> "high-priority" [label="wait-time exceeded"];
"high-priority" -> "s4";
"high-priority" -> "s5";
}

一个哈希表
digraph st2{
fontname = "Verdana";
fontsize = 10;
rankdir=TB;
node [fontname = "Verdana", fontsize = 10, color="skyblue", shape="record"];
edge [fontname = "Verdana", fontsize = 10, color="crimson", style="solid"];
st_hash_type [label="{<head>st_hash_type|(*compare)|(*hash)}"];
st_table_entry [label="{<head>st_table_entry|hash|key|record|<next>next}"];
st_table [label="{st_table|<type>type|num_bins|num_entries|<bins>bins}"];
st_table:bins -> st_table_entry:head;
st_table:type -> st_hash_type:head;
st_table_entry:next -> st_table_entry:head [style="dashed", color="forestgreen"];
}

子图
注意子图命名必须以cluster为前缀,见官方说明。
digraph abc{
node [shape="record"];
edge [style="dashed"];
a [style="filled", color="black", fillcolor="chartreuse"];
b;
subgraph cluster_cd{
label="c and d";
bgcolor="mintcream";
c;
d;
}
a -> b;
b -> d;
c -> d [color="red"];
}
效果图

实现方式
实现方式很简单,需要有一个国外的虚拟主机或者VPS,用做代理来访问Google Chart API,将结果返回即可。代码如下
<?php
/**
* proxy of google chart graphviz api
*
* $Id proxy.php tecbbs@qq.com 2015-5-29 $
**/
$api = "https://chart.googleapis.com/chart?";
$cht = "gv";
$chl = "graph {fontname=\"SimSun\";node{shape=box];a[label=\"nothing to do~\"];}";
$chof = "gif";
function curlGet($url) {
$ch = curl_init();
curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, FALSE );
curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );
curl_setopt ( $ch, CURLOPT_HEADER, 0 );
$data = curl_exec ($ch);
return $data;
}
$url = $api;
$i = 0;
$sum = count($_GET);
foreach($_GET as $k => $v) {
if($k == "chl" || $k == "chdl" || $k == "chxl") {
$v = urlencode($v);
}
$i++;
if($i<$sum)
$url .= $k . "=" . $v . "&";
else
$url .= $k . "=" . $v;
}
header("Content-Type: image/webp; charset=UTF-8");
$data = curlGet($url);
die($data);
?>
代码笔记
一开始不懂设置Response Header,返回的直接是图片的乱码,放在img src里可以显示,但是新窗口打开图片就全是乱码了。设置Response Header的方法:
header("Content-Type: image/webp; charset=UTF-8");
参考资料
[1]. http://www.cnblogs.com/CoolJie/archive/2012/07/17/graphviz.html [2]. http://steveliles.github.io/making_pretty_diagrams_with_graphviz.html [3]. https://developers.google.com/chart/image/docs/gallery/graphviz [4]. http://www.cnblogs.com/ainiaa/archive/2010/11/10/1873421.html
访问其他类型的Google charts api也可以,比如数学公式,cht=tx即可
Pingback: 自建GraphViz API | 知行近思
http://guiquanz.me/2014/03/15/graphviz-dot-in-all/
wordpress插件找到的相关结果http://blog.flirble.org/2010/11/12/graphviz-demo/https://github.com/mdaines/viz.js