气象数据读取(5)---时空特征匹配
1.需求分析
对于学习气象,遥感,地信的同学来说。对于时空特征这一概念都比较熟悉。我们在做科研时,总喜欢拿自己得出的结果和其他的权威数据作比较。这时,就离不开对时间和空间特征的匹配。这篇文章开始,我们就使用Java语言对气象数据进行时空特征匹配。
2.代码时刻
2.1代码逻辑
- 利用ReadAllNcDataUtils计算GNOS的year,month,day,hour,minute,second,lat,lon
- 利用ReadAllNcDataUtils计算COSMIC的year,month,day,hour,minute,second,lat,lon
- 根据上述计算参数,设计相应get方法(要给用户提供相应接口,满足用户的时空匹配特征)
- coding
2.2工具类实现
通过上面的步骤分析,我相信大家已经能明白其中逻辑。我们在utils下新建RoMatchingUtils工具类,具体代码如下
public class RoMatchingUtils {
//case分析
//1.用户给定纬度,找出给定文件夹中所有满足的数据,并将数据名及其路径存入相应数组中、或者存入到excel里,方便后续使用
//2.用户给定经度,找出给定文件夹中所有满足的数据,并将数据名及其路径存入相应数组中、或者存入到excel里,方便后续使用
//3.用户给定经纬度,找出给定文件夹中所有满足的数据,并将数据名及其路径存入相应数组中、或者存入到excel里,方便后续使用
//4.用户给定时间,给定经纬度,找出给定文件夹中所有满足的数据,并将数据名及其路径存入相应数组中、或者存入到excel里,方便后续使用
//5.其实还有很多case,这里就不一一弄了,上面4个case应该比较多,后面有需要可以自行扩展
/**
* case1 用户给定纬度
*
* @param inputValue 输入你要设定的经纬度值,比如说北纬20.0,南纬35.21等等
* @param IntervalValue 输入阈值范围,比如说±3°,那就是3.0。
* @param filePath 输入你要检索的文件夹路径
* @return
*/
public List<String> getLatMat(Double inputValue, Double IntervalValue, String filePath) {
List<String> matchResult = new ArrayList<String>();
ReadAllNcDataUtils rd = new ReadAllNcDataUtils();
List<NetcdfFile> ncDataList = rd.getNcDataList(filePath);
List<File> fileList = rd.getFileList(filePath);
List<String> roLat = rd.getRoLat(ncDataList);
for (int i = 0; i < roLat.size(); i++) {
Double v = Double.parseDouble(roLat.get(i));
if (Math.abs(inputValue - v) <= IntervalValue) {
matchResult.add(fileList.get(i).getPath());
}
}
return matchResult;
}
/**
* case2 用户给定经度
*
* @param inputValue 输入你要设定的经度值,比如说东经20.0,西经35.21等等
* @param IntervalValue 输入阈值范围,比如说±3°,那就是3.0。
* @param filePath 输入你要检索的文件夹路径
* @return
*/
public List<String> getLonMat(Double inputValue, Double IntervalValue, String filePath) {
List<String> matchResult = new ArrayList<String>();
ReadAllNcDataUtils rd = new ReadAllNcDataUtils();
List<NetcdfFile> ncDataList = rd.getNcDataList(filePath);
List<File> fileList = rd.getFileList(filePath);
List<String> roLon = rd.getRoLon(ncDataList);
for (int i = 0; i < roLon.size(); i++) {
Double v = Double.parseDouble(roLon.get(i));
if (Math.abs(inputValue - v) <= IntervalValue) {
matchResult.add(fileList.get(i).getPath());
}
}
return matchResult;
}
/**
* @param inputValueLat 输入你要设定的经纬度值,比如说北纬20.0,南纬35.21等等
* @param inputValueLon 输入你要设定的经度值,比如说东经20.0,西经35.21等等
* @param IntervalValueLat 输入阈值范围,比如说±3°,那就是3.0。
* @param IntervalValueLon 输入阈值范围,比如说±3°,那就是3.0。
* @param filePath 输入你要检索的文件夹路径
* @return
*/
public List<String> getLatLonMat(Double inputValueLat, Double inputValueLon,
Double IntervalValueLat, Double IntervalValueLon, String filePath) {
List<String> matchResult = new ArrayList<String>();
ReadAllNcDataUtils rd = new ReadAllNcDataUtils();
List<File> fileList = rd.getFileList(filePath);
List<NetcdfFile> ncDataList = rd.getNcDataList(filePath);
List<String> roLat = rd.getRoLat(ncDataList);
List<String> roLon = rd.getRoLon(ncDataList);
for (int i = 0; i < roLat.size(); i++) {
double vLat = Double.parseDouble(roLat.get(i));
Double vLon = Double.parseDouble(roLon.get(i));
if (Math.abs(inputValueLat - vLat) <= IntervalValueLat && Math.abs(inputValueLon - vLon) <= IntervalValueLon) {
matchResult.add(fileList.get(i).getPath());
}
}
return matchResult;
}
/**
* @param inputValueLat 输入你要设定的经纬度值,比如说北纬20.0,南纬35.21等等
* @param inputValueLon 输入你要设定的经度值,比如说东经20.0,西经35.21等等
* @param IntervalValueLat 输入阈值范围,比如说±3°,那就是3.0。
* @param IntervalValueLon 输入阈值范围,比如说±3°,那就是3.0。
* @param time 单位是秒
* @param IntervalValueTime 单位是秒
* @param filePath 输入你要检索的文件夹路径
* @return
*/
public List<String> getLatLonTimeMat(Double inputValueLat, Double inputValueLon,
Double IntervalValueLat, Double IntervalValueLon, Double time, Double IntervalValueTime, String filePath) {
List<String> matchResult = new ArrayList<String>();
ReadAllNcDataUtils rd = new ReadAllNcDataUtils();
List<File> fileList = rd.getFileList(filePath);
List<NetcdfFile> ncDataList = rd.getNcDataList(filePath);
List<String> roLat = rd.getRoLat(ncDataList);
List<String> roLon = rd.getRoLon(ncDataList);
List<String> roHour = rd.getRoHour(ncDataList);
List<String> roMinute = rd.getRoMinute(ncDataList);
List<String> roSecond = rd.getRoSecond(ncDataList);
for (int i = 0; i < roLat.size(); i++) {
double vLat = Double.parseDouble(roLat.get(i));
Double vLon = Double.parseDouble(roLon.get(i));
Double vSecond = Double.parseDouble(roSecond.get(i));
Double vMinute = Double.parseDouble(roMinute.get(i)) * 60;
Double vHour = Double.parseDouble(roHour.get(i)) * 3600;
Double TotalTime = vSecond + vMinute + vHour;
if (Math.abs(inputValueLat - vLat) <= IntervalValueLat && Math.abs(inputValueLon - vLon) <= IntervalValueLon
&& Math.abs(TotalTime - time) <= IntervalValueTime) {
matchResult.add(fileList.get(i).getPath());
}
}
return matchResult;
}
}
3.总结
其实,Java语言是提供可变参数方法的,但是,由于当时写的时候,分开写了,也懒得搞了。并且分开写,好处是,不同的命名方法清晰明了,坏处是,代码变多啦!哈哈哈。
到此,我们的数据读取,时空匹配的工具类已经有了。但是,我们会遇到另外一个问题,那就是每次执行后的数据,我们没有存储下来,不利于后续的科研或者开发活动。况且,随着数据量的增多,每一次run都会耗费大量的资源和时间。所以,将数据以某种方式存储下来,势在必行。下一篇,我们将分享一种存储格式。。。
- [x] 我们的征途是星辰大海。我就是我,我就是天!
- [x] 疾风亦有龟途对本文享有版权,转载请标明原文链接,禁止复制!
- [x] 欢迎访问我的个人博客网站---->夙夜星辰叹
- [x] 欢迎关注我的微信公众号:
![QQ图片20200811144323](https://gitee.com/xiaoguoshuoshi/blog_img/raw/master/img/QQ%E5%9B%BE%E7%89%8720200811144323.png)
版权属于: 依依东望