- 数据文件读取
public static List<DataCon> readFile(String path_){
List<DataCon> data = new ArrayList<>();
try(BufferedReader bis = new BufferedReader(new FileReader(path_))){
String temp;
bis.readLine();
while ((temp = bis.readLine())!=null){
String[] arr = temp.split(",");
DataCon var = new DataCon(arr[0],
arr[1],
arr[2],
Double.parseDouble(arr[3]),
Double.parseDouble(arr[4]),
sdf.parse(arr[2]).getTime()/1000.0);
data.add(var);
}
}catch (Exception e){
System.out.println(e.getMessage());
}
return data;
}
2.解析数据
@Data
@AllArgsConstructor
class DataCon{
private String name;
private String state;
private String time;
private double x;
private double y;
private double second;
}
3.算法实现,获取简化儒略日时间
private static double getMJDTime(String dateStr) {
// 从字符串中提取年、月、日、时、分、秒
double Y = Integer.parseInt(dateStr.substring(0, 4));
double M = Integer.parseInt(dateStr.substring(4, 6));
double D = Integer.parseInt(dateStr.substring(6, 8));
double h = Integer.parseInt(dateStr.substring(8, 10));
double N = Integer.parseInt(dateStr.substring(10, 12));
double S = Integer.parseInt(dateStr.substring(12));
// 重新计算月份调整项
double monthAdjustment1 = Math.floor(1.75 * (Y + Math.floor((M + 9) / 12.0)));
double monthAdjustment2 = Math.floor(275 * M / 9.0);
double yearTerm = 367 * Y;
double hourTerm = (h - 8) / 24;
double minuteTerm = N / 1440.0;
double secondTerm = S / 86400.0;
return -678987 + yearTerm - monthAdjustment1 + monthAdjustment2 + D + hourTerm + minuteTerm + secondTerm;
}
4.速度计算
public static double getSpeed(DataCon start,DataCon end){
double s = Math.sqrt(Math.pow(end.getY() - start.getY(), 2) + Math.pow(end.getX() - start.getX(), 2));
return (s/1000.0)/((end.getSecond()-start.getSecond())/3600);
}
5.运行结果
public static List<ResultRow> execute(List<DataCon> data){
List<ResultRow> re = new ArrayList<>();
if(data==null||data.size()==0){
return null;
}
for (int i = 0; i < data.size()-1; i++) {
DataCon start = data.get(i);
DataCon end = data.get(i+1);
String time = String.format("%.5f",getMJDTime(start.getTime()))+"-"+ String.format("%.5f",getMJDTime(end.getTime()));
double angle = AngleUtil.getAzimuth(new PointVo(start.getX(),start.getY()),new PointVo(end.getX(),end.getY()));
ResultRow var = new ResultRow(i,time,getSpeed(start,end),angle) ;
re.add(var);
}
return re;
}
6.运行结果比较