-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMain.java
More file actions
237 lines (205 loc) · 11 KB
/
Copy pathMain.java
File metadata and controls
237 lines (205 loc) · 11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
package heyingzhe;
import java.io.*;
import java.sql.*;
import java.util.Arrays;
import java.util.Date;
import java.awt.Color;
import java.text.SimpleDateFormat;
//一些必要的库
import java.nio.file.Path;
import java.nio.file.Paths;
//自己编写的插值函数
import static heyingzhe.IDWInterpolation.idwInterpolation;
import static heyingzhe.KrigingInterpolation.krigingInterpolation;
import static heyingzhe.SplineInterpolation.splineInterpolation;
public class Main {
public static void processing(String mainDirectory, String outPutDirectory, String dbUserName, String dbPassword,
String startDate, String endDate) throws SQLException, ClassNotFoundException, IOException {
/**
* 文件目录结构:
*
* ├── mainDirectory/
* │ ├── dem.tif // dem影像
* │ |── rainFlow.txt // 各站点各日期降雨量数据
* │ |── stationProperty.txt // 各站点的编码、经纬度、名字等基本信息
* │ └── dem.asc // dem影像生成的asc文件
* ├── outPutDiretory/
* │ └──
*
* 注意:
* 1. 请确保文件路径正确,避免配置错误。
* 2. 在运行程序前,请检查相关文件是否存在并符合格式要求。
*/
String demTifPath = "dem.tif";
String rainFallDataPath = "rainFlow.txt";
String stationsDataPath = "stationProperty.txt";
String demASCIIPath = "dem.asc";
// 输出文件,不用配置,仅配置上方文件即可
String outputImageFormat = ".png";
String outputASCFormat = ".asc";
String outputDemPath = "outputDem";
String outputFilledDemPath = "outputFilledDem";
String outputSlopePath = "outputSlope";
String outputAccFlowPath = "outputAccFlow";
String outputWaterAreaPath = "outputWaterArea";
String outputFlowDirectionPath = "outputFlowDirection";
String outputRiverLinePath = "outputRiverLine";
String outputIDWImage = "outputIDW";
String outputKrigImage = "outputKriging";
String outputSplineImage = "outputSpline";
String outputTrendSurfaceImage = "outputTrendSurface";
// 完整的文件输入路径
demTifPath = Paths.get(mainDirectory, demTifPath).toAbsolutePath().toString();
rainFallDataPath = Paths.get(mainDirectory, rainFallDataPath).toAbsolutePath().toString();
stationsDataPath = Paths.get(mainDirectory, stationsDataPath).toAbsolutePath().toString();
demASCIIPath = Paths.get(mainDirectory, demASCIIPath).toAbsolutePath().toString();
//读取dem
ReadDEM demReader = new ReadDEM(demASCIIPath);
int[][] dem = demReader.getData();
//读取站点降水数据为二维数组
GetGrid gridReader = new GetGrid(dem, demASCIIPath, stationsDataPath, rainFallDataPath);
// 初始化日期格式
String[] DateArray1 = new DateProcessing().createDateArray1(startDate, endDate); // 格式 "2023-07-08"
String[] DateArray2 = new DateProcessing().createDateArray2(startDate, endDate); // 格式 "20230708"
// 测试日期
String[] example1 = {"2023-07-01"};
String[] example2 = {"20230701"};
/**
* 项目运算框架前准备
* 1 输出图像类预定义
* 2 云储存(Mysql数据库)预定义
*/
// 图像输出
ImageVisualizer imageVision = new ImageVisualizer();
Color startColor = Color.decode("#ffd89b"); //数值低为蓝色
Color endColor = Color.decode("#19547b"); //数值高为红色
// 配置数据库
SaveResult saveProcessing = new SaveResult();
saveProcessing.setMySQLProperty("heyingzhe", "1234");
System.out.println("你已确认数据库用户名和密码!");
saveProcessing.createDatabase("result");
System.out.println("数据库result创建成功!");
for (int index = 0; index < DateArray1.length; index++) {
//创建文件夹
String oneDay = example1[index];
String oneDayFileName = example2[index];
System.out.println("************");
System.out.println(oneDay);
System.out.println("************");
String newDirectoryPath = Paths.get(mainDirectory, oneDayFileName).toString();
// 创建 File 对象
File newDirectory = new File(newDirectoryPath);
// 检查目录是否存在
if (!newDirectory.exists()) {
// 使用 mkdirs() 创建目录(包括父目录)
if (newDirectory.mkdirs()) {
System.out.println("目录创建成功:" + newDirectory);
} else {
System.out.println("目录创建失败:" + newDirectory);
}
} else {
System.out.println("目录已存在:" + newDirectory);
}
//将新文件路传输到原文件路径
outPutDirectory = newDirectoryPath;
/**
* 项目运算框架
* 本程序的目标是通过分析给定的输入地理数据,执行相关的水文计算和数据插值处理,
* 最终输出处理结果。
*
* 主要步骤:
* 1. 初始化系统环境,包括配置文件和依赖的资源。
* 2. 从输入源加载数据。
* 3. 执行数据处理算法。
* 4. 输出结果并结束程序。
*/
// 插值运算
double[][] originGridData = gridReader.createSitesArray(oneDay); //初始站点网格数据
/**
* 多线程任务:插值运算
* 线程1:反距离权重插值
* 线程2:克里金插值
* 线程3:样条插值
*/
new IDWThread(originGridData, outPutDirectory, outputIDWImage + oneDayFileName + outputImageFormat,
startColor,
endColor,
dbUserName,
dbPassword).start();
new KrigThread(originGridData, outPutDirectory, outputKrigImage + oneDayFileName + outputImageFormat, startColor, endColor, dbUserName, dbPassword).start();
new SplineThread(originGridData, outPutDirectory, outputSplineImage + oneDayFileName + outputImageFormat, startColor, endColor, dbUserName,
dbPassword).start();
new TrendSurfaceThread(originGridData, outPutDirectory,
outputTrendSurfaceImage + oneDayFileName + outputImageFormat, startColor, endColor, dbUserName, dbPassword).start();
/**
* 水文计算框架
* 1 填洼计算
* 2 流向计算
* 3 坡度计算
* 4 累积流计算
*/
// 水文分析计算
System.out.println("正在进行填洼计算……");
DepressionFilling depressionFilling = new DepressionFilling(); //填洼
int[][] filledDem = depressionFilling.fillDepressions(dem);
System.out.println("填洼计算完成");
// dem图像输出
imageVision.convertArrayToImage(dem); //保存dem
imageVision.saveImage(Paths.get(outPutDirectory, outputDemPath + oneDayFileName + outputImageFormat).toString(), "png");
imageVision.convertArrayToImage(filledDem); //保存填洼dem
imageVision.saveImage(Paths.get(outPutDirectory, outputFilledDemPath + oneDayFileName + outputImageFormat).toString(), "png");
//流向计算
System.out.println("正在进行流向计算……");
FlowDirection flowDirection = new FlowDirection(); //流向计算
int[][] flow = flowDirection.calculateFlowDirection(filledDem);
//FlowDirectionUpdater updater = new FlowDirectionUpdater(); //流向更新
//int[][] flowDirectionArray = updater.updateFlowDirection(filledDem, flow);
int[][] flowDirectionArray = flow;
System.out.println("流向计算完成");
//可视化流向图和河流流线图
imageVision.createFlowDirectionImage(flowDirectionArray);
imageVision.saveImage(Paths.get(outPutDirectory, outputFlowDirectionPath + oneDayFileName + outputImageFormat).toString(), "png");
//河流线提取
imageVision.extractRiverLines(filledDem, flowDirectionArray, 150);
imageVision.saveImage(Paths.get(outPutDirectory, outputRiverLinePath + oneDayFileName + outputImageFormat).toString(), "png");
//储存数据到数据库
/*
System.out.println("正在将水文计算结果上传至数据库……");
saveProcessing.createTable("result", "flowdirection" + oneDayFileName); //创建流向表格
saveProcessing.saveArrayToMySQL(flowDirectionArray, "flowdirection" + oneDayFileName);
System.out.println("flowdirection数据已经添加到数据库里面");
*/
/**
* 多线程任务:水文计算
* 线程1:坡度计算
* 线程2:累积流计算
*/
new SlopeThread(flowDirectionArray, outPutDirectory, outputSlopePath + oneDayFileName + outputImageFormat, dbUserName, dbPassword).start();
//降雨量数据初始化
double[][] idwInterpolationResult = idwInterpolation(originGridData, 2); //IDW插值
//遍历二维数组,修改小于等于0的数值为1
for (int i = 0; i < idwInterpolationResult.length; i++) {
for (int j = 0; j < idwInterpolationResult[i].length; j++) {
if (idwInterpolationResult[i][j] <= 0) {
idwInterpolationResult[i][j] = 1;
}
}
}
//累积流计算
new AccFlowThread(dem, filledDem, flowDirectionArray, idwInterpolationResult, outPutDirectory,
outputAccFlowPath + oneDayFileName + outputImageFormat, outputWaterAreaPath + oneDayFileName + outputImageFormat, dbUserName,
dbPassword).start();
}
}
// 主函数
public static void main(String[] args) throws SQLException, ClassNotFoundException, IOException {
String allFilesDir = "D:\\FILE\\User\\English_Dir\\IcityOutput";
String allFilesOutputDir = "D:\\FILE\\User\\English_Dir\\IcityOutput";
String databaseUserName = "heyingzhe";
String databasePassword = "1234";
String startDate = "2023-07-01";
String endDate = "2023-07-31";
// 执行项目
processing(allFilesDir, allFilesOutputDir, databaseUserName, databasePassword, startDate, endDate);
}
}