气象数据读取(3)---COSMIC掩星数据读取
1.前言
在上一篇文章里,我们介绍了FY/GNOS数据的提取。并提供了相应数据的get方法供外界调用。是不是成就感满满?哈哈,这一小节,我们开始提取COSMIC数据。所谓一回生,二回熟。我们这次有了上节课的经验,快速把他搞定。
2.COSMIC卫星简介
COSMIC是台湾NSPO和美国UCAR合作的进行全球大气即时观测的卫星任务.本文介绍了COSMIC卫星星座和轨道,主要搭载仪器,科学目标和应用,COSMIC是国际上第一个同时6颗小卫星进行GPS掩星观测的卫星任务,是气象,电离层和大地测量等学科研究的前沿.
3. 工具类实现
其实,COSMIC卫星的数据结构和GNOS的数据结构基本一样。所以我们的代码要改的很少。只需要把getVariablesLists(); getGlobalVariablesLists(),在这两个方法中的String vbName和int position改掉就ok了。
我们在utils包下创建一个ReadCmNcDataUtils类
public class ReadFyNcDataUtils {
private static List<String> mLat = new ArrayList<String>();
private static List<String> mLon = new ArrayList<String>();
private static List<String> mYear = new ArrayList<String>();
private static List<String> mMonth = new ArrayList<String>();
private static List<String> mDay = new ArrayList<String>();
private static List<String> mHour = new ArrayList<String>();
private static List<String> mMinute = new ArrayList<String>();
private static List<String> mSecond = new ArrayList<String>();
private static List<Double> mAlts = new ArrayList<Double>();
private static List<List> mAltsList = new ArrayList<List>();
private static List<Double> mTemps = new ArrayList<Double>();
private static List<List> mTempsList = new ArrayList<List>();
private static List<Double> mPress = new ArrayList<Double>();
private static List<List> mPressList = new ArrayList<List>();
private static List<NetcdfFile> mNc = new ArrayList<NetcdfFile>();
private static List<File> fileList;
private static NetcdfFile ncData;
/**
* 根据用户提供的文件夹路径,对数据进行读取,并返回路径名
* TODO:在这里忽略了对文件夹路径,以及文件夹内容的判断
* 但是,不会真的有人这么无聊给错误的文件夹或者路径吧,不会吧,不会吧
* 注意!!!这个方法是必须要实现的,因为这会根据你提供的路径进行读取
*
* @param filepath 这个参数必须给
* @return
*/
public static List<NetcdfFile> getNcDataList(String filepath) {
File file = new File(filepath);
File[] filesNames = file.listFiles();
fileList = Arrays.asList(filesNames);
//TODO:将读出的文件列表进行数据来源判断:①GNOS②COSMIC
for (File itemFile : fileList) {
try {
ncData = NetcdfFile.open(itemFile.getPath());
mNc.add(ncData);
} catch (IOException e) {
e.printStackTrace();
}
}
return mNc;
}
/**
* 获取掩星点纬度,24
*
* @return
*/
public List<String> getRoLat() {
return getGlobalVariablesLists(24, mLat);
}
/**
* 获取掩星点经度,25
*
* @return
*/
public List<String> getRoLon() {
return getGlobalVariablesLists(25, mLon);
}
/**
* 获取掩星事件发生年份
*
* @return
*/
public List<String> getRoYear() {
return getGlobalVariablesLists(3, mYear);
}
/**
* 获取掩星事件发生月份
*
* @return
*/
public List<String> getRoMonth() {
return getGlobalVariablesLists(4, mMonth);
}
/**
* 获取掩星事件发生天
*
* @return
*/
public List<String> getRoDay() {
return getGlobalVariablesLists(5, mDay);
}
/**
* 获取掩星事件发生小时
*
* @return
*/
public List<String> getRoHour() {
return getGlobalVariablesLists(6, mHour);
}
/**
* 获取掩星事件发生分钟
*
* @return
*/
public List<String> getRoMinute() {
return getGlobalVariablesLists(7, mMinute);
}
/**
* 获取掩星事件发生秒数
*
* @return
*/
public List<String> getRoSecond() {
return getGlobalVariablesLists(8, mSecond);
}
/**
* 获得海拔
*
* @param
* @return
*/
public List<List> getAltList() {
return getVariablesLists("MSL_alt", mAlts, mAltsList);
}
/**
* 获得温度
*
* @param
* @return
*/
public List<List> getTempList() {
return getVariablesLists("Temp", mTemps, mTempsList);
}
/**
* 获得压强
*
* @param
* @return
*/
public List<List> getPressList() {
return getVariablesLists("Pres", mPress, mPressList);
}
private static List<String> getGlobalVariablesLists(int position, List<String> mGlobalVb) {
for (NetcdfFile netcdfFile : mNc) {
List<Attribute> globalAttributes = netcdfFile.getGlobalAttributes();
Array values = globalAttributes.get(position).getValues();
String s = values.toString();
mGlobalVb.add(s);
}
return mGlobalVb;
}
private static List<List> getVariablesLists(String vbName,
List<Double> mVrs,
List<List> mVrsList) {
for (NetcdfFile netcdfFile : mNc) {
Variable pres = netcdfFile.findVariable(vbName);
Array read = null;
try {
read = pres.read();
} catch (IOException e) {
e.printStackTrace();
}
for (long i = 0; i < read.getSize(); i++) {
double aDouble = read.getDouble((int) i);
mVrs.add(aDouble);
}
mVrsList.add(mVrs);
}
return mVrsList;
}
}
从上述代码中可以看出,COSMIC的代码和GNOS的代码99%的地方都是一样的。只是改了很少的地方。
4. 优雅的交汇
从上文中我们可以看出,重复代码实在是太多了,并且有的代码我们是为了实现功能而实现功能,一点都不优雅。这对一个程序员来说是不能忍的,那我们要如何抽取来实现代码复用?
另外这里的代码在某些情况下也会出现一个小bug,至于是什么bug,我们先卖个关子,后面用到时,我们细讲一下。。
- [x] 我们的征途是星辰大海。我就是我,我就是天!
- [x] 疾风亦有龟途对本文享有版权,转载请标明原文链接,禁止复制!
- [x] 欢迎访问我的个人博客网站---->夙夜星辰叹
- [x] 欢迎关注我的微信公众号:
版权属于: 依依东望