距离上次写博客大概有半年了,这次博客是补半年前做过的项目的一部分,利用高德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));
}
}
三、结语
疫情在家令人懒惰了大半年,来到学校后,身边优秀的人确实给了我很大的压力和动力,喜欢编程就要把这个东西一直做下去。