-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGetGrid.java
More file actions
105 lines (87 loc) · 4.74 KB
/
Copy pathGetGrid.java
File metadata and controls
105 lines (87 loc) · 4.74 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
package heyingzhe;
import java.util.*;
import java.io.*;
import static heyingzhe.ReadFile.readFile; // 此类依赖于readFile类
public class GetGrid {
private List<Map<String, String>> rainFlow;
private Map<String, String> gridProperty;
private List<Map<String, String>> stationsProperty;
private int[][] dem;
private double[][] grid;
// 目标:从三个文件里读取数据,然后再利用dem输出站点的网格数据 -- 这样就可以传入数据
public GetGrid(int[][] dem, String demAscPath, String stationsPropertyPath, String rainFlowPath) throws IOException {
this.dem = dem;
this.stationsProperty = readFile(stationsPropertyPath);
this.rainFlow = readFile(rainFlowPath);
gridProperty = new HashMap<>();
BufferedReader reader = new BufferedReader(new FileReader(demAscPath));
int ncols = Integer.parseInt(reader.readLine().split("\\s+")[1]);
gridProperty.put("ncols", String.valueOf(ncols));
int nrows = Integer.parseInt(reader.readLine().split("\\s+")[1]);
gridProperty.put("nrows", String.valueOf(nrows));
double xllcorner = Double.parseDouble(reader.readLine().split("\\s+")[1]);
gridProperty.put("xllcorner", String.valueOf(xllcorner));
double yllcorner = Double.parseDouble(reader.readLine().split("\\s+")[1]);
gridProperty.put("yllcorner", String.valueOf(yllcorner));
double cellsize = Double.parseDouble(reader.readLine().split("\\s+")[1]);
gridProperty.put("cellsize", String.valueOf(cellsize));
int NODATA_value = Integer.parseInt(reader.readLine().split("\\s+")[1]);
gridProperty.put("NODATA_value", String.valueOf(NODATA_value));
DataManager manager = new DataManager(stationsProperty);
manager.addColumn("xid", "0");
manager.addColumn("yid", "0");
for (Map<String, String> stationProperty : stationsProperty) {
double lon = Double.parseDouble(stationProperty.get("LONGITUDE"));
double lat = Double.parseDouble(stationProperty.get("LATITUDE"));
// 添加列字段
stationProperty.put("xid", String.valueOf(returnCol(lon)));
stationProperty.put("yid", String.valueOf(returnRow(lat)));
}
// 这样station属性表自带xy值
stationsProperty = manager.getData();
}
// 这里需要传入日期,对特定日期下的站点数据进行提取
public double[][] createSitesArray(String date) {
int height = dem.length;
int width = dem[0].length;
grid = new double[height][width];
// 查找特定日期不同站点的降雨量数据,需要使用datamanager进行查找单个map
DataManager rainFallManager = new DataManager(rainFlow);
// 查找不同站点的位置编号,需要使用
for (Map<String, String> station : stationsProperty) {
// 遍历单个站点,对站点的位置和编码进行查找
String siteCode = station.get("STATION");
int siteX = Integer.parseInt(station.get("xid"));
int siteY = Integer.parseInt(station.get("yid"));
// 根据编码和日期,查找到降雨量数据
Map<String, String> rainFallData = rainFallManager.findMap(rainFlow, "STATION", siteCode, "DATE", date);
double rainFallValue = Double.parseDouble(rainFallData.get("PRCP_mm"));
// 数值赋值到数组中
grid[siteY][siteX] = rainFallValue;
}
return grid;
}
// 返回列索引
private int returnCol (double longitude) {
double lon_min = Double.parseDouble(gridProperty.get("xllcorner"));
double lon_max =
lon_min + Double.parseDouble(gridProperty.get("cellsize")) * Integer.parseInt(gridProperty.get("ncols"));
if (longitude > lon_min && longitude < lon_max) {
return (int)Math.floor( (longitude-lon_min) / Double.parseDouble(gridProperty.get("cellsize")) );
} else {
System.out.println("经度超出dem范围");
return 0;
}
}
private int returnRow (double latitude) {
double lat_min = Double.parseDouble(gridProperty.get("yllcorner"));
double lat_max =
lat_min + Double.parseDouble(gridProperty.get("cellsize")) * Integer.parseInt(gridProperty.get("nrows"));
if (latitude > lat_min && latitude < lat_max) {
return Integer.parseInt(gridProperty.get("nrows")) - 1 - (int)Math.floor( (latitude-lat_min) / Double.parseDouble(gridProperty.get("cellsize")) );
} else {
System.out.println("纬度超出dem范围");
return 0;
}
}
}