package com.se.nsl.service;
|
|
import cn.hutool.core.io.FileUtil;
|
import cn.hutool.json.JSONUtil;
|
import com.alibaba.fastjson.JSON;
|
import com.se.nsl.config.PropertiesConfig;
|
import com.se.nsl.domain.po.DataPo;
|
import com.se.nsl.domain.po.Simu;
|
import com.se.nsl.domain.po.SimuData;
|
import com.se.nsl.domain.vo.ConfigVo;
|
import com.se.nsl.helper.ComHelper;
|
import com.se.nsl.helper.StringHelper;
|
import com.se.nsl.helper.WebHelper;
|
import lombok.SneakyThrows;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.axis.utils.StringUtils;
|
import org.gdal.ogr.Geometry;
|
import org.gdal.ogr.ogr;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.io.BufferedReader;
|
import java.io.File;
|
import java.io.IOException;
|
import java.io.InputStreamReader;
|
import java.nio.file.Files;
|
import java.nio.file.Paths;
|
import java.nio.file.StandardCopyOption;
|
import java.sql.Timestamp;
|
import java.text.SimpleDateFormat;
|
import java.util.Calendar;
|
import java.util.Date;
|
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.Executors;
|
|
@Slf4j
|
@Service
|
@SuppressWarnings("ALL")
|
public class ResolveService {
|
@Resource
|
SimuService simuService;
|
|
@Resource
|
PropertiesConfig config;
|
|
@Resource
|
UwService uwService;
|
|
@Resource
|
TestService testService;
|
|
public int start(Simu simu) {
|
Date now = new Date();
|
String date = StringHelper.YMDHMS2_FORMAT.format(now);
|
|
// 将WKT转换为Geometry对象
|
Geometry geom = Geometry.CreateFromWkt(simu.getGeom());
|
if (geom.GetGeometryType() == ogr.wkbMultiPolygon) {
|
geom = geom.GetGeometryRef(0);
|
}
|
double[] envelope = new double[4];
|
geom.GetEnvelope(envelope);
|
|
SimuData data = JSON.parseObject(simu.getData(), SimuData.class);
|
data.setInPath(date);
|
data.setOutPath(date);
|
data.setEpsg(4548);
|
data.setEnvelope(envelope);
|
|
simu.setData(JSON.toJSONString(data));
|
simu.setServiceName(date);
|
simu.setStatus(1); // 0-创建仿真,1-预处理,2-分析中,10-完成,20-出错
|
simu.setUpdateTime(new Timestamp(now.getTime()));
|
|
int rows = simuService.updateById(simu);
|
if (rows > 0) {
|
asyncCall(simu);
|
}
|
|
return rows;
|
}
|
|
private void asyncCall(Simu simu) {
|
ExecutorService executor = Executors.newSingleThreadExecutor();
|
executor.execute(new Runnable() {
|
@Override
|
@SneakyThrows
|
public void run() {
|
cope(simu);
|
}
|
});
|
executor.shutdown();
|
}
|
|
private void cope(Simu simu) {
|
try {
|
DataPo data = JSONUtil.toBean(simu.getData(), DataPo.class);
|
|
update(simu, 1, "初始化参数");
|
initArgs(data);
|
|
update(simu, 2, "调用求解器");
|
callUwSolver(data);
|
|
update(simu, 3, "调用Zarr转Tif");
|
callZarr2tif(data);
|
|
update(simu, 4, "解析数据");
|
createNsl(data);
|
|
update(simu, 10, "完成");
|
} catch (Exception ex) {
|
log.error(ex.getMessage(), ex);
|
update(simu, 20, ex.getMessage());
|
}
|
}
|
|
private void update(Simu simu, int status, String rs) {
|
simu.setStatus(status);
|
if (null != rs) simu.setResult(rs);
|
simu.setUpdateTime(WebHelper.getCurrentTimestamp());
|
|
simuService.updateById(simu);
|
}
|
|
/**
|
* 初始化参数
|
*/
|
private void initArgs(DataPo data) throws IOException {
|
String inPath = config.getInPath() + File.separator + data.getInPath();
|
createDir(inPath);
|
createDir(inPath + File.separator + "depth");
|
createDir(inPath + File.separator + "velocity");
|
createDir(config.getOutPath() + File.separator + data.getOutPath());
|
|
// 临时复制高程tif,以后需要自行切割
|
File uwBat = new File(config.getUwSolverBat());
|
String sourceTif = uwBat.getParent() + File.separator + "data" + File.separator + "Hillzone.tif";
|
String targetTif = inPath + File.separator + config.getDemFile();
|
Files.copy(Paths.get(sourceTif), Paths.get(targetTif), StandardCopyOption.REPLACE_EXISTING);
|
}
|
|
private void createDir(String path) {
|
File f = new File(path);
|
if (f.exists() && f.isDirectory()) {
|
FileUtil.del(f);
|
}
|
f.mkdirs();
|
}
|
|
/**
|
* 调用UWSolver
|
*/
|
private String callUwSolver(DataPo data) throws Exception {
|
File uwBat = new File(config.getUwSolverBat());
|
|
ConfigVo vo = new ConfigVo(data.getDuration(), config.getSaveFrames());
|
//String configFile = uwBat.getParent() + File.separator + data.getInPath() + ".json";
|
String configFile = config.getInPath() + File.separator + data.getInPath() + File.separator + data.getInPath() + ".json";
|
ComHelper.writeJson(configFile, JSON.toJSONString(vo));
|
|
String cmd = String.format("%s %s", config.getUwSolverBat(), configFile);
|
|
return callBat(cmd);
|
}
|
|
/**
|
* 调用zarr2tif
|
*/
|
private String callZarr2tif(DataPo data) throws Exception {
|
File uwBat = new File(config.getUwSolverBat());
|
String zarrFile = uwBat.getParent() + File.separator + "result.zarr";
|
String inPath = config.getInPath() + File.separator + data.getInPath();
|
String terrainFile = inPath + File.separator + config.getDemFile();
|
String waterPath = inPath + File.separator + "depth";
|
|
String cmd = String.format("%s \"%s\" \"%s\" \"%s\" \"%s\"", config.getZarr2tifBat(), "depth", zarrFile, terrainFile, waterPath);
|
|
return callBat(cmd);
|
}
|
|
private String callBat(String cmd) {
|
try {
|
ProcessBuilder pb = new ProcessBuilder("cmd", "/c", cmd);
|
pb.redirectErrorStream(true); // 合并错误流到标准输出
|
|
Process process = pb.start();
|
process.getOutputStream().close();
|
|
/*StringBuilder sb = new StringBuilder();
|
try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), "GBK"))) {
|
String line;
|
while ((line = reader.readLine()) != null) {
|
System.out.println(line);
|
sb.append(line);
|
}
|
}*/
|
|
int exitCode = process.waitFor();
|
|
return "ok"; // sb.toString();
|
} catch (Exception ex) {
|
log.error(ex.getMessage(), ex);
|
return null;
|
}
|
}
|
|
private void createNsl(DataPo data) throws Exception {
|
String inPath = config.getInPath() + File.separator + data.getInPath() + File.separator + "depth";
|
procTifs(inPath, inPath, data.getStartTime());
|
|
testService.test(data);
|
}
|
|
private void procTifs(String tifPath, String outPath, Date startTime) {
|
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
|
Calendar calendar = Calendar.getInstance();
|
calendar.setTime(startTime);
|
|
for (File file : new File(tifPath).listFiles()) {
|
if (!file.exists() || !file.isDirectory()) continue;
|
|
File tif = new File(tifPath + "\\" + file.getName() + File.separator + "depth.tif");
|
if (!tif.exists() || tif.isDirectory()) continue;
|
|
calendar.add(Calendar.SECOND, 1);
|
String newName = df.format(calendar.getTime());
|
String newFile = outPath + File.separator + newName + ".tif";
|
|
System.out.println(newFile);
|
tif.renameTo(new File(newFile));
|
file.delete();
|
}
|
}
|
}
|