代码调整

This commit is contained in:
2023-06-21 15:51:30 +08:00
parent 6dbbb6ca88
commit 316317942e
10 changed files with 589 additions and 585 deletions

View File

@@ -33,8 +33,9 @@
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.github.abel533</groupId> <groupId>org.icepear.echarts</groupId>
<artifactId>ECharts</artifactId> <artifactId>echarts-java</artifactId>
<version>1.0.7</version>
</dependency> </dependency>
<!-- echarts绘图所需可以将包含function的对象转为json --> <!-- echarts绘图所需可以将包含function的对象转为json -->
<dependency> <dependency>

View File

@@ -1,84 +0,0 @@
package com.njcn.echarts.bar;
import cn.hutool.json.JSONObject;
import com.github.abel533.echarts.Grid;
import com.github.abel533.echarts.axis.AxisLabel;
import com.github.abel533.echarts.axis.CategoryAxis;
import com.github.abel533.echarts.axis.SplitLine;
import com.github.abel533.echarts.axis.ValueAxis;
import com.github.abel533.echarts.code.AxisType;
import com.github.abel533.echarts.code.SeriesType;
import com.github.abel533.echarts.json.GsonOption;
import com.github.abel533.echarts.series.Bar;
import com.njcn.common.pojo.response.HttpResult;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
*
* 用于组装柱状图的option数据
*
* @author hongawen
* @version 1.0.0
* @date 2022年08月18日 10:58
*/
public class BarOptionUtil {
public static void main(String[] args) {
JSONObject optionJson = testEchart();
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<HttpResult> forEntity = restTemplate.getForEntity("http://192.168.1.13:8910?opt={1}&width={2}&height={3}", HttpResult.class, optionJson.toString(), 714, 300);
//返回图片对应的base64
System.out.println(forEntity.getBody().getData());
System.out.println(1);
}
public static JSONObject testEchart() {
List<String> xName = Stream.of("江苏省", "四川省", "海南省").collect(Collectors.toList());
GsonOption option = new GsonOption();
// 大标题、位置
String title = "区域统计";
option.title().text(title).x("center");
// 提示工具
// 在轴上触发提示数据
option.tooltip().show(false);
// 工具栏
// 显示,保存为图片
option.toolbox().show(false);
// 图例
option.color("#FF7E50");
option.legend("暂降次数");
//控制图标在dataroom中的位置大小
option.grid(new Grid().left("3%").right("15%").bottom("5%").containLabel(true));
// 轴分类
CategoryAxis xAxis = new CategoryAxis();
xAxis.data(xName.toArray());
xAxis.splitLine(new SplitLine().show(false));
xAxis.name("地区\n(监测点数)");
xAxis.axisLabel(new AxisLabel().interval(0).show(true));
// 起始和结束两端空白策略
xAxis.boundaryGap(true);
// x轴
option.xAxis(xAxis);
//循环数据
Bar bar = new Bar();
bar.setType(SeriesType.bar);
bar.barMaxWidth(30);
bar.data(30, 48, 66);
option.series(bar);
// y轴
ValueAxis yAxis = new ValueAxis();
yAxis.name("(次)").type(AxisType.value);
option.yAxis(yAxis);
String optionStr = option.toString().replace(" ", "");
return new JSONObject(optionStr);
}
}

View File

@@ -0,0 +1,175 @@
package com.njcn.echarts.json;
import com.njcn.echarts.pojo.bo.TolerateData;
import com.njcn.echarts.pojo.constant.PicCommonData;
import org.icepear.echarts.Option;
import org.icepear.echarts.charts.bar.BarSeries;
import org.icepear.echarts.charts.line.LineSeries;
import org.icepear.echarts.charts.scatter.ScatterSeries;
import org.icepear.echarts.components.coord.AxisNameTextStyle;
import org.icepear.echarts.components.coord.SplitLine;
import org.icepear.echarts.components.coord.ValueAxisLabel;
import org.icepear.echarts.components.coord.cartesian.CategoryAxis;
import org.icepear.echarts.components.coord.cartesian.LogAxis;
import org.icepear.echarts.components.coord.cartesian.ValueAxis;
import org.icepear.echarts.components.grid.Grid;
import org.icepear.echarts.components.legend.Legend;
import org.icepear.echarts.components.title.Title;
import org.icepear.echarts.components.tooltip.Tooltip;
import org.icepear.echarts.origin.util.SeriesOption;
import org.icepear.echarts.render.Engine;
import java.util.List;
/**
* @author hongawen
* @version 1.0.0
* @date 2023年06月21日 10:05
*/
public class LineGenerator {
private final static Engine ENGINE = new Engine();
/***
* 生成ITIC曲线
* @author hongawen
* @date 2023/6/21 10:06
*/
public static String generateIticOption(TolerateData tolerateData) {
Option iticOption = new Option();
//取消渲染动画
iticOption.setAnimation(false);
//背景色
iticOption.setBackgroundColor(PicCommonData.PIC_BACK_COLOR);
//标题
iticOption.setTitle(new Title().setLeft(PicCommonData.CENTER).setText("ITIC曲线"));
//上下左右的图内间距
iticOption.setGrid(new Grid().setTop("80px").setLeft("40px").setRight("40px").setBottom("10%"));
//设置图例
iticOption.setLegend(new Legend().setData(new String[]{"上限", "下限", "可容忍事件", "不可容忍事件"}).setTop("26px").setLeft(0).setBottom("94%"));
//设置图例对应的颜色
iticOption.setColor(new String[]{"#FF8C00", "#00BFFF", "green", "red"});
//横坐标
iticOption.setXAxis(new LogAxis().setMin("0.001").setMax("1000").setSplitLine(new SplitLine().setShow(false)).setName("s"));
//纵坐标
iticOption.setYAxis(new ValueAxis().setName("%").setMinInterval(3).setSplitNumber(10));
//处理上限配置
LineSeries upperLimit = new LineSeries()
.setName("上限")
.setData(new float[][]{{0.001f, 200}, {0.003f, 140}, {0.003f, 120}, {0.5f, 120}, {0.5f, 110}, {10, 110}, {1000, 110}})
.setShowSymbol(false)
.setTooltip(new Tooltip().setShow(false));
//处理下限配置
LineSeries lowerLimit = new LineSeries()
.setName("下限")
.setData(new float[][]{{0.02f, 0}, {0.02f, 70}, {0.5f, 70}, {0.5f, 80}, {10, 80}, {10, 90}, {1000, 90}})
.setShowSymbol(false)
.setTooltip(new Tooltip().setShow(false));
//配置可容忍点数据
ScatterSeries tolerate = new ScatterSeries()
.setName("可容忍事件")
.setSymbol("circle")
.setData(tolerateData.getTolerateData());
//配置不可容忍点数据
ScatterSeries unTolerate = new ScatterSeries()
.setName("不可容忍事件")
.setSymbol("circle")
.setData(tolerateData.getUnTolerateData());
iticOption.setSeries(new SeriesOption[]{upperLimit, lowerLimit, tolerate, unTolerate});
return ENGINE.renderJsonOption(iticOption);
}
/***
* 生成F47曲线
* @author hongawen
* @date 2023/6/21 10:06
*/
public static String generateF47Option(TolerateData tolerateData) {
Option iticOption = new Option();
//取消渲染动画
iticOption.setAnimation(false);
//背景色
iticOption.setBackgroundColor(PicCommonData.PIC_BACK_COLOR);
//标题
iticOption.setTitle(new Title().setLeft(PicCommonData.CENTER).setText("SEMI F47曲线"));
//上下左右的图内间距
iticOption.setGrid(new Grid().setTop("80px").setLeft("40px").setRight("40px").setBottom("10%"));
//设置图例
iticOption.setLegend(new Legend().setData(new String[]{"边界线", "可容忍事件", "不可容忍事件"}).setTop("26px").setLeft(0).setBottom("94%"));
//设置图例对应的颜色
iticOption.setColor(new String[]{"yellow", "green", "red"});
//横坐标
iticOption.setXAxis(new LogAxis().setMin("0.001").setMax("1000").setSplitLine(new SplitLine().setShow(false)).setName("s"));
//纵坐标
iticOption.setYAxis(new ValueAxis().setName("%").setMinInterval(0.1).setSplitNumber(10).setMax(100));
//处理边界线
LineSeries borderLimit = new LineSeries()
.setName("边界线")
.setData(new float[][]{{0.05f, 0}, {0.05f, 50}, {0.2f, 50}, {0.2f, 70}, {0.5f, 70}, {0.5f, 80}, {10, 80}, {10, 90}, {1000, 90}})
.setShowSymbol(false)
.setTooltip(new Tooltip().setShow(false));
//配置可容忍点数据
ScatterSeries tolerate = new ScatterSeries()
.setName("可容忍事件")
.setSymbol("circle")
.setData(tolerateData.getTolerateData());
//配置不可容忍点数据
ScatterSeries unTolerate = new ScatterSeries()
.setName("不可容忍事件")
.setSymbol("circle")
.setData(tolerateData.getUnTolerateData());
iticOption.setSeries(new SeriesOption[]{borderLimit, tolerate, unTolerate});
return ENGINE.renderJsonOption(iticOption);
}
/***
* 生成暂降幅值
* @author hongawen
* @date 2023/6/21 10:06
*/
public static String generateEventAmplitudeOption(List<String> ylinedata, List<String> ybardata) {
Option iticOption = new Option();
//取消渲染动画
iticOption.setAnimation(false);
//背景色
iticOption.setBackgroundColor(PicCommonData.PIC_BACK_COLOR);
//标题
iticOption.setTitle(new Title().setLeft(PicCommonData.CENTER).setText("暂降幅值的概率分布"));
//设置图例
iticOption.setLegend(new Legend().setData(new String[]{"概率分布", "占比"}).setLeft(10).setShow(true));
//横坐标
iticOption.setXAxis(new CategoryAxis()
.setBoundaryGap(true)
.setName("暂降幅值")
.setNameTextStyle(new AxisNameTextStyle().setFontStyle("15px"))
.setData(new String[]{"0", "10%", "20%", "30%", "40%", "50%", "60%", "70%", "80%", "90%"})
);
//纵坐标
iticOption.setYAxis(new ValueAxis[]{
new ValueAxis()
.setName("%")
.setNameTextStyle(new AxisNameTextStyle().setFontStyle("15px"))
.setAxisLabel(new ValueAxisLabel().setFormatter("{value}%"))
});
//配置概率分布
LineSeries probability = new LineSeries()
.setName("概率分布")
.setData(ylinedata);
//配置占比
BarSeries proportion = new BarSeries()
.setName("占比")
.setBarWidth(30)
.setData(ybardata);
iticOption.setSeries(new SeriesOption[]{probability, proportion});
return ENGINE.renderJsonOption(iticOption);
}
}

View File

@@ -1,78 +0,0 @@
package com.njcn.echarts.line;
import cn.hutool.json.JSONObject;
import com.github.abel533.echarts.Grid;
import com.github.abel533.echarts.axis.AxisLabel;
import com.github.abel533.echarts.axis.CategoryAxis;
import com.github.abel533.echarts.axis.SplitLine;
import com.github.abel533.echarts.axis.ValueAxis;
import com.github.abel533.echarts.code.AxisType;
import com.github.abel533.echarts.code.NameLocation;
import com.github.abel533.echarts.code.SeriesType;
import com.github.abel533.echarts.json.GsonOption;
import com.github.abel533.echarts.series.Bar;
import com.github.abel533.echarts.series.Line;
import com.njcn.common.pojo.response.HttpResult;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @author hongawen
* @version 1.0.0
* @date 2022年08月18日 14:39
*/
public class LineOptionUtil {
public static void main(String[] args) {
JSONObject optionJson = testEchart();
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<HttpResult> forEntity = restTemplate.getForEntity("http://192.168.1.13:8910?opt={1}&width={2}&height={3}", HttpResult.class, optionJson.toString(), 714, 300);
//返回图片对应的base64
System.out.println(forEntity.getBody().getData());
System.out.println(1);
}
public static JSONObject testEchart() {
List<String> xName = Stream.of("0", "10%", "20%", "30%", "40%", "50%", "60%", "70%", "80%", "90%").collect(Collectors.toList());
GsonOption option = new GsonOption();
option.backgroundColor("#F9F9F9");
// 大标题、位置
String title = "暂降幅值的概率分布函数";
option.title().text(title).x("center");
// 提示工具
// 在轴上触发提示数据
option.tooltip().show(false);
// 工具栏
// 显示,保存为图片
option.toolbox().show(false);
// 图例
option.color("#FF7E50");
//控制图标在dataroom中的位置大小
option.grid(new Grid().left("3%").right("11%").bottom("5%").containLabel(true));
// 轴分类
CategoryAxis xAxis = new CategoryAxis();
xAxis.data(xName.toArray());
xAxis.nameGap(5);
xAxis.name("暂降幅值");
// 起始和结束两端空白策略
xAxis.boundaryGap(false);
// x轴
option.xAxis(xAxis);
Line line = new Line("暂降幅值");
line.setType(SeriesType.line);
line.data(0, 10, 11, 15, 16, 30, 48, 66, 75, 89);
option.series(line);
// y轴
ValueAxis yAxis = new ValueAxis();
yAxis.name("概率分布").type(AxisType.value).nameGap(50).nameLocation(NameLocation.middle).axisLabel(new AxisLabel().formatter("{value} %"));
option.yAxis(yAxis);
String optionStr = option.toString().replace(" ", "");
return new JSONObject(optionStr);
}
}

View File

@@ -0,0 +1,29 @@
package com.njcn.echarts.pojo.bo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
/**
* @author hongawen
* @version 1.0.0
* @date 2023年06月21日 11:05
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TolerateData {
/***
* 可容忍数据
*/
List<List<Double>> tolerateData = new ArrayList<>();
/***
* 不可容忍数据
*/
List<List<Double>> unTolerateData = new ArrayList<>();
}

View File

@@ -33,8 +33,22 @@ public interface PicCommonData {
Integer COMMON_POI_MAP_HEIGHT = 210; Integer COMMON_POI_MAP_HEIGHT = 210;
/**
* 图片背景色
*/
String PIC_BACK_COLOR = "#FFF";
/**
* 绘图定位
*/
String CENTER = "center";
/***
* png base64固定前缀
*/
String PNG_PREFIX = "data:image/png;base64,";
} }

View File

@@ -0,0 +1,107 @@
package com.njcn.echarts.util;
import com.njcn.echarts.pojo.bo.TolerateData;
import java.util.ArrayList;
import java.util.List;
/**
* 业务数据处理方法
*
* @author hongawen
* @version 1.0.0
* @date 2023年06月21日 11:04
*/
public class BusinessDataUtil {
/***
* 处理itic数据
* @author hongawen
* @date 2023/6/21 11:05
*/
public static TolerateData dealIticData(List<List<Double>> originData) {
List<List<Double>> tolerateData = new ArrayList<>();
List<List<Double>> unTolerateData = new ArrayList<>();
for (List<Double> list : originData) {
//是否超过上限
if (list.get(0) <= 0.03) {
int line = 230 - 30000 * list.get(0).intValue();
if (list.get(1) > line) {
unTolerateData.add(list);
} else {
tolerateData.add(list);
}
} else if (list.get(0) <= 0.02) {
if (list.get(1) > 120) {
unTolerateData.add(list);
} else {
tolerateData.add(list);
}
} else if (list.get(0) <= 0.5) {
if (list.get(1) > 120 || list.get(1) < 70) {
unTolerateData.add(list);
} else {
tolerateData.add(list);
}
} else if (list.get(0) <= 10) {
if (list.get(1) > 110 || list.get(1) < 80) {
unTolerateData.add(list);
} else {
tolerateData.add(list);
}
} else {
if (list.get(1) > 110 || list.get(1) < 90) {
unTolerateData.add(list);
} else {
tolerateData.add(list);
}
}
}
return new TolerateData(tolerateData, unTolerateData);
}
/***
* 处理F47数据
* @author hongawen
* @date 2023/6/21 11:05
*/
public static TolerateData dealF47Data(List<List<Double>> originData) {
List<List<Double>> tolerateData = new ArrayList<>();
List<List<Double>> unTolerateData = new ArrayList<>();
for (int i = 0; i < originData.size(); i++) {
List<Double> list = originData.get(i);
//是否超过上限
if (list.get(0) < 0.05) {
tolerateData.add(list);
} else if (list.get(0) < 0.2) {
if (list.get(1) > 50) {
tolerateData.add(list);
} else {
unTolerateData.add(list);
}
} else if (list.get(0) < 0.5) {
if (list.get(1) > 70) {
tolerateData.add(list);
} else {
unTolerateData.add(list);
}
} else if (list.get(0) < 10) {
if (list.get(1) > 80) {
tolerateData.add(list);
} else {
unTolerateData.add(list);
}
} else {
if (list.get(1) > 90) {
tolerateData.add(list);
} else {
unTolerateData.add(list);
}
}
}
return new TolerateData(tolerateData, unTolerateData);
}
}

View File

@@ -1,16 +1,15 @@
package com.njcn.echarts.util; package com.njcn.echarts.util;
import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject;
import cn.hutool.http.HttpStatus; import cn.hutool.json.JSONUtil;
import com.njcn.common.pojo.exception.BusinessException; import com.njcn.echarts.json.LineGenerator;
import com.njcn.common.pojo.response.HttpResult; import com.njcn.web.utils.RestTemplateUtil;
import com.njcn.echarts.pojo.enums.EchartResponseEnum;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import java.util.List;
import java.util.Objects; import java.util.Objects;
/** /**
@@ -22,25 +21,104 @@ import java.util.Objects;
@RequiredArgsConstructor @RequiredArgsConstructor
public class DrawPicUtil { public class DrawPicUtil {
private final RestTemplate restTemplate; //目前写死,后续作为配置
private final String URL = "http://192.168.1.18:5174/picture";
/** /**
* 请求目标服务器绘制echart图 * 请求目标服务器绘制echart图
* @param url 目标url,例http://192.168.1.13:8910?opt={1}&width={2}&height={3} *
* @param option 图形参数
* @return 图形的base64数据
*/
private String drawPic(String option) {
return drawPic(option, 0, 0);
}
/**
* 请求目标服务器绘制echart图
*
* @param option 图形参数 * @param option 图形参数
* @param width 图形宽度 * @param width 图形宽度
* @param height 图形高度 * @param height 图形高度
* @return 图形的base64数据 * @return 图形的base64数据
*/ */
public String drawPic(String url,String option,int width,int height){ private String drawPic(String option, int width, int height) {
ResponseEntity<HttpResult> result = restTemplate.getForEntity(url, HttpResult.class, option, width, height); JSONObject jsonObject = new JSONObject();
if(result.getStatusCodeValue() != HttpStatus.HTTP_OK || Objects.isNull(Objects.requireNonNull(result.getBody()).getData())){ jsonObject.set("width", width == 0 ? 925 : width);
throw new BusinessException(EchartResponseEnum.ECHART_COMMON_ERROR); jsonObject.set("height", height == 0 ? 300 : width);
} jsonObject.set("option", JSONUtil.parseObj(option));
return result.getBody().getData().toString(); ResponseEntity<String> picResult = RestTemplateUtil.post(URL, jsonObject, String.class);
return Objects.requireNonNull(picResult.getBody()).indexOf("image/png") > 0 ? picResult.getBody() : "";
} }
/***
* 绘制itic曲线图
* @author hongawen
* @date 2023/6/21 11:01
* @return String base64数据
* @param originData 原始数据
*/
public String drawItic(List<List<Double>> originData) {
return drawItic(originData, 0, 0);
}
/***
* 绘制itic曲线图
* @author hongawen
* @date 2023/6/21 11:01
* @return String base64数据
* @param originData 原始数据
*/
public String drawItic(List<List<Double>> originData, int width, int height) {
String iticJson = LineGenerator.generateIticOption(BusinessDataUtil.dealIticData(originData));
return drawPic(iticJson, width, height);
}
/***
* 绘制f47曲线图
* @author hongawen
* @date 2023/6/21 11:01
* @return String base64数据
* @param originData 原始数据
*/
public String drawF47(List<List<Double>> originData) {
return drawF47(originData, 0, 0);
}
/***
* 绘制f47曲线图
* @author hongawen
* @date 2023/6/21 11:01
* @return String base64数据
* @param originData 原始数据
*/
public String drawF47(List<List<Double>> originData, int width, int height) {
String f47Json = LineGenerator.generateF47Option(BusinessDataUtil.dealF47Data(originData));
return drawPic(f47Json, width, height);
}
/***
* 绘制概率分布图
* @author hongawen
* @date 2023/6/21 11:01
* @return String base64数据
*/
public String drawEventAmplitude(List<String> ylinedata, List<String> ybardata) {
return drawEventAmplitude(ylinedata, ybardata, 0, 0);
}
/***
* 绘制概率分布图
* @author hongawen
* @date 2023/6/21 11:01
* @return String base64数据
*/
public String drawEventAmplitude(List<String> ylinedata, List<String> ybardata, int width, int height) {
String eventAmplitudeJson = LineGenerator.generateEventAmplitudeOption(ylinedata, ybardata);
return drawPic(eventAmplitudeJson, width, height);
}
} }

View File

@@ -83,6 +83,7 @@
<version>${project.version}</version> <version>${project.version}</version>
</dependency> </dependency>
</dependencies> </dependencies>
<build> <build>