From a4a126cc414793a3c06da7c1f80f50131fe05792 Mon Sep 17 00:00:00 2001 From: lizhanwei <Dana_Lee1016@126.com> Date: 星期五, 20 三月 2020 15:43:01 +0800 Subject: [PATCH] 提交路考地图 --- app/src/main/java/safeluck/drive/evaluation/fragment/RoadDriveMapFragment.java | 375 +++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 305 insertions(+), 70 deletions(-) diff --git a/app/src/main/java/safeluck/drive/evaluation/fragment/RoadDriveMapFragment.java b/app/src/main/java/safeluck/drive/evaluation/fragment/RoadDriveMapFragment.java index 0843923..93bbeab 100644 --- a/app/src/main/java/safeluck/drive/evaluation/fragment/RoadDriveMapFragment.java +++ b/app/src/main/java/safeluck/drive/evaluation/fragment/RoadDriveMapFragment.java @@ -1,10 +1,14 @@ package safeluck.drive.evaluation.fragment; +import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; +import android.graphics.DashPathEffect; import android.graphics.Paint; import android.graphics.Path; +import android.graphics.PathEffect; +import android.graphics.RectF; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; @@ -21,19 +25,28 @@ import com.google.gson.reflect.TypeToken; import java.lang.reflect.Type; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; import me.yokeyword.fragmentation.SupportFragment; import safeluck.drive.evaluation.Constant; import safeluck.drive.evaluation.bean.ExamMap; +import safeluck.drive.evaluation.bean.RealTimeCarPos; +import safeluck.drive.evaluation.bean.RoadExamMap; +import safeluck.drive.evaluation.cEventCenter.CEventCenter; +import safeluck.drive.evaluation.cEventCenter.ICEventListener; import safeluck.drive.evaluation.util.FileUtil; + +import static android.view.View.LAYER_TYPE_SOFTWARE; public class RoadDriveMapFragment extends SupportFragment implements SurfaceHolder.Callback { private static final String TAG = RoadDriveMapFragment.class.getSimpleName(); + private static final int ALL_MAP = 100;//鎬诲浘 private SurfaceView mSurfaceView; private SurfaceHolder mSurfaceHolder; @@ -44,15 +57,47 @@ private Path mPath; private StringBuffer buffer;//瀛樻斁鍦板浘鐨刡uffer private Gson gson = new Gson(); + private double gpsSpeed = 0; + private int map_id = -1; + + + private String osdHeading = null; + private String osdMoveDirect = null; + private String osdRtkSpeed = null; + private String osdQf = null; + double car[][] = {{8.278, 1.467}, {7.2780000000000009, 1.467}, {7.2780000000000009, -1.533}, {8.278, -1.533} + , {9.278, -1.5330000000000004}, {9.277999999999999, 1.467000000000001}}; + double map[][]={}; + + private LinkedBlockingQueue queue = new LinkedBlockingQueue(100); private int avaliableWidth,avaliableHeight; private int x = 50, y = 50, r = 10; // 鍦嗙殑鍧愭爣鍜屽崐寰� - private int sinx = 0,siny =0 ; float [] pts={50,100,100,200,200,300,300,400}; private ExecutorService generateData = Executors.newSingleThreadExecutor();//浜х敓鏁版嵁锛堜富瑕佹槸杞﹁締鏁版嵁锛� private ExecutorService drawThread = Executors.newSingleThreadExecutor();//缁樺埗绾跨▼ + + + /** + * 鎺ユ敹杩滅▼鏈嶅姟鍙戣繃鏉ョ殑杞﹁締浣嶇疆淇℃伅 + */ + private ICEventListener icEventListener = new ICEventListener() { + @Override + public void onCEvent(String topic, final int msgCode, int resultCode, final Object obj) { + + + generateData.execute(new Runnable() { + @Override + public void run() { + queue.offer(new MessageRemoteService(msgCode,obj)); + } + }); + + + } + }; public static RoadDriveMapFragment newInstance(){ return new RoadDriveMapFragment(); @@ -103,6 +148,7 @@ flag = true; + drawThread.execute(new DrawRunnable()); } @@ -117,62 +163,123 @@ flag = false; } - List<ExamMap> examMaps = new ArrayList<>(); + RoadExamMap examMaps ; + /** * 涓昏鏄繖涓柟娉曪紝杩涜鍧愭爣鐐硅绠楋紝浣跨敤mPath鐢诲浘锛屽彲鑳借鐢ㄥ埌Canvas * 鏈�濂藉彧浣跨敤path */ private void calculate() { - int map_id = 863; - int map_line = 0; - double map[][]={}; + int map_line = 0,line = 0; + MessageRemoteService messageRemoteService = (MessageRemoteService) queue.peek(); + if (messageRemoteService == null){ + Log.i(TAG,"messageRemoteService ==null"); - if (buffer == null){ - - buffer = FileUtil.readAssetTxtFile(_mActivity, Constant.ROAD_MAP); - Log.i(TAG,"ditu="+buffer.toString().trim()); - } - Type type = new TypeToken<List<ExamMap>>(){}.getType(); - if (buffer != null){ - examMaps= gson.fromJson(buffer.toString().trim(), type); - } - - for (int i = 0; i < examMaps.size(); i++) { - ExamMap examMap = examMaps.get(i); - if (map_id == examMap.getId()){ - List<ExamMap.PointBean> pointBeanList = examMap.getPoint(); - - for(int j=0; j<pointBeanList.size();j++){ - List<Double> xys = pointBeanList.get(j).getXy(); - if(j==0){ - map = new double[xys.size()/2][2]; - - - - for (int k=0; k<xys.size();k++){ - if ((k % 2) == 0) { - map[map_line][0] = xys.get(k); - Log.i(TAG, "onCEvent: map鏂板��=" + map[map_line][0] + " 浣嶇疆锛�" + k); - } else { - double value = 0-xys.get(k); - - - map[map_line][1] = value; - map_line++; - } - } - }else{ - MyLog.i(TAG,"鏆傛椂鏀寔鏇茬嚎"); - break; - } - - - - } - break; + try { + Thread.sleep(100); + } catch (InterruptedException e) { + e.printStackTrace(); } } - onDrawMap(map); + messageRemoteService = (MessageRemoteService) queue.poll(); + if (messageRemoteService != null){ + MyLog.i(TAG, messageRemoteService.json); + + + RealTimeCarPos timeCarPos = gson.fromJson((String) messageRemoteService.json, RealTimeCarPos.class); + List<Double> points = timeCarPos.getPoint(); + switch (timeCarPos.getMove()){ + case 0: + osdMoveDirect = "鍋滆溅"; + break; + case 1: + osdMoveDirect = "鍓嶈繘"; + break; + case -1: + osdMoveDirect = "鍚庨��"; + break; + } + osdHeading="鏂瑰悜瑙�"+String.valueOf(timeCarPos.getHeading()); + + BigDecimal bd = new BigDecimal(timeCarPos.getSpeed()); + bd = bd.setScale(3, BigDecimal.ROUND_HALF_UP); + osdRtkSpeed = "璁$畻閫熷害:" + bd; + + osdQf = "QF锛�" + String.valueOf(timeCarPos.getQf()); + + + + car = new double[points.size()/2][2]; + + for (int i = 0; i < points.size(); i++) { + if ((i % 2) == 0) { + car[line][0] = points.get(i); + } else { + double value = 0 - points.get(i); + car[line][1] = value; + line++; + } + + } + map_id = timeCarPos.getMap_id(); + + List<Double> mainAnt = timeCarPos.getMain_ant(); + List<Integer> tire1 = timeCarPos.getLeft_front_tire(); + List<Integer> tire2 = timeCarPos.getRight_front_tire(); + List<Integer> tire3 = timeCarPos.getLeft_rear_tire(); + List<Integer> tire4 = timeCarPos.getRight_rear_tire(); + + List<Integer> body = timeCarPos.getBody(); + + List<Integer> tire = new ArrayList<>(); + + tire.add(tire1.get(0)); + tire.add(tire2.get(0)); + tire.add(tire3.get(0)); + tire.add(tire4.get(0)); + + + + + if (buffer == null){ + + buffer = FileUtil.readAssetTxtFile(_mActivity, Constant.ROAD_MAP); + Log.i(TAG,"ditu="+buffer.toString().trim()); + } + Type type = new TypeToken<RoadExamMap>(){}.getType(); + if (buffer != null){ + examMaps= gson.fromJson(buffer.toString().trim(), type); + } + if (examMaps!=null){ + + points = examMaps.getPoints(); + if (points != null){ + map = new double[points.size()/2][2]; + for (int i = 0; i < points.size(); i++) { + if ((i % 2) == 0){ + map[map_line][0] = points.get(i); + + }else{ + double value = 0-points.get(i); + map[map_line][1] = value; + map_line++; + } + } + } + } + + onDrawMap(map,examMaps.getMaps(),car,body,tire,mainAnt); + + } + + + + + + + + + // mPaint.reset(); // mPaint.setStyle(Paint.Style.FILL); // mPaint.setColor(Color.RED); @@ -207,8 +314,8 @@ } - -private void onDrawMap(final double map[][]){ +private void onDrawMap(final double[][] map, List<RoadExamMap.MapsBean> maps,final double[][] car, + List<Integer>body, List<Integer> tire,List<Double> mainAnt){ double base_x = 300, base_y = 20; double max_x = 0, min_x = 0, max_y = 0, min_y = 0; @@ -235,6 +342,21 @@ } } } + for (int i = 0; i < car.length; i++) { + if (max_x < car[i][0]) { + max_x = car[i][0]; + } + if (min_x > car[i][0]) { + min_x = car[i][0]; + } + if (max_y < car[i][1]) { + max_y = car[i][1]; + } + if (min_y > car[i][1]) { + min_y = car[i][1]; + } + } + long scale_x = Math.round((mCanvas.getWidth() - base_x - 10) / (max_x - min_x)); long scale_y = Math.round((mCanvas.getHeight() - base_y - 10) / (max_y - min_y)); @@ -246,31 +368,108 @@ mPaint.reset(); mPaint.setAntiAlias(true); - mPaint.setColor(Color.BLACK); - mPaint.setStyle(Paint.Style.STROKE); + mPaint.setColor(Color.BLUE); mPaint.setStrokeWidth(1.5f); + mPaint.setStyle(Paint.Style.FILL_AND_STROKE); + mCanvas.drawCircle((float) (base_x + (mainAnt.get(0) - min_x) * scale_x), (float) (base_y + (0 - mainAnt.get(1) - min_y) * scale_y), 2, mPaint); + + mPaint.setColor(Color.RED); + mCanvas.drawCircle((float) (base_x + (car[tire.get(0)][0] - min_x) * scale_x), (float) (base_y + (car[tire.get(0)][1] - min_y) * scale_y), 2.5f, mPaint); + mCanvas.drawCircle((float) (base_x + (car[tire.get(1)][0] - min_x) * scale_x), (float) (base_y + (car[tire.get(1)][1] - min_y) * scale_y), 2.5f, mPaint); + mCanvas.drawCircle((float) (base_x + (car[tire.get(2)][0] - min_x) * scale_x), (float) (base_y + (car[tire.get(2)][1] - min_y) * scale_y), 2.5f, mPaint); + mCanvas.drawCircle((float) (base_x + (car[tire.get(3)][0] - min_x) * scale_x), (float) (base_y + (car[tire.get(3)][1] - min_y) * scale_y), 2.5f, mPaint); + + mPaint.setStyle(Paint.Style.STROKE); + mPaint.setColor(Color.BLACK); if (map.length > 9) { - Log.d(TAG, "DrawMap X = " + String.format("%f", (float) (base_x + (map[0][0] - min_x) * scale_x)) + " Y = " + String.format("%f", (float) (base_y + (map[0][1] - min_y) * scale_y))); - mPath.moveTo((float) (base_x + (map[0][0] - min_x) * scale_x), (float) (base_y + (map[0][1] - min_y) * scale_y)); - for (int i = 1; i < map.length; i++) { - Log.d(TAG, "DrawMap to X = " + (float) (base_x + (map[i][0] - min_x) * scale_x) + " Y = " + (float) (base_y + (map[i][1] - min_y) * scale_y)); - mPath.lineTo((float) (base_x + (map[i][0] - min_x) * scale_x), (float) (base_y + (map[i][1] - min_y) * scale_y)); - } - mPath.close(); - mCanvas.drawPath(mPath,mPaint); - } -mPaint.reset(); - mPath = new Path(); - mPaint.setStyle(Paint.Style.STROKE); - mPaint.setStrokeWidth(1.5f); - mPaint.setColor(Color.RED); - mPath.moveTo(300,150); - mPath.lineTo(1015,150); + if (maps != null&& maps.size()>0){ + for (int i = 0; i < maps.size(); i++) { + RoadExamMap.MapsBean mapItem = maps.get(i); + if (mapItem.getItem() == ALL_MAP){ + List<List<Integer>> redLines= mapItem.getRed_line(); + List<List<Integer>> greenLines = mapItem.getGreen_line(); + mPaint.reset(); + mPaint.setStyle(Paint.Style.STROKE); + mPaint.setStrokeWidth(1.5f); + mPaint.setAntiAlias(true); + mPaint.setColor(Color.RED); + Log.i(TAG,"redLinesSize"+redLines.size()); + for (List<Integer> redline: redLines + ) { + for (int j = 0; j < redline.size(); j++) { + Log.i(TAG,"redLiSize"+redline.size()); + int pos = redline.get(j); + if (j == 0){ + mPath.moveTo((float) (base_x + (map[pos][0] - min_x) * scale_x), (float) (base_y + (map[pos][1] - min_y) * scale_y)); + } + mPath.lineTo((float) (base_x + (map[pos][0] - min_x) * scale_x), (float) (base_y + (map[pos][1] - min_y) * scale_y)); + Log.i(TAG,String.format("map[%d][0]=%f,map[%d][1]=%f,line to (%f,%f)",pos,map[pos][0],pos,map[pos][1], + (float) (base_x + (map[pos][0] - min_x) * scale_x),(float) (base_y + (map[pos][1] - min_y) * scale_y))); - mCanvas.drawPath(mPath,mPaint); + } + } + mCanvas.drawPath(mPath,mPaint); + //鐢昏櫄绾匡紙鍒嗛亾绾匡級 + mPaint.reset(); + mPaint.setStyle(Paint.Style.STROKE); + mPaint.setStrokeWidth(1.5f); + mPaint.setAntiAlias(true); + mPaint.setColor(Color.WHITE); + mPath = new Path(); + mPaint.setPathEffect(new DashPathEffect(new float[] {15, 15}, 0)); + for (List<Integer> greenline: + greenLines){ + for (int j = 0; j < greenline.size(); j++) { + int pos = greenline.get(j); + if (j == 0){ + mPath.moveTo((float) (base_x + (map[pos][0] - min_x) * scale_x), (float) (base_y + (map[pos][1] - min_y) * scale_y)); + } + mPath.lineTo((float) (base_x + (map[pos][0] - min_x) * scale_x), (float) (base_y + (map[pos][1] - min_y) * scale_y)); + Log.i(TAG,String.format("map[%d][0]=%f,map[%d][1]=%f,line to (%f,%f)",pos,map[pos][0],pos,map[pos][1], + (float) (base_x + (map[pos][0] - min_x) * scale_x),(float) (base_y + (map[pos][1] - min_y) * scale_y))); + } + } + mCanvas.drawPath(mPath,mPaint); + + } + } + + mPath.moveTo((float) (base_x + (car[body.get(0)][0] - min_x) * scale_x), (float) (base_y + (car[body.get(0)][1] - min_y) * scale_y)); + for (int k = 1; k < body.size(); k++){ + Log.d(TAG, "for 寰幆 DrawMap to X = " + (float) (base_x + (car[body.get(k)][0] - min_x) * scale_x)+ " Y = " + (float) (base_y + (car[body.get(k)][1] - min_y) * scale_y)); + mPath.lineTo((float) (base_x + (car[body.get(k)][0] - min_x) * scale_x), (float) (base_y + (car[body.get(k)][1] - min_y) * scale_y)); + } + + mPath.close(); + + mCanvas.drawPath(mPath, mPaint); + + + + } + + } + + +//mPaint.reset(); +// mPath = new Path(); +// mPaint.setStyle(Paint.Style.STROKE); +// mPaint.setStrokeWidth(1.5f); +// +// for (int i = 0; i < map.length; i++) { +// if (i<map.length-3){ +// mPath.moveTo((float) (base_x + (map[i][0] - min_x) * scale_x), (float) (base_y + (map[i][1] - min_y) * scale_y)); +// mPath.lineTo((float) (base_x + (map[i+3][0] - min_x) * scale_x), (float) (base_y + (map[i+3][1] - min_y) * scale_y)); +// }else{ +// break; +// } +// +// i++; +// } +// mCanvas.drawPath(mPath,mPaint); } /** @@ -314,4 +513,40 @@ } } + + + class MessageRemoteService{ + public int msgCode; + public String json; + + public MessageRemoteService(int msgCode, Object obj) { + this.json = (String) obj; + this.msgCode = msgCode; + } + } + + + @Override + public void onAttach(Context context) { + super.onAttach(context); + CEventCenter.onBindEvent(true, icEventListener, Constant.REAL_TIME_POS_CAR_TOPIC); + CEventCenter.onBindEvent(true, speedListener, Constant.BIND_RTK_SPEED_TOPIC); + } + @Override + public void onDetach() { + super.onDetach(); + generateData.shutdown(); + drawThread.shutdown(); + CEventCenter.onBindEvent(false, icEventListener, Constant.REAL_TIME_POS_CAR_TOPIC); + CEventCenter.onBindEvent(false, speedListener, Constant.BIND_RTK_SPEED_TOPIC); + } + private ICEventListener speedListener = new ICEventListener() { + @Override + public void onCEvent(String topic, int msgCode, int resultCode, Object obj) { + if (msgCode == Constant.RTK_INFO){ + gpsSpeed = (double)obj; + } + } + }; + } -- Gitblit v1.8.0