package com.zbht.util;
import com.zbht.db.oracle.TBManager;
import java.awt.Color;
import java.awt.Font;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.LinkedHashMap;
import javax.servlet.http.HttpSession;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.axis.DateTickUnit;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.labels.StandardXYToolTipGenerator;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.time.Day;
import org.jfree.data.time.Month;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.RectangleInsets;
public class LineXYChart {
private int flag = 0;
public String getLineXYChart(HttpSession session, PrintWriter pw,Connection conn,String flag)
{
XYDataset dataset = this.createDateSet(conn,flag);//建立数据集
String fileName = null;
//建立JFreeChart
JFreeChart chart = ChartFactory.createTimeSeriesChart(
"突发事件时间曲线序列图", // title
"发生时间", // x-axis label
"突发事件数量", // y-axis label
dataset, // data
true, // create legend?
false, // generate tooltips?
false // generate URLs?
);
//设置JFreeChart的显示属性,对图形外部部分进行调整
chart.setBackgroundPaint(Color.GREEN);//设置曲线图背景色
//设置字体大小,形状
Font font = new Font("宋体", Font.BOLD, 16);
TextTitle title = new TextTitle("突发事件时间曲线序列图", font);
chart.setTitle(title);
XYPlot plot = (XYPlot) chart.getPlot();//获取图形的画布
plot.setBackgroundPaint(Color.lightGray);//设置网格背景色
plot.setDomainGridlinePaint(Color.green);//设置网格竖线(Domain轴)颜色
plot.setRangeGridlinePaint(Color.white);//设置网格横线颜色
plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));//设置曲线图与xy轴的距离
plot.setDomainCrosshairVisible(true);
plot.setRangeCrosshairVisible(true);
XYItemRenderer r = plot.getRenderer();
if (r instanceof XYLineAndShapeRenderer)
{
XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) r;
//renderer.setD
//renderer.setDefaultShapesVisible(true);
//renderer.setDefaultShapesFilled(true);
renderer.setShapesVisible(true);//设置曲线是否显示数据点
}
//设置Y轴
NumberAxis numAxis = (NumberAxis) plot.getRangeAxis();
NumberFormat numFormater = NumberFormat.getNumberInstance();
numFormater.setMinimumFractionDigits(2);
numAxis.setNumberFormatOverride(numFormater);
//设置提示信息
StandardXYToolTipGenerator tipGenerator = new StandardXYToolTipGenerator(
"历史信息:({1},{2})", new SimpleDateFormat("yyyy-MM"),
numFormater);
r.setToolTipGenerator(tipGenerator);
//设置X轴(日期轴)
DateAxis axis = (DateAxis) plot.getDomainAxis();
//axis.setDateFormatOverride(new SimpleDateFormat("yyyy-MM"));
//format = new SimpleDateFormat("yy-MM");
axis.setTickUnit(new DateTickUnit(DateTickUnit.MONTH, 1, new SimpleDateFormat("yyyy-MM")));
//axis.setAutoRange(true);
axis.setTickMarksVisible(true);
// axis.setTickMarkPaint(Color.red);//设置x轴刻度尺颜色
//axis.setLabelAngle(45.00d);//x轴标题旋转角度
// axis.setTickMarkInsideLength(2f);//刻度尺的长度
//axis.setTickMarkOutsideLength(2f);//刻度尺的长度
plot.setDomainAxis(axis);
ChartRenderingInfo info = new ChartRenderingInfo(
new StandardEntityCollection());
try
{
fileName = ServletUtilities.saveChartAsPNG(chart, 500, 300, info,
session);//生成图片
// Write the image map to the PrintWriter
ChartUtilities.writeImageMap(pw, fileName, info, false);
}
catch (IOException e)
{
e.printStackTrace();
}
pw.flush();
return fileName;//返回生成图片的文件名
}
private XYDataset createDateSet(Connection conn,String flag )
{
//显示折线图数据sql语句
String selectSQL = "";
String tempArry[] = null;
String tempArry2[] = null;
LinkedHashMap lhm = null;
if(flag == "1" || flag.equals("1")){
selectSQL= "select "+
"rtrim(char(year(ARISE_TIME)))||'-'||rtrim(char(month(ARISE_TIME))) MYDATE , "+
"count(*) as MYCOUNT from "+
"V_ACCIDENT group by "+
"rtrim(char(year(ARISE_TIME)))||'-'||rtrim(char(month(ARISE_TIME))) order by "+
"rtrim(char(year(ARISE_TIME)))||'-'||rtrim(char(month(ARISE_TIME)))";
}
try {
lhm = TBManager.getMap(selectSQL, conn);
tempArry = TBManager.getFirstCol(selectSQL, conn);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
TimeSeriesCollection dataset = new TimeSeriesCollection();//时间曲线数据集合
TimeSeries s1 = new TimeSeries("历史曲线",Month.class);//创建时间数据源,每一个//TimeSeries在图上是一条曲线
for(int i=0 ; i<tempArry.length; i++){
tempArry2 = tempArry[i].split("-");
//System.out.println("month:"+tempArry2[1]);
//System.out.println("year:"+tempArry2[0]);
//System.out.println("数量:"+Double.valueOf(lhm.get(tempArry[i]).toString()));
s1.add(new Month(Integer.valueOf(tempArry2[1]).intValue(),Integer.valueOf(tempArry2[0]).intValue()),Double.valueOf(lhm.get(tempArry[i]).toString()));
}
dataset.addSeries(s1);
dataset.setDomainIsPointsInTime(true);
return dataset;
}
}