引言

以往在采用PHP语言进行地震前兆类数据的网上图形化发布与展示时,会遇到很多在图形绘制方面的问题,需要掌握复杂的专业图形绘制命令,或者借助非系统化的图形类库来实现,十分不便,这也限制了PHP语言在图形类展示网站中的应用。JpGraph类库的出现(杨挺等,2010),缓解了这些问题,使PHP语言在图形化的展示与发布方面有了明显的改变。本文主要说明笔者在使用此类库时,在实现天津地震前兆数据的图形化发布方面的情况(王建国等,2010)。

1 JpGraph类库介绍
1.1 JpGraph类库说明

JpGraph类库是基于PHP语言编写的面向对象的图形类库,它使得在WEB界面中制图变成了一件非常简单的事情,用户只需掌握为数不多的JpGraph内置函数,组织好数据,定义图表标题,图表类型,并将这些参数与数据交付给JpGraph即可。

利用JpGraph可生成柱状图、饼状图、甘特图、网状图等常用的一些图形,同时支持的图片格式有GIF、JPG和PNG。JpGraph生成的图形采用网络优化设计,300×200像素的图片大小约为2Kb,它支持GD1、GD2、3D透明和α混合技术,可使用超过400种的已命名颜色,有多种方式生成带背景的图片。同时它还可以使生成的图形采用网络缓存以减轻HTTP服务器负担。图1为JpGraph生成的样图。

图 1JpGraph样图 Fig. 1A sample plot of JpGraph
1.2 JpGraph类库安装

JpGraph的官方下载地址是http://jpgraph.net/download/,下载时要根据所用的PHP版本来选择下载哪个版本的JpGraph库文件。

下载完成后,将JpGraph解压到http服务可以访问的任意目录下即可,笔者将其解压到http服务的文档目录中。

JpGraph需要PHP的支持,要确保PHP版本最低为4.04,同时系统中一定要支持GD库,JpGraph是基于GD库设计的。

在JpGraph目录下,除了版本与系统说明文件外,还有docs和src两个目录,docs中保存着JpGraph的相关技术文档与帮助文件,包括从开始安装配置到使用说明、函数介绍等。src目录里面包含了JpGraph库文件和很多的样例文件,在使用中可以通过查看学习它的样例文件以快速创建各类图形。

在JpGraph库文件目录中有一个名为jpg-config.inc的文件,是JpGraph的配置文件,可在这里设置JpGraph的相关参数,如设置cache(缓存)文件夹,和TTF(字体)文件夹等。

注意事项:①cache文件夹路径可以自己定义,而TTF(字体)文件夹必须是%system%/Fonts;②确保PHP对cache(缓存)文件夹有写的权限;③JpGraph的字符编码为UTF-8,在使用中文字符要注意编码转换。

1.3 JpGraph类库程序设计说明

在WEB页面上创建和使用JpGraph图片的主要步骤为:①创建脚本,通过获得数据,指定图片如何构建、图形大小、颜色、字体以及要在图片上展示的其他内容。②在WEB页面上增加img标签链接,设计好的JpGraph图像程序脚本进行展示。

JpGraph图像程序脚本的设计主要包括以下参数及步骤:
// 包含必要的类库文件
require_once 'jpgraph.php';
require_once '....';
// 创建Graph类实例
$graph = new Graph($width,$height, ...);
// 设定尺度类型
$graph->SetScale('...');
// 构建图形的细节和图形模型对象
// 将一个或多个图形模型对象添加到图形上
$graph->Add(..);
// 将图形送至浏览器显示
$graph->Stroke();
?>

JpGraph是完全面向对象的,所有调用都是针对类的具体实例。其中的基础类就是Graph,代表整个图表。创建了Graph对象后,所有代码的添加都是为了构造图的细节。脚本中最后调用方法Graph::Stroke()是将已构造好的图发送到浏览器上。

JpGraph图像压缩格式有多种选择,默认是以PNG、JPEG、GIF的顺序自动选择图片格式的,哪种可用取决于安装JpGraph类库的系统,有以下两种方法可以改变图片格式。

(1)改变JpGraph配置文件jpg-config.inc.php中定义的默认图像格式,即:
DEFINE('DEFAULT_GFORMAT','auto')

如果希望所有的图片都是以JPG编码格式产生,需要将其修改为:
DEFINE('DEFAULT_GFORMAT','jpg')

(2)在脚本中选择希望使用的压缩格式,通过调用Image::SetImgFormat()方法实现,如希望使用JPG格式发送图片至浏览器时,语句如下:
img->SetImgFormat('jpg'); ?>

在程序脚本中,几乎所有图形程序的最后一行都是$graph->Stroke(),因为从这一行开始,才进行实际的图形创建,Stroke方法按照以下步骤创建图形。

(1)开始在内存中建立图片。这是通过分析指定的参数以及提供的数据来创建各种已指定的图形模式;

(2)检查需要发送什么header,比如图形使用哪种图像压缩格式,然后将header发送到客户端;

(3)发送实际的图片数据至客户端。

2 采用JpGraph类库实现前兆数据的图形化发布
2.1 绘图准备

天津前兆数据库的建设分为两个阶段:2001—2012年的“九五”数字化及模拟仪器的数据,保存在Sql Server前兆数据库中(王建国等,2009a);2006年至今的“十五”数字化仪器数据,保存在Oracle前兆数据库中。从2012年起,Sql Server前兆数据库中的数据全部迁移到Oracle前兆数据库中(王建国等,2009b)。因此,为了实现前兆数据的在线可视化展示,需要有方法将其读取到http服务中。

在Linux平台下,需要使用configure选项--with-oracle[=ORACLE_HOME目录] 重新编译PHP,从而使PHP支持Oracle数据库的读取。

现在有多种可供使用的API支持Oracle数据库读取,各种版本的优劣性如下:

(1)早期的Oracle extension是针对Oracle的早期版本(至少7以前)设计的,其不支持oracle的一些新特性。现在基本上已经不用这一套API了;

(2)在windows平台通过ODBC访问,这是使用windows带来的便利。ODBC的效率和功能都还不错,但在使用Oracle的LOB字段和带参数的存储过程时会有问题;

(3)通过兼容Oracle Call Interface的oci8 extension访问,这套函数功能很全,支持oracle8+(8/8i,9i,10g),是Oracle官方推荐的API,在php5中,提供了一套新的OCI函数,新的OCI改进了不少,功能更全面了,能更好地支持LOB对象;

(4)最近发布的php 5.1中,引入了一个抽象数据层PDO,也可以通过它来访问Oracle;

(5)ADOdb是“Active Data Object DataBase”的缩写,提供了与Microsoft的ADO类似的功能,其主要工作就是将多样化的PHP数据库操作函数统一起来,以提高PHP数据库操作能力的可移植性。目前ADOdb已经支持MySql、Inormix、Oracle、MS SQL、Access、Sybase等多种数据库;

(6)第三方接口,目前较成熟的产品是Zend Core for Oracle,并且有免费版本可供下载使用。

笔者在系统中使用OCI和ADOdb的方式来读取Oracle数据库。采用FreeTDS对Sqlserver进行数据读取。FreeTDS为Linux系统提供了TDS协议的开源客户端,由于MS SQL的使用就是TDS协议,所以在Linux中可以用FreeTDS连接MS SQL。编译安装完FreeTDS后,可通过如下方式进行数据读取:
$msconnect=mssql_connect("服务器","用户名","密码");
$msdb=mssql_select_db("数据库名",$msconnect);
$msquery = "select * from temp";
$msresults= mssql_query($msquery);
while ($row = mssql_fetch_array($msresults)) {
echo "

  • $row['tempfield']
  • \n";}
    ?>
    2.2 图形绘制与发布

    完成准备工作后,笔者为各类前兆数据编写了图形生成脚本,以下清单为图形生成的核心代码。


    ‘此处各类引用配置信息,数据读取与分类等信息
    $graph=new Graph(568,250); 建立图形对象
    $graph->SetScale("textlin"); 设置刻度样式
    $graph->img->SetMargin(50,30,30,30); 设置图表边界
    $graph->title->SetFont(FF_SIMSUN,FS_NORMAL,10); 设置主标题字体
    $graph->title->Set($title); 设置主标题
    $graph->subtitle->SetFont(FF_SIMSUN,FS_NORMAL,10);
    $graph->subtitle->Set($subtitle); 设置附标题
    $graph->xaxis->SetPos('min'); 设置X轴坐标从小到大进行排列
    $graph->xaxis->SetTickLabels($b); 将$b数组中的数据显示为X轴坐标数据
    if ($type==1) 分钟值或秒值时设置X轴坐标间隔
    { $graph->xaxis->SetTextTickInterval(60,0);}
    elseif ($type==2)
    { $graph->xaxis->SetTextTickInterval(3600,0);}
    if ($type==6 or $type==0) 整点值或日值时建立红色数据点位
    { $sp1=new ScatterPlot($data);
    $sp1->mark->SetFillColor('red@0.3');
    $sp1->mark->SetColor('red@0.5');
    $graph->Add($sp1); }
    $lineplot=new LinePlot($data); 建立线形图对象,并赋予数据
    $lineplot->SetColor("blue"); 设置线形为蓝色
    $graph->Add($lineplot); 将线形对象加入图形
    $graph->Stroke(); 图形展示
    }?>

    图2为系统生成的多种前兆数据图形。在系统中笔者已经对各类缺数问题进行了处理,目前已经可以实现“九五”、“十五”数字化及有关模拟仪器观测数据的图形化处理。

    在建立图形时,要注意中文字符的处理问题。笔者通过PHP中的iconv函数进行字符编码转换,将utf8编码转变为gbk编码,以实现中文字符的正常输出。其格式为:iconv("utf-8","gbk","要显示的中文字符")。

    3 应用设想与总结

    天津市地震局在“十五”及“十一五”期间,改扩建了多类地震观测系统(李刚等,2012a)。随着监测数据的不断扩展,每年产生约5TB的观测数据,如何将如此众多的数据服务于行业、政府、社会公众与有关科研系统,是局内技术人员一直在考虑与研究的问题(李刚等,2012b;董星宏等,2010)。

    以往将数据服务于社会公众时,多采用数据下载或在线数据展示,但可视性较差,公众对于各类数字并不关心,造成想提供服务,但公众又不认可的结果。这也使地震行业海量的数据资源总是局限于行业内部及相关科研机构间进行共享。

    本文中笔者采用的JpGraph可以实现快速的数据图形生成,为专业数据的可视化发布与展现提供了基础。通过JpGraph开发人员只需关注数据图形的展现形式,而繁琐的图形处理部分已被类库封装,为非专业的程序设计人员提供了更广的系统设计方案与模式。

    目前笔者已经采用JpGraph类库对天津市地震局的所有前兆数据进行了可视化在线展示处理,今后可将其应用于局内的其他业务系统数据可视化展示中,提升专业数据的服务能力。

    图 2前兆数据图形 Fig. 2Precursory data graphics

    致谢:本项工作得到了天津市地震局各级领导的支持与帮助,特别是进行地震监测预报工作的王建国、栗连弟、孙路强、许可等的帮助,在此表示衷心的感谢。

    参考文献
    [1]董星宏,贾宁,2010.陕西地震信息网地震速报信息对外快速发布技术研究. 震灾防御技术 ,5(4):506—512[本文引用:1次]
    [2]李刚,刘磊,周利霞等,2012a.NagiosQL软件在开源网络管理系统中的应用. 震灾防御技术 ,7(2):193—l99[本文引用:1次]
    [3]李刚,王晓磊,孙路强等,2012b.基于Nagios软件的综合短信联动告警系统在地震行业中的应用研究. 地震研究 ,35(1):133一l38[本文引用:1次]
    [4]王建国,栗连弟,崔晓峰等,2009a.数字化地震前兆台网日常工作管理软件. 地震研究 ,32(1):79—83[本文引用:1次]
    [5]王建国,董洪军,徐学恭等,2009b.“十五”天津地震前兆台网运行管理软件的研制. 地震地磁观测与研究 ,30(3):114—120[本文引用:1次]
    [6]王建国,姚会琴,高逊等,2010.天津市地震前兆台网的运行监控与维护管理. 大地测量与地球动力学 ,30(A01):111—115[本文引用:1次]
    [7]杨挺,韩斌,2010.自动站资料的Web图形动态显示. 沙漠与绿洲气象 ,4(B08):13—14[本文引用:1次]