安卓利用高德实现规划路线并模拟小车运行轨迹

距离上次写博客大概有半年了,这次博客是补半年前做过的项目的一部分,利用高德SDK给小车规划路线,小车按照既定路线行驶,并在行驶过程中标记地物,由于疫情影响没办法直接和小车通信,这里做的是一个模拟效果。

一、效果图


以上是效果图。

二、代码实现

1、规划路线

   /**、
    *在地图上选点,并存入路线数组
    */
    @Override
    public void onMapClick(LatLng latLng) {
        if (rb_planning.isChecked ()) {
            latLngs_planning.add (latLng);
            createRouteSpot (latLng);
        }

    }
    /**
     * 点击按钮,完成路线规划,并开启小车模拟线程
     */
    public void finishRoute(View view) {


        if (latLngs_planning.size () > 1) {
            rb_planning.setChecked (false);
            rb_trail.setChecked (true);
            latLngs_planning.add (latLngs_planning.get (0));
            planRoute ();//画出路线

            btn_finishplanning.setVisibility (View.INVISIBLE);
            rb_planning.setChecked (false);
            rb_trail.setChecked (true);
            new routeThread ().start ();//开启小车模拟运动线程


            // new receiveThread ().start ();//开始接受小车实时坐标
            Toast.makeText (MainActivity.this, "成功规划路线", Toast.LENGTH_SHORT);


        } else {
            Toast.makeText (MainActivity.this, "未选取路径点", Toast.LENGTH_SHORT);
        }
    }

2、开启线程,模拟小车轨迹

    /**
     * 发送初始坐标数据,为小车规划路线
     */
    public class routeThread extends Thread {
        //String string_route = null;


        public void run() {
            try {


                imitateRoute ();
                Log.e ("run: ", "睡眠");
            } catch (Exception e) {
                e.printStackTrace ();
            }
     /**
     *模拟小车动态轨迹
     */
    public void imitateRoute() {
        double a, k, b;

        imitate_endlat = Double.valueOf (latLngs_planning.get (1).latitude);
        imitate_endlng = Double.valueOf (latLngs_planning.get (1).longitude);
        k = (imitate_endlat - start_lat) / (imitate_endlng - start_lng);//计算斜率
        b = start_lat - k * start_lng;
        Log.e ("imitateRoute", imitate_endlat + "," + imitate_endlng + "斜率:" + k + "b:" + b);
        a = Math.abs (imitate_endlng - start_lng) / 40;
        latLngs_car.add (latLngs_planning.get (0));

        while (imitate_currlng < imitate_endlng) {

            SystemClock.sleep (1200);//速度延迟

            Message msg_latlng=Message.obtain ();
            imitate_currlng = imitate_currlng + a;    //计算当前模拟经度
            double random1= Math.random ()*(a/2)-Math.random ()*(a/2);//添加随机数模拟误差
            double  random2=Math.random ();//随机数作为判断地物根据
            imitate_currlat = k * imitate_currlng + b+random1;  //当前模拟纬度
            LatLng imitate_currlatlng = new LatLng (imitate_currlat, imitate_currlng);

            latLngs_car.add (imitate_currlatlng); //将当前模拟经纬度添加至小车轨迹集合

            if (random2<0.2){
                createLandMinespot (imitate_currlatlng);//自定义函数,标记地物
            }
            carRoute ();//自定义函数,画出小车动态轨迹
            msg_latlng.obj=imitate_currlat+","+imitate_currlng;
            handler_showlatlng.sendMessage (msg_latlng);
            Log.e ("imitateRoute: ", String.valueOf (imitate_currlng));
        }
    }

三、结语

疫情在家令人懒惰了大半年,来到学校后,身边优秀的人确实给了我很大的压力和动力,喜欢编程就要把这个东西一直做下去。

你可能感兴趣的:(Android,Java,android,java)