出租车轨迹数据计算

  1. 数据文件读取
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.运行结果比较

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值