yy1717
2021-02-22 91bb7b8a153546114e67847fd77423b1a63f1669
Merge branch 'master' of https://gitee.com/endian11/DriveJudge
4个文件已修改
3个文件已添加
2386 ■■■■■ 已修改文件
app/src/main/java/safeluck/drive/evaluation/fragment/ArcGisMapFragment.java 595 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/fragment/ArcGisMapFragmentMMPK.java 601 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/fragment/ArcGisMapFragmentVTPK.java 590 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/httpmodule/HttpCarRespBean.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/httpmodule/HttpGisCarRespBean.java 538 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/util/DataInit.kt 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/res/layout/layout_arc_gis.xml 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
app/src/main/java/safeluck/drive/evaluation/fragment/ArcGisMapFragment.java
@@ -1,7 +1,12 @@
package safeluck.drive.evaluation.fragment;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PointF;
import android.os.Bundle;
import android.os.Environment;
@@ -11,6 +16,8 @@
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
@@ -26,21 +33,32 @@
import com.esri.arcgisruntime.geometry.SpatialReference;
import com.esri.arcgisruntime.layers.ArcGISMapImageLayer;
import com.esri.arcgisruntime.layers.ArcGISTiledLayer;
import com.esri.arcgisruntime.loadable.LoadStatus;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.MobileMapPackage;
import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener;
import com.esri.arcgisruntime.mapping.view.Graphic;
import com.esri.arcgisruntime.mapping.view.GraphicsOverlay;
import com.esri.arcgisruntime.mapping.view.MapScaleChangedEvent;
import com.esri.arcgisruntime.mapping.view.MapScaleChangedListener;
import com.esri.arcgisruntime.mapping.view.MapView;
import com.esri.arcgisruntime.symbology.SimpleFillSymbol;
import com.esri.arcgisruntime.symbology.SimpleLineSymbol;
import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol;
import com.google.gson.Gson;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.File;
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 java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import me.yokeyword.fragmentation.SupportFragment;
import safeluck.drive.evaluation.Constant;
@@ -51,6 +69,7 @@
import safeluck.drive.evaluation.bean.GisCarModel;
import safeluck.drive.evaluation.bean.MapInfoHead;
import safeluck.drive.evaluation.bean.RTKInfoBean;
import safeluck.drive.evaluation.bean.RealTimeCarPos;
import safeluck.drive.evaluation.cEventCenter.CEventCenter;
import safeluck.drive.evaluation.cEventCenter.ICEventListener;
import safeluck.drive.evaluation.util.CThreadPoolExecutor;
@@ -69,6 +88,7 @@
    private static final int ENTER = 1;//进入 科二某个项目地图
    private LinkedBlockingQueue queue = new LinkedBlockingQueue(100);
    private LinkedBlockingQueue queue1 = new LinkedBlockingQueue(100);
    private ExecutorService consumer = Executors.newSingleThreadExecutor();
    private ExecutorService producer = Executors.newSingleThreadExecutor();
    SimpleLineSymbol lineSymbolGls = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.BLACK, 0.5f);
@@ -102,18 +122,25 @@
                ExamStatus examStatus = (ExamStatus)obj;
                if (examStatus.getMap_id()>-1){
                    if (examStatus.getEnter()==ENTER){
                        MyLog.i(TAG,String.format("进入[%d] map",examStatus.getMap_id()));
                        double scale = mMapView.getMapScale();
                        mMapView.setViewpointScaleAsync(scale * 0.2*0.2);
                        MyLog.i(TAG,String.format("进入[%d] map,scale=%f",examStatus.getMap_id(),scale));
                        mMapView.setViewpointScaleAsync(scale * 0.2);
                    }else{
                        MyLog.i(TAG,String.format("退出[%d] map",examStatus.getMap_id()));
                        double scale = mMapView.getMapScale();
                        mMapView.setViewpointScaleAsync(scale * 5*5);
                        MyLog.i(TAG,String.format("退出[%d] map,scale=%f",examStatus.getMap_id(),scale));
                        mMapView.setViewpointScaleAsync(scale * 5);
                    }
                }
            }
        }
    };
    private SurfaceView mSurfaceView;
    private SurfaceHolder holder;
    public static SupportFragment newInstance(String s){
        ArcGisMapFragment jiaXiaoFragment = new ArcGisMapFragment();
@@ -140,13 +167,19 @@
                    List<safeluck.drive.evaluation.bean.Point> newCarPoints = (List<safeluck.drive.evaluation.bean.Point>) msg.obj;
                    Log.i(TAG,"handle message newcarPoints.size="+newCarPoints.size());
                    drawGlses(newCarPoints,gisCarModel);
                    drawRightPart();
                    break;
            }
        }
    };
    PointCollection mPointCollection = new PointCollection(SpatialReference.create(4544));
    private Bitmap bmp2 = null;
    private Paint paint = new Paint();
    private Canvas canvas3 = null;
    private int screen_width = 0, screen_height = 0,display_width=0;
    private ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@@ -154,7 +187,67 @@
        View view = inflater.inflate(R.layout.layout_arc_gis,container,false);
        mMapView = view.findViewById(R.id.mapView);
        mMapView.addMapScaleChangedListener(new MapScaleChangedListener() {
            @Override
            public void mapScaleChanged(MapScaleChangedEvent mapScaleChangedEvent) {
                Log.i(TAG,"mapscaleChangelistenre");
            }
        });
        view.findViewById(R.id.btn_change_map).setOnClickListener(this);
        mSurfaceView = view.findViewById(R.id.surfaceview_arcgis);
        holder = mSurfaceView.getHolder();
        display_width = getResources().getDisplayMetrics().widthPixels;
        holder.addCallback(new SurfaceHolder.Callback() {
            @Override
            public void surfaceCreated(SurfaceHolder surfaceHolder) {
                Canvas canvas = surfaceHolder.lockCanvas();
                if (canvas != null) {
//                    Log.d(TAG, "W = " + canvas.getWidth() + " H = " + canvas.getHeight());
                    screen_width = canvas.getWidth();
                    screen_height = canvas.getHeight();
                    Log.d(TAG, "W = " + screen_width+ " H = " + screen_height );
                    surfaceHolder.unlockCanvasAndPost(canvas);
                    bmp2 = Bitmap.createBitmap(screen_width,  screen_height, Bitmap.Config.ARGB_8888);
                    canvas3 = new Canvas(bmp2);
                    canvas3.drawColor(Color.WHITE);
                    Log.d(TAG, "displaywidth W = " + display_width + "BMP H = " + bmp2.getHeight());
                    paint.setTextSize(30);
                    paint.setColor(Color.BLACK);
                    paint.setStrokeWidth(1.5f);
                    paint.setAntiAlias(true);
                    paint.setStyle(Paint.Style.STROKE);
                    holder.lockCanvas();
                    if (canvas != null){
                        canvas.drawBitmap(bmp2,0, 0, paint);
                        holder.unlockCanvasAndPost(canvas);
                    }
                }
            }
            @Override
            public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {
            }
            @Override
            public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
            }
        });
        Log.i(TAG,String.format("当前线程号%d,json=%s",Thread.currentThread().getId(),"onCreateView"));
        url = getArguments().getString("arcgis_url");
        CThreadPoolExecutor.runInBackground(()->{
@@ -164,11 +257,35 @@
        });
        consumer.execute(new CalRunnable());
        scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
//                Log.i(TAG,"1s到");
                if (lastcount==count){
//                    Log.i(TAG,"已经没在发消息了");
                    leftDistance = 0.0;
                    rightDistance = 0.0;
                }
                lastcount = count;
            }
        },1000,1000, TimeUnit.MILLISECONDS);
        setupMap();
        addTrailheadsLayer();
//        url = Environment.getExternalStorageDirectory().getAbsolutePath()+ File.separator+_mActivity.getPackageName()+"/shoufei0220.mmpk";
//        Log.i(TAG,"url ========="+url);
//        final MobileMapPackage mobileMapPackage = new MobileMapPackage(url);
//        mobileMapPackage.loadAsync();
//        mobileMapPackage.addDoneLoadingListener(()->{
//            LoadStatus loadStatus = mobileMapPackage.getLoadStatus();
//            if (loadStatus==LoadStatus.LOADED){
//                List<ArcGISMap> mainArcGisMapL = mobileMapPackage.getMaps();
//                ArcGISMap mainArcGismapMMPK = mainArcGisMapL.get(0);
//                mMapView.setMap(mainArcGismapMMPK);
//            }
//        });
        return view;
    }
@@ -199,22 +316,126 @@
                break;
        }
    }
    private String osdHeading = null;
    private String osdRtkSpeed = null;
    private  List<Integer> body = new ArrayList<>();
    private  List<Integer> tire = new ArrayList<>();
    int line = 0;
    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}};
    class CalRunnable implements Runnable{
        private String json;
        private int cmd;
        @Override
        public void run() {
            while (flag){
                MessageRemoteService messageRemoteService = (MessageRemoteService) queue1.peek();
                if (messageRemoteService == null){
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                messageRemoteService = (MessageRemoteService) queue1.poll();
                if (messageRemoteService != null) {
                    this.cmd = messageRemoteService.msgCode;
                    this.json = messageRemoteService.json;
                    MyLog.i(TAG, json);
                    RealTimeCarPos timeCarPos = gson.fromJson((String) 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;
                    line = 0;
                    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 = points.get(i);
                            car[line][1] = value;
                            line++;
                        }
                    }
                    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();
                    body = timeCarPos.getBody();
                    tire = new ArrayList<>();
                    double yaw = timeCarPos.getHeading();
                    tire.add(tire1.get(0));
                    tire.add(tire2.get(0));
                    tire.add(tire3.get(0));
                    tire.add(tire4.get(0));
                }
//                rtkInfoBean = (RTKInfoBean)queue.peek();
//                if (rtkInfoBean ==null){
//                    try {
//                        Thread.sleep(100);
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    }
//                }
                rtkInfoBean = (RTKInfoBean)queue.poll();
                if (rtkInfoBean != null){
                    Log.i(TAG,String.format("取出一个,queue.size=%d,rtkinfo=%s,线程号=%d",queue.size(),rtkInfoBean.toString(),Thread.currentThread().getId()));
                    yaw = rtkInfoBean.getHeading();
                    startX = rtkInfoBean.getCoord_y();
                    startY = rtkInfoBean.getCoord_x();
                    osdHeading="方向角"+String.valueOf(rtkInfoBean.getHeading());
                    if (mMapView != null){
                        mMapView.setViewpointRotationAsync(rtkInfoBean.getHeading());
                    }
                addGraphicLayer(yaw,startX,startY);
@@ -225,14 +446,277 @@
        }
    }
    float base_x = 300;
    float base_y = 20;
    long scale_x,scale_y;
    double min_x=0.0,min_y = 0;
    private String osdMoveDirect = null;
    private void drawRightPart() {
        paint.setStyle(Paint.Style.FILL_AND_STROKE);
        canvas3.drawColor(Color.YELLOW);
if (gisCarModel != null){
    PointF mainPoint = new PointF(startX, startY);
    for (int i = 0; i < car.length; i++) {
        PointF oldPoint = new PointF(car[i][0], car[i][1]);
        PointF newPoint = rotatePoint(oldPoint, mainPoint, yaw );
        car[i][0] = newPoint.getX();
        car[i][1] = newPoint.getY();
        car[i][0] = car[i][0] - mainPoint.getX();
        car[i][1] = car[i][1] - mainPoint.getY();
        car[i][1] = -car[i][1];
    }
}
        // 指南针 ++++++++++++++++++++++++++++++++++++++++++++++++++++
        float compassOX = bmp2.getWidth() - 60, compassOY = 60;
        Log.i(TAG,"draw widht="+(bmp2.getWidth() - 60));
        float compass1X = compassOX + 7, compass1Y = compassOY;
        float compass2X = compassOX, compass2Y = compassOY + 30;
        float compass3X = compassOX - 7, compass3Y = compassOY;
        float compass4X = compassOX + 7, compass4Y = compassOY;
        float compass5X = compassOX, compass5Y = compassOY - 30;
        float compass6X = compassOX - 7, compass6Y = compassOY;
        PointF compassO = new PointF(compassOX, compassOY);
        PointF compass1 = new PointF(compass1X, compass1Y);
        PointF compass2 = new PointF(compass2X, compass2Y);
        PointF compass3 = new PointF(compass3X, compass3Y);
        PointF compass4 = new PointF(compass4X, compass4Y);
        PointF compass5 = new PointF(compass5X, compass5Y);
        PointF compass6 = new PointF(compass6X, compass6Y);
        compass1 = rotatePoint(compass1, compassO, yaw);
        compass2 = rotatePoint(compass2, compassO, yaw);
        compass3 = rotatePoint(compass3, compassO, yaw);
        compass4 = rotatePoint(compass4, compassO, yaw);
        compass5 = rotatePoint(compass5, compassO, yaw);
        compass6 = rotatePoint(compass6, compassO, yaw);
        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(Color.RED);
        canvas3.drawCircle((float)compassO.getX(), (float)compassO.getY(), 20, paint);
        canvas3.drawCircle((float)compassO.getX(), (float)compassO.getY(), 40, paint);
        paint.setStyle(Paint.Style.FILL_AND_STROKE);
        paint.setColor(Color.BLUE);
        Path compassN = new Path();
        compassN.moveTo((float)compassO.getX(), (float)compassO.getY());
        compassN.lineTo((float)compass1.getX(), (float)compass1.getY());
        compassN.lineTo((float)compass2.getX(), (float)compass2.getY());
        compassN.lineTo((float)compass3.getX(), (float)compass3.getY());
        compassN.close();
        canvas3.drawPath(compassN, paint);
        paint.setColor(Color.RED);
        Path compassS = new Path();
        compassS.moveTo((float)compassO.getX(), (float)compassO.getY());
        compassS.lineTo((float)compass4.getX(), (float)compass4.getY());
        compassS.lineTo((float)compass5.getX(), (float)compass5.getY());
        compassS.lineTo((float)compass6.getX(), (float)compass6.getY());
        compassS.close();
        canvas3.drawPath(compassS, paint);
        // 指南针 -------------------------------------------
        if (osdHeading != null) {
            Path pathText = new Path();
            pathText.moveTo(10, 30);
            pathText.lineTo(700, 30);
            canvas3.drawTextOnPath(osdHeading, pathText, 0, 0, paint);//逆时针生成
        }
        if (osdRtkSpeed != null) {
            Path pathText = new Path();
            pathText.moveTo(10, 70);
            pathText.lineTo(700, 70);
            canvas3.drawTextOnPath(osdRtkSpeed, pathText, 0, 0, paint);//逆时针生成
        }
        base_x = 170;
        base_y = 350;
        scale_x=scale_y = 27;
        paint.setStyle(Paint.Style.FILL_AND_STROKE);
        paint.setColor(Color.BLUE);
//        canvas2.drawCircle((float) (base_x + (mainAnt.get(0) - min_x) * scale_x), (float) (base_y + (mainAnt.get(1) - min_y) * scale_y), 2, paint);
        canvas3.drawCircle((float) base_x, (float) base_y, 2, paint);
        if (gisCarModel != null){
            paint.setColor(Color.RED);
            Log.i(TAG,String.format("scalex=%d,scaley=%d,car[0][0]=%f,base_x=%f,base_y=%f",scale_x,scale_y,car[tire.get(0)][0],base_x,base_y));
            canvas3.drawCircle((float) (base_x + (car[tire.get(0)][0]) * scale_x), (float) (base_y + (car[tire.get(0)][1]) * scale_y), 2.5f, paint);
            canvas3.drawCircle((float) (base_x + (car[tire.get(1)][0]) * scale_x), (float) (base_y + (car[tire.get(1)][1]) * scale_y), 2.5f, paint);
            canvas3.drawCircle((float) (base_x + (car[tire.get(2)][0]) * scale_x), (float) (base_y + (car[tire.get(2)][1]) * scale_y), 2.5f, paint);
            canvas3.drawCircle((float) (base_x + (car[tire.get(3)][0]) * scale_x), (float) (base_y + (car[tire.get(3)][1]) * scale_y), 2.5f, paint);
            Path pathCanvs3 = new Path();
            pathCanvs3.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 i = 1; i < body.size(); i++){
//                    Log.d(TAG, "for 循环 DrawMap to X = " + (float) (base_x + (car[body.get(i)][0] - min_x) * scale_x)+ " Y = " + (float) (base_y + (car[body.get(i)][1] - min_y) * scale_y));
                Log.i(TAG,String.format("car[%d][0]=%f,to X =%f,car[%d][1]=%f,to Y=%f",i,car[body.get(i)][0],
                        (float) (base_x + (car[body.get(i)][0] - min_x) * scale_x),i,car[body.get(i)][1],(float) (base_y + (car[body.get(i)][1] - min_y) * scale_y)));
                pathCanvs3.lineTo((float) (base_x + (car[body.get(i)][0] - min_x) * scale_x), (float) (base_y + (car[body.get(i)][1] - min_y) * scale_y));
            }
            paint.setStyle(Paint.Style.STROKE);
            paint.setColor(Color.BLACK);
            pathCanvs3.close();
            canvas3.drawPath(pathCanvs3,paint);
        }
        Paint mPaint = new Paint();
        mPaint.setTextSize(20);
        mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
        osdMoveDirect="9.4345";
        if (osdMoveDirect != null) {
            Path pathText = new Path();
            pathText.moveTo(base_x-110, base_y-35);
            pathText.lineTo(base_x-20, base_y-35);
            if (leftDistance == 0.0){
                canvas3.drawTextOnPath("...", pathText, 0, 0, mPaint);//逆时针生成
            }else{
                canvas3.drawTextOnPath(String.valueOf(leftDistance), pathText, 0, 0, mPaint);//逆时针生成
            }
        }
        if (osdMoveDirect != null) {
            Path pathText = new Path();
            pathText.moveTo(base_x+30, base_y-35);
            pathText.lineTo(base_x+110, base_y-35);
            if (rightDistance == 0.0){
                canvas3.drawTextOnPath("...", pathText, 0, 0, mPaint);//逆时针生成
            }else{
                canvas3.drawTextOnPath(String.valueOf(rightDistance), pathText, 0, 0, mPaint);//逆时针生成
            }
        }
        paint.setColor(Color.RED);
        canvas3.drawLine(base_x-120,base_y-200,base_x-120,base_y+200,paint);
        canvas3.drawLine(base_x+120,base_y-200,base_x+120,base_y+200,paint);
        DrawArrows(canvas3,Color.GREEN,15f,base_x-20,base_y-30,base_x-120,base_y-30);//左边箭头(左边距
        DrawArrows(canvas3,Color.GREEN,15f,base_x+20,base_y-30,base_x+120,base_y-30);//右边箭头(边距
        // 提交画布
        Canvas canvas = holder.lockCanvas();
        if (canvas != null){
            canvas.drawBitmap(bmp2,0, 0, paint);
            holder.unlockCanvasAndPost(canvas);
        }
    }
    void DrawArrows(Canvas canvas, int color, float arrowSize, float x1,
                    float y1, float x2, float y2) {
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(color);
        // 画直线
        canvas.drawLine(x1, y1, x2, y2, paint);
        // 箭头中的第一条线的起点
        int x3 = 0;
        int y3 = 0;
        // 箭头中的第二条线的起点
        int x4 = 0;
        int y4 = 0;
        double awrad = Math.atan(3.5 / 8);
        double[] arrXY_1 = rotateVec(x2 - x1, y2 - y1, awrad, arrowSize);
        double[] arrXY_2 = rotateVec(x2 - x1, y2 - y1, -awrad, arrowSize);
        // 第一端点
        Double X3 = Double.valueOf(x2 - arrXY_1[0]);
        x3 = X3.intValue();
        Double Y3 = Double.valueOf(y2 - arrXY_1[1]);
        y3 = Y3.intValue();
        // 第二端点
        Double X4 = Double.valueOf(x2 - arrXY_2[0]);
        x4 = X4.intValue();
        Double Y4 = Double.valueOf(y2 - arrXY_2[1]);
        y4 = Y4.intValue();
        Path arrowsPath = new Path();
        arrowsPath.moveTo(x2, y2);
        arrowsPath.lineTo(x3, y3);
        arrowsPath.lineTo(x4, y4);
        arrowsPath.close();
        canvas.drawLine(x3, y3, x2, y2, paint);
        canvas.drawLine(x4, y4, x2, y2, paint);
    }
    private double[] rotateVec(float px, float py, double ang, double arrowSize) {
        double mathstr[] = new double[2];
        double vx = px * Math.cos(ang) - py * Math.sin(ang);
        double vy = px * Math.sin(ang) + py * Math.cos(ang);
        double d = Math.sqrt(vx * vx + vy * vy);
        vx = vx / d * arrowSize;
        vy = vy / d * arrowSize;
        mathstr[0] = vx;
        mathstr[1] = vy;
        return mathstr;
    }
    public PointF rotatePoint(PointF oldPoint, PointF centre, double degree) {
        PointF newPoint = new PointF(0, 0);
        newPoint.setX( (oldPoint.getX()-centre.getX())*Math.cos(Math.toRadians(degree)) - (oldPoint.getY()-centre.getY())*Math.sin(Math.toRadians(degree)) + centre.getX() );
        newPoint.setY ( (oldPoint.getX()-centre.getX())*Math.sin(Math.toRadians(degree)) + (oldPoint.getY()-centre.getY())*Math.cos(Math.toRadians(degree)) + centre.getY() );
        return newPoint;
    }
    class PointF {
        double x;
        double y;
        public PointF(double x, double y) {
            this.x = x;
            this.y = y;
        }
        double getX() {
            return x;
        }
        double getY() {
            return y;
        }
        void setX(double x) {
            this.x = x;
        }
        void setY(double y) {
            this.y = y;
        }
    }
    private void setupMap() {
        if (mMapView != null) {
@@ -249,7 +733,7 @@
            // create an empty map instance
            ArcGISMap map = new ArcGISMap();
            Log.i(TAG,String.format("map.getMiniScale=%f",map.getMinScale()));
            map.setMinScale(1000.0);
            map.setMinScale(400.0);
            // add map image layer as operational layer
            map.getOperationalLayers().add(mapImageLayer);
            mMapView.setMap(map);
@@ -313,8 +797,9 @@
    }
    private void readGisCar() {
        String carFilePath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+_mActivity.getPackageName()+"/lianfang_giscar.json";
        String carFilePath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+_mActivity.getPackageName()+"/gisvehiclemodel.json";
        if (TextUtils.isEmpty(carFilePath)){
            Toast.makeText(_mActivity, "车辆模型文件不存在", Toast.LENGTH_SHORT).show();
            MyLog.i (TAG, "GISCar车辆模型文件不存在");
            return ;
        }
@@ -322,6 +807,42 @@
        if (fileContentBytes !=null&&fileContentBytes.length>0){
            String buffer= new String(fileContentBytes);
            gisCarModel = new Gson().fromJson(buffer, GisCarModel.class);
//            line = 0;
//
//
//            List<Double> points = gisCarModel.getPoint();
//
//            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 = points.get(i);
//                    car[line][1] = value;
//                    line++;
//                }
//
//            }
//
//
//            List<Integer> tire1 = gisCarModel.getLeft_front_tire();
//            List<Integer> tire2 = gisCarModel.getRight_front_tire();
//            List<Integer> tire3 = gisCarModel.getLeft_rear_tire();
//            List<Integer> tire4 = gisCarModel.getRight_rear_tire();
//
//            body = gisCarModel.getBody();
//
//            tire = new ArrayList<>();
//
//
//            tire.add(tire1.get(0));
//            tire.add(tire2.get(0));
//            tire.add(tire3.get(0));
//            tire.add(tire4.get(0));
        }else{
            return;
        }
@@ -345,6 +866,7 @@
        if(gisCarModel== null){
            return;
        }
        long beginTime = System.currentTimeMillis();
@@ -566,6 +1088,8 @@
        queue.clear();
        CEventCenter.onBindEvent(false,icEventListener, Constant.BIND_RTK_INFO_MAP);
        CEventCenter.onBindEvent(false,icEventListener1, Constant.BIND_EXAM_STATUS_TOPIC);
        CEventCenter.onBindEvent(false, speedListener, Constant.BIND_RTK_SPEED_TOPIC);
        CEventCenter.onBindEvent(false, icEventListenerCar, Constant.REAL_TIME_POS_CAR_TOPIC);
    }
@@ -575,6 +1099,59 @@
        super.onAttach(context);
        CEventCenter.onBindEvent(true,icEventListener,Constant.BIND_RTK_INFO_MAP);
        CEventCenter.onBindEvent(true,icEventListener1,Constant.BIND_EXAM_STATUS_TOPIC);
        CEventCenter.onBindEvent(true, speedListener, Constant.BIND_RTK_SPEED_TOPIC);
        CEventCenter.onBindEvent(true, icEventListenerCar, Constant.REAL_TIME_POS_CAR_TOPIC);
    }
    private long count =0;
    private long lastcount =0;
    private double gpsSpeed = 0;
    private double leftDistance = 0;
    private double rightDistance = 0;
    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;
            }
            if (msgCode == Constant.LEFT_RIGHT_DISTANCE){
                String str = (String)obj;
                count++;
                try {
                    JSONObject jsonObject = new JSONObject(str);
                    leftDistance = Utils.getdouble(jsonObject.getDouble("left"),3);
                    rightDistance = Utils.getdouble(jsonObject.getDouble("right"),3);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }
    };
    class MessageRemoteService{
        public int msgCode;
        public String json;
        public MessageRemoteService(int msgCode, Object obj) {
            this.json = (String) obj;
            this.msgCode = msgCode;
        }
    }
    private ICEventListener icEventListenerCar = new ICEventListener() {
        @Override
        public void onCEvent(String topic, final int msgCode, int resultCode, final Object obj) {
            producer.execute(new Runnable() {
                @Override
                public void run() {
                    queue1.offer(new MessageRemoteService(msgCode,obj));
                }
            });
        }
    };
}
app/src/main/java/safeluck/drive/evaluation/fragment/ArcGisMapFragmentMMPK.java
New file
@@ -0,0 +1,601 @@
package safeluck.drive.evaluation.fragment;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.anyun.basecommonlib.MyLog;
import com.esri.arcgisruntime.geometry.Point;
import com.esri.arcgisruntime.geometry.PointCollection;
import com.esri.arcgisruntime.geometry.Polygon;
import com.esri.arcgisruntime.geometry.Polyline;
import com.esri.arcgisruntime.geometry.SpatialReference;
import com.esri.arcgisruntime.layers.ArcGISMapImageLayer;
import com.esri.arcgisruntime.layers.ArcGISVectorTiledLayer;
import com.esri.arcgisruntime.loadable.LoadStatus;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.Basemap;
import com.esri.arcgisruntime.mapping.MobileMapPackage;
import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener;
import com.esri.arcgisruntime.mapping.view.Graphic;
import com.esri.arcgisruntime.mapping.view.GraphicsOverlay;
import com.esri.arcgisruntime.mapping.view.MapView;
import com.esri.arcgisruntime.symbology.SimpleFillSymbol;
import com.esri.arcgisruntime.symbology.SimpleLineSymbol;
import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol;
import com.google.gson.Gson;
import java.io.File;
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.DB.exam_status.ExamStatus;
import safeluck.drive.evaluation.R;
import safeluck.drive.evaluation.bean.ExamPlatformData;
import safeluck.drive.evaluation.bean.GisCarModel;
import safeluck.drive.evaluation.bean.RTKInfoBean;
import safeluck.drive.evaluation.cEventCenter.CEventCenter;
import safeluck.drive.evaluation.cEventCenter.ICEventListener;
import safeluck.drive.evaluation.util.CThreadPoolExecutor;
import safeluck.drive.evaluation.util.FileUtil;
import safeluck.drive.evaluation.util.Utils;
/**驾校信息UI
 * MyApplication2
 * Created by lzw on 2019/3/20. 11:22:39
 * 邮箱:632393724@qq.com
 * All Rights Saved! Chongqing AnYun Tech co. LTD
 */
public class ArcGisMapFragmentMMPK extends SupportFragment implements View.OnClickListener {
    private static final String TAG = ArcGisMapFragmentMMPK.class.getSimpleName();
    private static final int ENTER = 1;//进入 科二某个项目地图
    private LinkedBlockingQueue queue = new LinkedBlockingQueue(100);
    private ExecutorService consumer = Executors.newSingleThreadExecutor();
    private ExecutorService producer = Executors.newSingleThreadExecutor();
    SimpleLineSymbol lineSymbolGls = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.BLACK, 0.5f);
    PointCollection points = new PointCollection(SpatialReference.create(4544));
    private Gson gson = new Gson();
    private ICEventListener icEventListener = new ICEventListener() {
        @Override
        public void onCEvent(String topic, int msgCode, int resultCode, Object obj) {
                producer.execute(()->{
                    String json = (String)obj;
                    Log.i(TAG,String.format("当前线程号%d,json=%s",Thread.currentThread().getId(),json));
                    RTKInfoBean rtkInfoBean = gson.fromJson(json,RTKInfoBean.class);
                    queue.offer(rtkInfoBean);
                });
//                MyLog.i(TAG,"处理完11.时间="+Utils.formatTimeYYMMDDHHmmSSSSS(System.currentTimeMillis()));
        }
    };
    private ICEventListener icEventListener1 = new ICEventListener() {
        @Override
        public void onCEvent(String topic, int msgCode, int resultCode, Object obj) {
            if (msgCode==13){
                ExamStatus examStatus = (ExamStatus)obj;
                if (examStatus.getMap_id()>-1){
                    if (examStatus.getEnter()==ENTER){
                        MyLog.i(TAG,String.format("进入[%d] map",examStatus.getMap_id()));
                        double scale = mMapView.getMapScale();
                        mMapView.setViewpointScaleAsync(scale * 0.2*0.2);
                    }else{
                        MyLog.i(TAG,String.format("退出[%d] map",examStatus.getMap_id()));
                        double scale = mMapView.getMapScale();
                        mMapView.setViewpointScaleAsync(scale * 5*5);
                    }
                }
            }
        }
    };
    public static SupportFragment newInstance(String s){
        ArcGisMapFragmentMMPK jiaXiaoFragment = new ArcGisMapFragmentMMPK();
        Bundle bundle = new Bundle();
        bundle.putString("arcgis_url",s);
        jiaXiaoFragment.setArguments(bundle);
        return jiaXiaoFragment;
    }
    private MapView mMapView ;
    private static final int MSG_CAR = 100;
    double yaw = 0;
    GraphicsOverlay mGraphicsOverlay;
    GraphicsOverlay mGraphicsOverlay_body;
    private double startY = 428882,startX = 3291858;
    private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case MSG_CAR:
                    List<safeluck.drive.evaluation.bean.Point> newCarPoints = (List<safeluck.drive.evaluation.bean.Point>) msg.obj;
                    Log.i(TAG,"handle message newcarPoints.size="+newCarPoints.size());
                    drawGlses(newCarPoints,gisCarModel);
                    break;
            }
        }
    };
    PointCollection mPointCollection = new PointCollection(SpatialReference.create(4544));
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.layout_arc_gis,container,false);
        mMapView = view.findViewById(R.id.mapView);
        view.findViewById(R.id.btn_change_map).setOnClickListener(this);
        Log.i(TAG,String.format("当前线程号%d,json=%s",Thread.currentThread().getId(),"onCreateView"));
        url = getArguments().getString("arcgis_url");
        CThreadPoolExecutor.runInBackground(()->{
            readGisCar();
        });
        consumer.execute(new CalRunnable());
        setupMap();
//        addTrailheadsLayer();
        url = Environment.getExternalStorageDirectory().getAbsolutePath()+ File.separator+_mActivity.getPackageName()+"/shoufei0220.mmpk";
        Log.i(TAG,"url ========="+url);
        final MobileMapPackage mobileMapPackage = new MobileMapPackage(url);
        mobileMapPackage.loadAsync();
        mobileMapPackage.addDoneLoadingListener(()->{
            LoadStatus loadStatus = mobileMapPackage.getLoadStatus();
            if (loadStatus==LoadStatus.LOADED){
                List<ArcGISMap> mainArcGisMapL = mobileMapPackage.getMaps();
                ArcGISMap mainArcGismapMMPK = mainArcGisMapL.get(0);
                mMapView.setMap(mainArcGismapMMPK);
            }
        });
        return view;
    }
    RTKInfoBean rtkInfoBean;
    boolean flag = true;
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_change_map:
                if (ExamPlatformData.getInstance().getExamType()>ExamPlatformData.EXAM_TYPE_ChangKAO){
                    RoadDriveMapFragmentab jiaXiaoFragment = findFragment(RoadDriveMapFragmentab.class);
                    if (jiaXiaoFragment == null) {
                        jiaXiaoFragment = (RoadDriveMapFragmentab) RoadDriveMapFragmentab.newInstance();
                    }
                    startWithPop(jiaXiaoFragment);
                }else{
                    MapFragment jiaXiaoFragment = findFragment(MapFragment.class);
                    if (jiaXiaoFragment == null) {
                        jiaXiaoFragment = (MapFragment) MapFragment.newInstance();
                    }
                    startWithPop(jiaXiaoFragment);
                }
                break;
        }
    }
    class CalRunnable implements Runnable{
        @Override
        public void run() {
            while (flag){
                rtkInfoBean = (RTKInfoBean)queue.poll();
                if (rtkInfoBean != null){
                    Log.i(TAG,String.format("取出一个,queue.size=%d,rtkinfo=%s,线程号=%d",queue.size(),rtkInfoBean.toString(),Thread.currentThread().getId()));
                    yaw = rtkInfoBean.getHeading();
                    startX = rtkInfoBean.getCoord_y();
                    startY = rtkInfoBean.getCoord_x();
                    if (mMapView != null){
                        mMapView.setViewpointRotationAsync(rtkInfoBean.getHeading());
                    }
                addGraphicLayer(yaw,startX,startY);
                }
            }
        }
    }
    private void setupMap() {
        if (mMapView != null) {
            mGraphicsOverlay = addGraphicsOverlay(mMapView);
        }
    }
String url ;
    private void addTrailheadsLayer() {
        if (!TextUtils.isEmpty(url)){
            Log.i(TAG,"map_url="+url);
            final ArcGISMapImageLayer mapImageLayer = new ArcGISMapImageLayer(url);
            // create an empty map instance
            ArcGISMap map = new ArcGISMap();
            Log.i(TAG,String.format("map.getMiniScale=%f",map.getMinScale()));
            map.setMinScale(1000.0);
            // add map image layer as operational layer
            map.getOperationalLayers().add(mapImageLayer);
            mMapView.setMap(map);
        }else{
            Toast.makeText(_mActivity, "url为空", Toast.LENGTH_SHORT).show();
        }
    }
    GisCarModel gisCarModel;
    boolean once =true;
    private void addGraphicLayer(double yaw,double x,double y){
        Log.i(TAG,"addgraphicLayer开始");
        long time = System.currentTimeMillis();
        if (gisCarModel != null){
            long  qudianTime = System.currentTimeMillis();
            List<safeluck.drive.evaluation.bean.Point> carNew =Utils.getCarPoint(0,yaw,new safeluck.drive.evaluation.bean.Point(x,y),gisCarModel);
            Log.i(TAG,String.format("取到点耗时=%d毫秒,线程号=%d",System.currentTimeMillis()-qudianTime,Thread.currentThread().getId()));
            if (carNew == null) return;
            if (once){
                Message message = Message.obtain();
                message.what = MSG_CAR;
                message.obj = carNew;
                mHandler.sendMessage(message);
            }
        }
        long period= System.currentTimeMillis()-time;
        Log.i(TAG,"执行addGraphicLayer方法,耗时="+period);
    }
    private GraphicsOverlay addGraphicsOverlay(MapView mapView){
        //create the graphics overlay
        GraphicsOverlay graphicsOverlay = new GraphicsOverlay();
        mGraphicsOverlay_body = new GraphicsOverlay();
        //add the overlay to the map view
        mapView.getGraphicsOverlays().add(mGraphicsOverlay_body);
        mapView.getGraphicsOverlays().add(graphicsOverlay);
        return graphicsOverlay;
    }
    private void readGisCar() {
        String carFilePath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+_mActivity.getPackageName()+"/gisvehiclemodel.json";
        if (TextUtils.isEmpty(carFilePath)){
            MyLog.i (TAG, "GISCar车辆模型文件不存在");
            Toast.makeText(_mActivity, "车辆模型文件不存在", Toast.LENGTH_SHORT).show();
            return ;
        }
        byte[] fileContentBytes= FileUtil.readFile(carFilePath);
        if (fileContentBytes !=null&&fileContentBytes.length>0){
            String buffer= new String(fileContentBytes);
            gisCarModel = new Gson().fromJson(buffer, GisCarModel.class);
        }else{
            return;
        }
    }
    PointCollection points1 = new PointCollection(SpatialReference.create(4544));
    PointCollection points2 = new PointCollection(SpatialReference.create(4544));
    PointCollection points3 = new PointCollection(SpatialReference.create(4544));
    PointCollection points4 = new PointCollection(SpatialReference.create(4544));
    SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.rgb(232,0,0), 0.5f);
    SimpleFillSymbol simpleFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.argb(255,232,0,0), lineSymbol);
    SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.WHITE, 5);
    SimpleFillSymbol simpleFillSymbolGls = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.argb(255,0,0,0), lineSymbolGls);
    private void drawGlses(List<safeluck.drive.evaluation.bean.Point> carNew,  GisCarModel gisCarModel) {
        if(gisCarModel== null){
            return;
        }
        long beginTime = System.currentTimeMillis();
/**==============================car body=========================================*/
        List<Integer> bodys =gisCarModel.getBody();
        points.clear();
        for (int i = 0; i <bodys.size(); i++) {
            points.add(carNew.get(bodys.get(i)).getX(),carNew.get(bodys.get(i)).getY());
        }
        Polygon polygon = new Polygon(points);
        Graphic graphic = new Graphic(polygon,simpleFillSymbol);
        /**===============================car body end========================================*/
/**==============================画天线=========================================*/
//        Graphic graphicAnt = new Graphic(new Point(startX,startY), simpleMarkerSymbol);
        /**==============================画天线结束 END=========================================*/
        List<Integer> leftCenterGls = gisCarModel.getLeft_center_glass();
        points1.clear();
        for (int i = 0; i < leftCenterGls.size(); i++) {
            int pos = leftCenterGls.get(i);
            points1.add(carNew.get(pos).getX(), carNew.get(pos).getY());
        }
        List<Integer> rightCenterGls = gisCarModel.getRight_center_glass();
        points2.clear();
        for (int i = 0; i < rightCenterGls.size(); i++) {
            int pos = rightCenterGls.get(i);
            points2.add(carNew.get(pos).getX(), carNew.get(pos).getY());
        }
                List<Integer> frontCLs = new ArrayList<>();
        frontCLs.addAll(gisCarModel.getLeft_front_glass());
        frontCLs.addAll(gisCarModel.getRight_front_glass());
        points3.clear();
        for (int i = 0; i < frontCLs.size(); i++) {
            int pos = frontCLs.get(i);
            points3.add(carNew.get(pos).getX(), carNew.get(pos).getY());
        }
                frontCLs.clear();
        frontCLs.addAll(gisCarModel.getLeft_rear_glass());
        frontCLs.addAll(gisCarModel.getRight_rear_glass());
        points4.clear();
        for (int i = 0; i < frontCLs.size(); i++) {
            int pos = frontCLs.get(i);
            points4.add(carNew.get(pos).getX(), carNew.get(pos).getY());
        }
        Polygon polygon1 = new Polygon(points1);
        Polygon polygon2 = new Polygon(points2);
        Polygon polygon3 = new Polygon(points3);
        Polygon polygon4 = new Polygon(points4);
        //create graphics
        Graphic buoyGraphic1 = new Graphic(polygon1, simpleFillSymbolGls);
        Graphic buoyGraphic2 = new Graphic(polygon2, simpleFillSymbolGls);
        Graphic buoyGraphic3 = new Graphic(polygon3, simpleFillSymbolGls);
        Graphic buoyGraphic4 = new Graphic(polygon4, simpleFillSymbolGls);
        //add the graphics to the graphics overlay
        /**==============================清除GraphicsOverlay上所有graphic=========================================*/
        long clearTime = System.currentTimeMillis();
        mGraphicsOverlay.getGraphics().clear();
        Log.i(TAG,"clear方法时间+"+(System.currentTimeMillis()-clearTime));
        /**==============================清除GraphicsOverlay上所有graphic   END=========================================*/
        mGraphicsOverlay.getGraphics().add(buoyGraphic1);
        mGraphicsOverlay.getGraphics().add(buoyGraphic2);
        mGraphicsOverlay.getGraphics().add(buoyGraphic3);
        mGraphicsOverlay.getGraphics().add(buoyGraphic4);
        mGraphicsOverlay_body.getGraphics().clear();
        mGraphicsOverlay_body.getGraphics().add(graphic);
//        mGraphicsOverlay.getGraphics().add(graphicAnt);
        Log.i(TAG,"GraphicsOverLay add graphic完成"+(System.currentTimeMillis()-beginTime));
        if (mMapView != null){
            mMapView.setViewpointCenterAsync(new Point(startX,startY));
        }
    }
    /**
     * 绘制面
     */
    private void drawPolygon() {
//        List<Point> points = new ArrayList<>();
//        points.add(new Point(21.21,21.32, SpatialReference.create("4544")));
//        PointCollection pointCollection = new PointCollection(points);
        mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(_mActivity, mMapView) {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
                mGraphicsOverlay.getGraphics().clear();
                Point point = mMapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())));
                mPointCollection.add(point);
                Polygon polygon = new Polygon(mPointCollection);
                if (mPointCollection.size() == 1) {
                    SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10);
                    Graphic pointGraphic = new Graphic(point, simpleMarkerSymbol);
                    mGraphicsOverlay.getGraphics().add(pointGraphic);
                }
                SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.GREEN, 3.0f);
                SimpleFillSymbol simpleFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.parseColor("#33e97676"), lineSymbol);
                Graphic graphic = new Graphic(polygon, simpleFillSymbol);
                mGraphicsOverlay.getGraphics().add(graphic);
                return super.onSingleTapConfirmed(e);
            }
        });
    }
    /**
     * 绘制点
     */
    private void drawPoint() {
        mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(_mActivity, mMapView) {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
                Point clickPoint = mMapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())));
                SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 20);
                Graphic graphic = new Graphic(clickPoint, simpleMarkerSymbol);
                //清除上一个点
                mGraphicsOverlay.getGraphics().clear();
                mGraphicsOverlay.getGraphics().add(graphic);
                //使用渲染器
                //                Graphic graphic1 = new Graphic(clickPoint);
                //                SimpleRenderer simpleRenderer = new SimpleRenderer(simpleMarkerSymbol);
                //                mGraphicsOverlay.setRenderer(simpleRenderer);
                //                mGraphicsOverlay.getGraphics().clear();
                //                mGraphicsOverlay.getGraphics().add(graphic1);
                return super.onSingleTapConfirmed(e);
            }
        });
    }
    /**
     * 绘制线
     */
    private void drawPolyline() {
        mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(_mActivity, mMapView) {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
                Point point = mMapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())));
                mPointCollection.add(point);
                Polyline polyline = new Polyline(mPointCollection);
                //点
                SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10);
                Graphic pointGraphic = new Graphic(point, simpleMarkerSymbol);
                mGraphicsOverlay.getGraphics().add(pointGraphic);
                //线
                SimpleLineSymbol simpleLineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.parseColor("#FC8145"), 3);
                Graphic graphic = new Graphic(polyline, simpleLineSymbol);
                mGraphicsOverlay.getGraphics().add(graphic);
                return super.onSingleTapConfirmed(e);
            }
        });
    }
    @Override
    public void onPause() {
        if (mMapView != null) {
            mMapView.pause();
        }
        super.onPause();
    }
    @Override
    public void onResume() {
        super.onResume();
        if (mMapView != null) {
            mMapView.resume();
        }
    }
    @Override
    public void onDetach() {
        super.onDetach();
        if (mMapView != null) {
            mMapView.dispose();
        }
        Log.i(TAG,"清空队列");
        flag = false;
        producer.shutdown();
        consumer .shutdown();
        queue.clear();
        CEventCenter.onBindEvent(false,icEventListener, Constant.BIND_RTK_INFO_MAP);
        CEventCenter.onBindEvent(false,icEventListener1, Constant.BIND_EXAM_STATUS_TOPIC);
    }
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        CEventCenter.onBindEvent(true,icEventListener,Constant.BIND_RTK_INFO_MAP);
        CEventCenter.onBindEvent(true,icEventListener1,Constant.BIND_EXAM_STATUS_TOPIC);
    }
}
app/src/main/java/safeluck/drive/evaluation/fragment/ArcGisMapFragmentVTPK.java
New file
@@ -0,0 +1,590 @@
package safeluck.drive.evaluation.fragment;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.anyun.basecommonlib.MyLog;
import com.esri.arcgisruntime.data.TileCache;
import com.esri.arcgisruntime.geometry.Point;
import com.esri.arcgisruntime.geometry.PointCollection;
import com.esri.arcgisruntime.geometry.Polygon;
import com.esri.arcgisruntime.geometry.Polyline;
import com.esri.arcgisruntime.geometry.SpatialReference;
import com.esri.arcgisruntime.layers.ArcGISMapImageLayer;
import com.esri.arcgisruntime.layers.ArcGISTiledLayer;
import com.esri.arcgisruntime.layers.ArcGISVectorTiledLayer;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.Basemap;
import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener;
import com.esri.arcgisruntime.mapping.view.Graphic;
import com.esri.arcgisruntime.mapping.view.GraphicsOverlay;
import com.esri.arcgisruntime.mapping.view.MapView;
import com.esri.arcgisruntime.symbology.SimpleFillSymbol;
import com.esri.arcgisruntime.symbology.SimpleLineSymbol;
import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol;
import com.google.gson.Gson;
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.DB.exam_status.ExamStatus;
import safeluck.drive.evaluation.R;
import safeluck.drive.evaluation.bean.ExamPlatformData;
import safeluck.drive.evaluation.bean.GisCarModel;
import safeluck.drive.evaluation.bean.RTKInfoBean;
import safeluck.drive.evaluation.cEventCenter.CEventCenter;
import safeluck.drive.evaluation.cEventCenter.ICEventListener;
import safeluck.drive.evaluation.util.CThreadPoolExecutor;
import safeluck.drive.evaluation.util.FileUtil;
import safeluck.drive.evaluation.util.Utils;
/**驾校信息UI
 * MyApplication2
 * Created by lzw on 2019/3/20. 11:22:39
 * 邮箱:632393724@qq.com
 * All Rights Saved! Chongqing AnYun Tech co. LTD
 */
public class ArcGisMapFragmentVTPK extends SupportFragment implements View.OnClickListener {
    private static final String TAG = ArcGisMapFragmentVTPK.class.getSimpleName();
    private static final int ENTER = 1;//进入 科二某个项目地图
    private LinkedBlockingQueue queue = new LinkedBlockingQueue(100);
    private ExecutorService consumer = Executors.newSingleThreadExecutor();
    private ExecutorService producer = Executors.newSingleThreadExecutor();
    SimpleLineSymbol lineSymbolGls = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.BLACK, 0.5f);
    PointCollection points = new PointCollection(SpatialReference.create(4544));
    private Gson gson = new Gson();
    private ICEventListener icEventListener = new ICEventListener() {
        @Override
        public void onCEvent(String topic, int msgCode, int resultCode, Object obj) {
                producer.execute(()->{
                    String json = (String)obj;
                    Log.i(TAG,String.format("当前线程号%d,json=%s",Thread.currentThread().getId(),json));
                    RTKInfoBean rtkInfoBean = gson.fromJson(json,RTKInfoBean.class);
                    queue.offer(rtkInfoBean);
                });
//                MyLog.i(TAG,"处理完11.时间="+Utils.formatTimeYYMMDDHHmmSSSSS(System.currentTimeMillis()));
        }
    };
    private ICEventListener icEventListener1 = new ICEventListener() {
        @Override
        public void onCEvent(String topic, int msgCode, int resultCode, Object obj) {
            if (msgCode==13){
                ExamStatus examStatus = (ExamStatus)obj;
                if (examStatus.getMap_id()>-1){
                    if (examStatus.getEnter()==ENTER){
                        MyLog.i(TAG,String.format("进入[%d] map",examStatus.getMap_id()));
                        double scale = mMapView.getMapScale();
                        mMapView.setViewpointScaleAsync(scale * 0.2*0.2);
                    }else{
                        MyLog.i(TAG,String.format("退出[%d] map",examStatus.getMap_id()));
                        double scale = mMapView.getMapScale();
                        mMapView.setViewpointScaleAsync(scale * 5*5);
                    }
                }
            }
        }
    };
    public static SupportFragment newInstance(String s){
        ArcGisMapFragmentVTPK jiaXiaoFragment = new ArcGisMapFragmentVTPK();
        Bundle bundle = new Bundle();
        bundle.putString("arcgis_url",s);
        jiaXiaoFragment.setArguments(bundle);
        return jiaXiaoFragment;
    }
    private MapView mMapView ;
    private static final int MSG_CAR = 100;
    double yaw = 0;
    GraphicsOverlay mGraphicsOverlay;
    GraphicsOverlay mGraphicsOverlay_body;
    private double startY = 428882,startX = 3291858;
    private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case MSG_CAR:
                    List<safeluck.drive.evaluation.bean.Point> newCarPoints = (List<safeluck.drive.evaluation.bean.Point>) msg.obj;
                    Log.i(TAG,"handle message newcarPoints.size="+newCarPoints.size());
                    drawGlses(newCarPoints,gisCarModel);
                    break;
            }
        }
    };
    PointCollection mPointCollection = new PointCollection(SpatialReference.create(4544));
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.layout_arc_gis,container,false);
        mMapView = view.findViewById(R.id.mapView);
        view.findViewById(R.id.btn_change_map).setOnClickListener(this);
        Log.i(TAG,String.format("当前线程号%d,json=%s",Thread.currentThread().getId(),"onCreateView"));
        url = getArguments().getString("arcgis_url");
        CThreadPoolExecutor.runInBackground(()->{
            readGisCar();
        });
        consumer.execute(new CalRunnable());
        setupMap();
//        addTrailheadsLayer();
        url = Environment.getExternalStorageDirectory().getAbsolutePath()+"/ArcGISTileVectorMine.vtpk";
        Log.i(TAG,"url ========="+url);
        ArcGISVectorTiledLayer arcGISTiledLayer = new ArcGISVectorTiledLayer (url);
        Basemap basemap = new Basemap(arcGISTiledLayer);
        ArcGISMap arcGISMap = new ArcGISMap(basemap);
        mMapView.setMap(arcGISMap);
        return view;
    }
    RTKInfoBean rtkInfoBean;
    boolean flag = true;
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btn_change_map:
                if (ExamPlatformData.getInstance().getExamType()>ExamPlatformData.EXAM_TYPE_ChangKAO){
                    RoadDriveMapFragmentab jiaXiaoFragment = findFragment(RoadDriveMapFragmentab.class);
                    if (jiaXiaoFragment == null) {
                        jiaXiaoFragment = (RoadDriveMapFragmentab) RoadDriveMapFragmentab.newInstance();
                    }
                    startWithPop(jiaXiaoFragment);
                }else{
                    MapFragment jiaXiaoFragment = findFragment(MapFragment.class);
                    if (jiaXiaoFragment == null) {
                        jiaXiaoFragment = (MapFragment) MapFragment.newInstance();
                    }
                    startWithPop(jiaXiaoFragment);
                }
                break;
        }
    }
    class CalRunnable implements Runnable{
        @Override
        public void run() {
            while (flag){
                rtkInfoBean = (RTKInfoBean)queue.poll();
                if (rtkInfoBean != null){
                    Log.i(TAG,String.format("取出一个,queue.size=%d,rtkinfo=%s,线程号=%d",queue.size(),rtkInfoBean.toString(),Thread.currentThread().getId()));
                    yaw = rtkInfoBean.getHeading();
                    startX = rtkInfoBean.getCoord_y();
                    startY = rtkInfoBean.getCoord_x();
                addGraphicLayer(yaw,startX,startY);
                }
            }
        }
    }
    private void setupMap() {
        if (mMapView != null) {
            mGraphicsOverlay = addGraphicsOverlay(mMapView);
        }
    }
String url ;
    private void addTrailheadsLayer() {
        if (!TextUtils.isEmpty(url)){
            Log.i(TAG,"map_url="+url);
            final ArcGISMapImageLayer mapImageLayer = new ArcGISMapImageLayer(url);
            // create an empty map instance
            ArcGISMap map = new ArcGISMap();
            Log.i(TAG,String.format("map.getMiniScale=%f",map.getMinScale()));
            map.setMinScale(1000.0);
            // add map image layer as operational layer
            map.getOperationalLayers().add(mapImageLayer);
            mMapView.setMap(map);
        }else{
            Toast.makeText(_mActivity, "url为空", Toast.LENGTH_SHORT).show();
        }
    }
    GisCarModel gisCarModel;
    boolean once =true;
    private void addGraphicLayer(double yaw,double x,double y){
        Log.i(TAG,"addgraphicLayer开始");
        long time = System.currentTimeMillis();
        if (gisCarModel != null){
            long  qudianTime = System.currentTimeMillis();
            List<safeluck.drive.evaluation.bean.Point> carNew =Utils.getCarPoint(0,yaw,new safeluck.drive.evaluation.bean.Point(x,y),gisCarModel);
            Log.i(TAG,String.format("取到点耗时=%d毫秒,线程号=%d",System.currentTimeMillis()-qudianTime,Thread.currentThread().getId()));
            if (carNew == null) return;
            if (once){
                Message message = Message.obtain();
                message.what = MSG_CAR;
                message.obj = carNew;
                mHandler.sendMessage(message);
            }
        }
        long period= System.currentTimeMillis()-time;
        Log.i(TAG,"执行addGraphicLayer方法,耗时="+period);
    }
    private GraphicsOverlay addGraphicsOverlay(MapView mapView){
        //create the graphics overlay
        GraphicsOverlay graphicsOverlay = new GraphicsOverlay();
        mGraphicsOverlay_body = new GraphicsOverlay();
        //add the overlay to the map view
        mapView.getGraphicsOverlays().add(mGraphicsOverlay_body);
        mapView.getGraphicsOverlays().add(graphicsOverlay);
        return graphicsOverlay;
    }
    private void readGisCar() {
        String carFilePath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+_mActivity.getPackageName()+"/giscar.json";
        if (TextUtils.isEmpty(carFilePath)){
            MyLog.i (TAG, "GISCar车辆模型文件不存在");
            return ;
        }
        byte[] fileContentBytes= FileUtil.readFile(carFilePath);
        if (fileContentBytes !=null&&fileContentBytes.length>0){
            String buffer= new String(fileContentBytes);
            gisCarModel = new Gson().fromJson(buffer, GisCarModel.class);
        }else{
            return;
        }
    }
    PointCollection points1 = new PointCollection(SpatialReference.create(4544));
    PointCollection points2 = new PointCollection(SpatialReference.create(4544));
    PointCollection points3 = new PointCollection(SpatialReference.create(4544));
    PointCollection points4 = new PointCollection(SpatialReference.create(4544));
    SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.rgb(232,0,0), 0.5f);
    SimpleFillSymbol simpleFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.argb(255,232,0,0), lineSymbol);
    SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.WHITE, 5);
    SimpleFillSymbol simpleFillSymbolGls = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.argb(255,0,0,0), lineSymbolGls);
    private void drawGlses(List<safeluck.drive.evaluation.bean.Point> carNew,  GisCarModel gisCarModel) {
        if(gisCarModel== null){
            return;
        }
        long beginTime = System.currentTimeMillis();
/**==============================car body=========================================*/
        List<Integer> bodys =gisCarModel.getBody();
        points.clear();
        for (int i = 0; i <bodys.size(); i++) {
            points.add(carNew.get(bodys.get(i)).getX(),carNew.get(bodys.get(i)).getY());
        }
        Polygon polygon = new Polygon(points);
        Graphic graphic = new Graphic(polygon,simpleFillSymbol);
        /**===============================car body end========================================*/
/**==============================画天线=========================================*/
//        Graphic graphicAnt = new Graphic(new Point(startX,startY), simpleMarkerSymbol);
        /**==============================画天线结束 END=========================================*/
        List<Integer> leftCenterGls = gisCarModel.getLeft_center_glass();
        points1.clear();
        for (int i = 0; i < leftCenterGls.size(); i++) {
            int pos = leftCenterGls.get(i);
            points1.add(carNew.get(pos).getX(), carNew.get(pos).getY());
        }
        List<Integer> rightCenterGls = gisCarModel.getRight_center_glass();
        points2.clear();
        for (int i = 0; i < leftCenterGls.size(); i++) {
            int pos = rightCenterGls.get(i);
            points2.add(carNew.get(pos).getX(), carNew.get(pos).getY());
        }
                List<Integer> frontCLs = new ArrayList<>();
        frontCLs.addAll(gisCarModel.getLeft_front_glass());
        frontCLs.addAll(gisCarModel.getRight_front_glass());
        points3.clear();
        for (int i = 0; i < frontCLs.size(); i++) {
            int pos = frontCLs.get(i);
            points3.add(carNew.get(pos).getX(), carNew.get(pos).getY());
        }
                frontCLs.clear();
        frontCLs.addAll(gisCarModel.getLeft_rear_glass());
        frontCLs.addAll(gisCarModel.getRight_rear_glass());
        points4.clear();
        for (int i = 0; i < frontCLs.size(); i++) {
            int pos = frontCLs.get(i);
            points4.add(carNew.get(pos).getX(), carNew.get(pos).getY());
        }
        Polygon polygon1 = new Polygon(points1);
        Polygon polygon2 = new Polygon(points2);
        Polygon polygon3 = new Polygon(points3);
        Polygon polygon4 = new Polygon(points4);
        //create graphics
        Graphic buoyGraphic1 = new Graphic(polygon1, simpleFillSymbolGls);
        Graphic buoyGraphic2 = new Graphic(polygon2, simpleFillSymbolGls);
        Graphic buoyGraphic3 = new Graphic(polygon3, simpleFillSymbolGls);
        Graphic buoyGraphic4 = new Graphic(polygon4, simpleFillSymbolGls);
        //add the graphics to the graphics overlay
        /**==============================清除GraphicsOverlay上所有graphic=========================================*/
        long clearTime = System.currentTimeMillis();
        mGraphicsOverlay.getGraphics().clear();
        Log.i(TAG,"clear方法时间+"+(System.currentTimeMillis()-clearTime));
        /**==============================清除GraphicsOverlay上所有graphic   END=========================================*/
        mGraphicsOverlay.getGraphics().add(buoyGraphic1);
        mGraphicsOverlay.getGraphics().add(buoyGraphic2);
        mGraphicsOverlay.getGraphics().add(buoyGraphic3);
        mGraphicsOverlay.getGraphics().add(buoyGraphic4);
        mGraphicsOverlay_body.getGraphics().clear();
        mGraphicsOverlay_body.getGraphics().add(graphic);
//        mGraphicsOverlay.getGraphics().add(graphicAnt);
        Log.i(TAG,"GraphicsOverLay add graphic完成"+(System.currentTimeMillis()-beginTime));
//        if (mMapView != null){
//            mMapView.setViewpointCenterAsync(new Point(startX,startY));
//        }
    }
    /**
     * 绘制面
     */
    private void drawPolygon() {
//        List<Point> points = new ArrayList<>();
//        points.add(new Point(21.21,21.32, SpatialReference.create("4544")));
//        PointCollection pointCollection = new PointCollection(points);
        mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(_mActivity, mMapView) {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
                mGraphicsOverlay.getGraphics().clear();
                Point point = mMapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())));
                mPointCollection.add(point);
                Polygon polygon = new Polygon(mPointCollection);
                if (mPointCollection.size() == 1) {
                    SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10);
                    Graphic pointGraphic = new Graphic(point, simpleMarkerSymbol);
                    mGraphicsOverlay.getGraphics().add(pointGraphic);
                }
                SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.GREEN, 3.0f);
                SimpleFillSymbol simpleFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.parseColor("#33e97676"), lineSymbol);
                Graphic graphic = new Graphic(polygon, simpleFillSymbol);
                mGraphicsOverlay.getGraphics().add(graphic);
                return super.onSingleTapConfirmed(e);
            }
        });
    }
    /**
     * 绘制点
     */
    private void drawPoint() {
        mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(_mActivity, mMapView) {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
                Point clickPoint = mMapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())));
                SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 20);
                Graphic graphic = new Graphic(clickPoint, simpleMarkerSymbol);
                //清除上一个点
                mGraphicsOverlay.getGraphics().clear();
                mGraphicsOverlay.getGraphics().add(graphic);
                //使用渲染器
                //                Graphic graphic1 = new Graphic(clickPoint);
                //                SimpleRenderer simpleRenderer = new SimpleRenderer(simpleMarkerSymbol);
                //                mGraphicsOverlay.setRenderer(simpleRenderer);
                //                mGraphicsOverlay.getGraphics().clear();
                //                mGraphicsOverlay.getGraphics().add(graphic1);
                return super.onSingleTapConfirmed(e);
            }
        });
    }
    /**
     * 绘制线
     */
    private void drawPolyline() {
        mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(_mActivity, mMapView) {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
                Point point = mMapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())));
                mPointCollection.add(point);
                Polyline polyline = new Polyline(mPointCollection);
                //点
                SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.RED, 10);
                Graphic pointGraphic = new Graphic(point, simpleMarkerSymbol);
                mGraphicsOverlay.getGraphics().add(pointGraphic);
                //线
                SimpleLineSymbol simpleLineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.parseColor("#FC8145"), 3);
                Graphic graphic = new Graphic(polyline, simpleLineSymbol);
                mGraphicsOverlay.getGraphics().add(graphic);
                return super.onSingleTapConfirmed(e);
            }
        });
    }
    @Override
    public void onPause() {
        if (mMapView != null) {
            mMapView.pause();
        }
        super.onPause();
    }
    @Override
    public void onResume() {
        super.onResume();
        if (mMapView != null) {
            mMapView.resume();
        }
    }
    @Override
    public void onDetach() {
        super.onDetach();
        if (mMapView != null) {
            mMapView.dispose();
        }
        Log.i(TAG,"清空队列");
        flag = false;
        producer.shutdown();
        consumer .shutdown();
        queue.clear();
        CEventCenter.onBindEvent(false,icEventListener, Constant.BIND_RTK_INFO_MAP);
        CEventCenter.onBindEvent(false,icEventListener1, Constant.BIND_EXAM_STATUS_TOPIC);
    }
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        CEventCenter.onBindEvent(true,icEventListener,Constant.BIND_RTK_INFO_MAP);
        CEventCenter.onBindEvent(true,icEventListener1,Constant.BIND_EXAM_STATUS_TOPIC);
    }
}
app/src/main/java/safeluck/drive/evaluation/httpmodule/HttpCarRespBean.java
@@ -3,6 +3,7 @@
import java.util.List;
public class HttpCarRespBean {
    /**
     * result : true
     * data : {"server":"gps.safeluck.com","port":"3301","gps_monitor_url":"https%3A%2F%2Ftrainsim.aaej.cn%2F%23%2Fvisitor%2Fmonitor%3Fdevice_id%3D0314200100000004%26area_type%3Dcar","map_json":{"left_front_tire":[9,10],"main_ant":[428984.9367,3291974.6021],"type":"car","body":[0,1,2,3,4,5,6,7,8,13,14,15,16,17,18,19,20,21],"ground_height":229.8357,"version":"0.1","point":[428984.1653,3291977.6796,428983.7684,3291977.5547,428983.498,3291977.0243,428983.5552,3291976.6508,428983.8355,3291975.483,428984.0438,3291974.7034,428984.1558,3291974.1226,428984.5245,3291973.295,428984.8693,3291973.2598,428983.5944,3291976.6639,428983.769,3291976.6702,428984.203,3291974.1338,428984.342,3291974.1803,428985.23,3291973.3175,428985.6473,3291973.4636,428985.8995,3291973.6719,428985.8234,3291974.5267,428985.6107,3291975.3336,428985.4377,3291976.0995,428985.1876,3291977.0475,428984.9813,3291977.5092,428984.5666,3291977.7383,428985.1356,3291977.0333,428984.9657,3291976.9994,428985.785,3291974.5007,428985.6423,3291974.4559],"axial":[0,13],"ant_pitch":0.081,"ant_height":231.2434,"right_front_tire":[22,23],"right_rear_tire":[24,25],"name":"涪陵交通驾校","left_rear_tire":[11,12]},"version":"0.1","pzh":"豫E8000测"}
@@ -237,4 +238,7 @@
            }
        }
    }
}
app/src/main/java/safeluck/drive/evaluation/httpmodule/HttpGisCarRespBean.java
New file
@@ -0,0 +1,538 @@
package safeluck.drive.evaluation.httpmodule;
import java.util.List;
public class HttpGisCarRespBean {
    /**
     * result : true
     * data : {"server":"gps.safeluck.com","port":"3301","gps_monitor_url":"https%3A%2F%2Ftrainsim.aaej.cn%2F%23%2Fvisitor%2Fmonitor%3Fdevice_id%3D0314200100000003%26area_type%3Dcar","map_json":{"left_front_tire":[12,13],"main_ant":[642214.3436,3270761.9102],"right_rear_glass":[58,59,60,61],"body":[0,1,2,3,4,5,6,7,8,9,10,11,32,33,34,35,36,37,38,39,40,41,42,43],"ground_height":331.6199,"type":"car","version":"1.0","point":[642216.5511,3270759.543,642216.7239,3270759.7759,642216.8133,3270759.8769,642216.859,3270760.3094,642216.7995,3270760.4553,642216.5513,3270760.7819,642216.242,3270761.0874,642215.5468,3270761.8527,642214.7732,3270762.7061,642214.483,3270762.97,642214.1131,3270763.2124,642213.7448,3270763.0632,642216.5364,3270760.7594,642216.4056,3270760.6352,642214.763,3270762.684,642214.6482,3270762.5763,642216.0948,3270760.559,642216.2863,3270760.9176,642215.5665,3270761.3672,642215.3224,3270761.075,642215.8444,3270760.2702,642216.0948,3270760.559,642216.1878,3270761.022,642214.5299,3270762.782,642214.7092,3270762.266,642215.5793,3270761.43,642213.9578,3270762.621,642214.4689,3270762.846,642214.6577,3270762.255,642214.3621,3270762.0998,642214.242,3270762.0047,642214.3621,3270762.0098,642213.4524,3270762.8314,642213.2324,3270762.5872,642213.0537,3270762.2115,642213.3048,3270761.7942,642213.5453,3270761.5047,642214.2823,3270760.7212,642215.0634,3270759.9012,642215.346,3270759.5816,642215.6092,3270759.3543,642215.7336,3270759.2982,642216.2033,3270759.2972,642216.3468,3270759.4079,642215.3611,3270759.6032,642215.4909,3270759.7158,642213.5608,3270761.519,642213.6874,3270761.6509,642213.4249,3270761.767,642215.0934,3270759.996,642214.7549,3270760.717,642213.9469,3270761.587,642215.0584,3270760.8537,642214.8047,3270760.7012,642215.1958,3270759.8877,642215.6907,3270760.1429,642215.8444,3270760.2702,642216.0948,3270760.559,642214.1323,3270761.8943,642213.9566,3270761.6397,642213.3781,3270761.8166,642213.5721,3270762.2307,642214.3621,3270762.0998],"ant_pitch":0.602,"axial":[0,32],"ant_height":333.0715,"left_rear_glass":[26,27,28,29],"right_front_tire":[44,45],"right_rear_tire":[46,47],"right_front_glass":[52,53,54,55],"name":"首飞驾校联芳车模型","left_rear_tire":[14,15],"left_front_glass":[16,17,18,19],"left_center_glass":[22,23,24,25],"right_center_glass":[48,49,50,51]},"version":"1.0","pzh":"豫E2000测"}
     */
    private boolean result;
    private DataBean data;
    public boolean isResult() {
        return result;
    }
    public void setResult(boolean result) {
        this.result = result;
    }
    public DataBean getData() {
        return data;
    }
    public void setData(DataBean data) {
        this.data = data;
    }
    public static class DataBean {
        /**
         * server : gps.safeluck.com
         * port : 3301
         * gps_monitor_url : https%3A%2F%2Ftrainsim.aaej.cn%2F%23%2Fvisitor%2Fmonitor%3Fdevice_id%3D0314200100000003%26area_type%3Dcar
         * map_json : {"left_front_tire":[12,13],"main_ant":[642214.3436,3270761.9102],"right_rear_glass":[58,59,60,61],"body":[0,1,2,3,4,5,6,7,8,9,10,11,32,33,34,35,36,37,38,39,40,41,42,43],"ground_height":331.6199,"type":"car","version":"1.0","point":[642216.5511,3270759.543,642216.7239,3270759.7759,642216.8133,3270759.8769,642216.859,3270760.3094,642216.7995,3270760.4553,642216.5513,3270760.7819,642216.242,3270761.0874,642215.5468,3270761.8527,642214.7732,3270762.7061,642214.483,3270762.97,642214.1131,3270763.2124,642213.7448,3270763.0632,642216.5364,3270760.7594,642216.4056,3270760.6352,642214.763,3270762.684,642214.6482,3270762.5763,642216.0948,3270760.559,642216.2863,3270760.9176,642215.5665,3270761.3672,642215.3224,3270761.075,642215.8444,3270760.2702,642216.0948,3270760.559,642216.1878,3270761.022,642214.5299,3270762.782,642214.7092,3270762.266,642215.5793,3270761.43,642213.9578,3270762.621,642214.4689,3270762.846,642214.6577,3270762.255,642214.3621,3270762.0998,642214.242,3270762.0047,642214.3621,3270762.0098,642213.4524,3270762.8314,642213.2324,3270762.5872,642213.0537,3270762.2115,642213.3048,3270761.7942,642213.5453,3270761.5047,642214.2823,3270760.7212,642215.0634,3270759.9012,642215.346,3270759.5816,642215.6092,3270759.3543,642215.7336,3270759.2982,642216.2033,3270759.2972,642216.3468,3270759.4079,642215.3611,3270759.6032,642215.4909,3270759.7158,642213.5608,3270761.519,642213.6874,3270761.6509,642213.4249,3270761.767,642215.0934,3270759.996,642214.7549,3270760.717,642213.9469,3270761.587,642215.0584,3270760.8537,642214.8047,3270760.7012,642215.1958,3270759.8877,642215.6907,3270760.1429,642215.8444,3270760.2702,642216.0948,3270760.559,642214.1323,3270761.8943,642213.9566,3270761.6397,642213.3781,3270761.8166,642213.5721,3270762.2307,642214.3621,3270762.0998],"ant_pitch":0.602,"axial":[0,32],"ant_height":333.0715,"left_rear_glass":[26,27,28,29],"right_front_tire":[44,45],"right_rear_tire":[46,47],"right_front_glass":[52,53,54,55],"name":"首飞驾校联芳车模型","left_rear_tire":[14,15],"left_front_glass":[16,17,18,19],"left_center_glass":[22,23,24,25],"right_center_glass":[48,49,50,51]}
         * version : 1.0
         * pzh : 豫E2000测
         */
        private String server;
        private String port;
        private String gps_monitor_url;
        private MapJsonBean map_json;
        private String version;
        private String pzh;
        public String getServer() {
            return server;
        }
        public void setServer(String server) {
            this.server = server;
        }
        public String getPort() {
            return port;
        }
        public void setPort(String port) {
            this.port = port;
        }
        public String getGps_monitor_url() {
            return gps_monitor_url;
        }
        public void setGps_monitor_url(String gps_monitor_url) {
            this.gps_monitor_url = gps_monitor_url;
        }
        public MapJsonBean getMap_json() {
            return map_json;
        }
        public void setMap_json(MapJsonBean map_json) {
            this.map_json = map_json;
        }
        public String getVersion() {
            return version;
        }
        public void setVersion(String version) {
            this.version = version;
        }
        public String getPzh() {
            return pzh;
        }
        public void setPzh(String pzh) {
            this.pzh = pzh;
        }
        public static class MapJsonBean {
            /**
             * left_front_tire : [12,13]
             * main_ant : [642214.3436,3270761.9102]
             * right_rear_glass : [58,59,60,61]
             * body : [0,1,2,3,4,5,6,7,8,9,10,11,32,33,34,35,36,37,38,39,40,41,42,43]
             * ground_height : 331.6199
             * type : car
             * version : 1.0
             * point : [642216.5511,3270759.543,642216.7239,3270759.7759,642216.8133,3270759.8769,642216.859,3270760.3094,642216.7995,3270760.4553,642216.5513,3270760.7819,642216.242,3270761.0874,642215.5468,3270761.8527,642214.7732,3270762.7061,642214.483,3270762.97,642214.1131,3270763.2124,642213.7448,3270763.0632,642216.5364,3270760.7594,642216.4056,3270760.6352,642214.763,3270762.684,642214.6482,3270762.5763,642216.0948,3270760.559,642216.2863,3270760.9176,642215.5665,3270761.3672,642215.3224,3270761.075,642215.8444,3270760.2702,642216.0948,3270760.559,642216.1878,3270761.022,642214.5299,3270762.782,642214.7092,3270762.266,642215.5793,3270761.43,642213.9578,3270762.621,642214.4689,3270762.846,642214.6577,3270762.255,642214.3621,3270762.0998,642214.242,3270762.0047,642214.3621,3270762.0098,642213.4524,3270762.8314,642213.2324,3270762.5872,642213.0537,3270762.2115,642213.3048,3270761.7942,642213.5453,3270761.5047,642214.2823,3270760.7212,642215.0634,3270759.9012,642215.346,3270759.5816,642215.6092,3270759.3543,642215.7336,3270759.2982,642216.2033,3270759.2972,642216.3468,3270759.4079,642215.3611,3270759.6032,642215.4909,3270759.7158,642213.5608,3270761.519,642213.6874,3270761.6509,642213.4249,3270761.767,642215.0934,3270759.996,642214.7549,3270760.717,642213.9469,3270761.587,642215.0584,3270760.8537,642214.8047,3270760.7012,642215.1958,3270759.8877,642215.6907,3270760.1429,642215.8444,3270760.2702,642216.0948,3270760.559,642214.1323,3270761.8943,642213.9566,3270761.6397,642213.3781,3270761.8166,642213.5721,3270762.2307,642214.3621,3270762.0998]
             * ant_pitch : 0.602
             * axial : [0,32]
             * ant_height : 333.0715
             * left_rear_glass : [26,27,28,29]
             * right_front_tire : [44,45]
             * right_rear_tire : [46,47]
             * right_front_glass : [52,53,54,55]
             * name : 首飞驾校联芳车模型
             * left_rear_tire : [14,15]
             * left_front_glass : [16,17,18,19]
             * left_center_glass : [22,23,24,25]
             * right_center_glass : [48,49,50,51]
             */
            private double ground_height;
            private String type;
            private String version;
            private double ant_pitch;
            private double ant_height;
            private String name;
            private List<Double> left_front_tire;
            private List<Double> main_ant;
            private List<Double> right_rear_glass;
            private List<Double> body;
            private List<Double> point;
            private List<Double> axial;
            private List<Double> left_rear_glass;
            private List<Double> right_front_tire;
            private List<Double> right_rear_tire;
            private List<Double> right_front_glass;
            private List<Double> left_rear_tire;
            private List<Double> left_front_glass;
            private List<Double> left_center_glass;
            private List<Double> right_center_glass;
            public double getGround_height() {
                return ground_height;
            }
            public void setGround_height(double ground_height) {
                this.ground_height = ground_height;
            }
            public String getType() {
                return type;
            }
            public void setType(String type) {
                this.type = type;
            }
            public String getVersion() {
                return version;
            }
            public void setVersion(String version) {
                this.version = version;
            }
            public double getAnt_pitch() {
                return ant_pitch;
            }
            public void setAnt_pitch(double ant_pitch) {
                this.ant_pitch = ant_pitch;
            }
            public double getAnt_height() {
                return ant_height;
            }
            public void setAnt_height(double ant_height) {
                this.ant_height = ant_height;
            }
            public String getName() {
                return name;
            }
            public void setName(String name) {
                this.name = name;
            }
            public List<Double> getLeft_front_tire() {
                return left_front_tire;
            }
            public void setLeft_front_tire(List<Double> left_front_tire) {
                this.left_front_tire = left_front_tire;
            }
            public List<Double> getMain_ant() {
                return main_ant;
            }
            public void setMain_ant(List<Double> main_ant) {
                this.main_ant = main_ant;
            }
            public List<Double> getRight_rear_glass() {
                return right_rear_glass;
            }
            public void setRight_rear_glass(List<Double> right_rear_glass) {
                this.right_rear_glass = right_rear_glass;
            }
            public List<Double> getBody() {
                return body;
            }
            public void setBody(List<Double> body) {
                this.body = body;
            }
            public List<Double> getPoint() {
                return point;
            }
            public void setPoint(List<Double> point) {
                this.point = point;
            }
            public List<Double> getAxial() {
                return axial;
            }
            public void setAxial(List<Double> axial) {
                this.axial = axial;
            }
            public List<Double> getLeft_rear_glass() {
                return left_rear_glass;
            }
            public void setLeft_rear_glass(List<Double> left_rear_glass) {
                this.left_rear_glass = left_rear_glass;
            }
            public List<Double> getRight_front_tire() {
                return right_front_tire;
            }
            public void setRight_front_tire(List<Double> right_front_tire) {
                this.right_front_tire = right_front_tire;
            }
            public List<Double> getRight_rear_tire() {
                return right_rear_tire;
            }
            public void setRight_rear_tire(List<Double> right_rear_tire) {
                this.right_rear_tire = right_rear_tire;
            }
            public List<Double> getRight_front_glass() {
                return right_front_glass;
            }
            public void setRight_front_glass(List<Double> right_front_glass) {
                this.right_front_glass = right_front_glass;
            }
            public List<Double> getLeft_rear_tire() {
                return left_rear_tire;
            }
            public void setLeft_rear_tire(List<Double> left_rear_tire) {
                this.left_rear_tire = left_rear_tire;
            }
            public List<Double> getLeft_front_glass() {
                return left_front_glass;
            }
            public void setLeft_front_glass(List<Double> left_front_glass) {
                this.left_front_glass = left_front_glass;
            }
            public List<Double> getLeft_center_glass() {
                return left_center_glass;
            }
            public void setLeft_center_glass(List<Double> left_center_glass) {
                this.left_center_glass = left_center_glass;
            }
            public List<Double> getRight_center_glass() {
                return right_center_glass;
            }
            public void setRight_center_glass(List<Double> right_center_glass) {
                this.right_center_glass = right_center_glass;
            }
        }
    }
//    /**
//     * result : true
//     * data : {"server":"gps.safeluck.com","port":"3301","gps_monitor_url":"https%3A%2F%2Ftrainsim.aaej.cn%2F%23%2Fvisitor%2Fmonitor%3Fdevice_id%3D0314200100000004%26area_type%3Dcar","map_json":{"left_front_tire":[9,10],"main_ant":[428984.9367,3291974.6021],"type":"car","body":[0,1,2,3,4,5,6,7,8,13,14,15,16,17,18,19,20,21],"ground_height":229.8357,"version":"0.1","point":[428984.1653,3291977.6796,428983.7684,3291977.5547,428983.498,3291977.0243,428983.5552,3291976.6508,428983.8355,3291975.483,428984.0438,3291974.7034,428984.1558,3291974.1226,428984.5245,3291973.295,428984.8693,3291973.2598,428983.5944,3291976.6639,428983.769,3291976.6702,428984.203,3291974.1338,428984.342,3291974.1803,428985.23,3291973.3175,428985.6473,3291973.4636,428985.8995,3291973.6719,428985.8234,3291974.5267,428985.6107,3291975.3336,428985.4377,3291976.0995,428985.1876,3291977.0475,428984.9813,3291977.5092,428984.5666,3291977.7383,428985.1356,3291977.0333,428984.9657,3291976.9994,428985.785,3291974.5007,428985.6423,3291974.4559],"axial":[0,13],"ant_pitch":0.081,"ant_height":231.2434,"right_front_tire":[22,23],"right_rear_tire":[24,25],"name":"涪陵交通驾校","left_rear_tire":[11,12]},"version":"0.1","pzh":"豫E8000测"}
//     */
//
//
//    private boolean result;
//    private DataBean data;
//
//    public boolean isResult() {
//        return result;
//    }
//
//    public void setResult(boolean result) {
//        this.result = result;
//    }
//
//    public DataBean getData() {
//        return data;
//    }
//
//    public void setData(DataBean data) {
//        this.data = data;
//    }
//
//    public static class DataBean {
//        /**
//         * server : gps.safeluck.com
//         * port : 3301
//         * map_json : {"axial":[0,12],"left_front_tire":[8,9],"main_ant":[-9151.5063,13030.5118],"right_front_tire":[20,21],"right_rear_tire":[22,23],"name":"科二场考车模型","left_rear_tire":[10,11],"type":"car","body":[0,1,2,3,4,5,6,7,12,13,14,15,16,17,18,19],"point":[-9149.6063,13033.0768,-9149.9978,13033.3124,-9150.3258,13033.3485,-9150.8341,13032.8985,-9151.7318,13031.6639,-9152.3573,13030.83,-9152.5214,13030.5639,-9152.602,13030.3105,-9150.8053,13032.8843,-9150.6537,13032.7602,-9152.3352,13030.8124,-9152.221,13030.7008,-9152.092,13029.7892,-9151.4638,13029.4333,-9151.2111,13029.568,-9150.9808,13029.8341,-9150.3546,13030.6796,-9149.458,13031.8642,-9149.1611,13032.4276,-9149.2827,13032.7653,-9149.4842,13031.8708,-9149.6176,13031.9937,-9151.0011,13029.8717,-9151.1367,13029.9878]}
//         * pzh : 豫E8000测
//         */
//
//        private String server;
//        private String port;
//        private String version;
//
//        public String getGps_monitor_url() {
//            return gps_monitor_url;
//        }
//
//        public void setGps_monitor_url(String gps_monitor_url) {
//            this.gps_monitor_url = gps_monitor_url;
//        }
//
//        private String gps_monitor_url;
//        private MapJsonBean map_json;
//        private String pzh;
//
//        public String getServer() {
//            return server;
//        }
//
//        public String getVersion() {
//            return version;
//        }
//
//        public void setVersion(String version) {
//            this.version = version;
//        }
//
//
//
//        public void setServer(String server) {
//            this.server = server;
//        }
//
//        public String getPort() {
//            return port;
//        }
//
//        public void setPort(String port) {
//            this.port = port;
//        }
//
//        public MapJsonBean getMap_json() {
//            return map_json;
//        }
//
//        public void setMap_json(MapJsonBean map_json) {
//            this.map_json = map_json;
//        }
//
//        public String getPzh() {
//            return pzh;
//        }
//
//        public void setPzh(String pzh) {
//            this.pzh = pzh;
//        }
//
//        public static class MapJsonBean {
//            /**
//             * axial : [0,12]
//             * left_front_tire : [8,9]
//             * main_ant : [-9151.5063,13030.5118]
//             * right_front_tire : [20,21]
//             * right_rear_tire : [22,23]
//             * name : 科二场考车模型
//             * left_rear_tire : [10,11]
//             * type : car
//             * body : [0,1,2,3,4,5,6,7,12,13,14,15,16,17,18,19]
//             * point : [-9149.6063,13033.0768,-9149.9978,13033.3124,-9150.3258,13033.3485,-9150.8341,13032.8985,-9151.7318,13031.6639,-9152.3573,13030.83,-9152.5214,13030.5639,-9152.602,13030.3105,-9150.8053,13032.8843,-9150.6537,13032.7602,-9152.3352,13030.8124,-9152.221,13030.7008,-9152.092,13029.7892,-9151.4638,13029.4333,-9151.2111,13029.568,-9150.9808,13029.8341,-9150.3546,13030.6796,-9149.458,13031.8642,-9149.1611,13032.4276,-9149.2827,13032.7653,-9149.4842,13031.8708,-9149.6176,13031.9937,-9151.0011,13029.8717,-9151.1367,13029.9878]
//             */
//
//            private String name;
//            private String type;
//            private List<Integer> axial;
//            private List<Integer> left_front_tire;
//            private List<Double> main_ant;
//            private List<Integer> right_front_tire;
//            private List<Integer> right_rear_tire;
//            private List<Integer> left_rear_tire;
//            private List<Integer> body;
//            private List<Double> point;
//
//    private double ground_height;
//    private String version;
//    private double ant_pitch;
//    private double ant_height;
//
//            public String getName() {
//                return name;
//            }
//
//            public void setName(String name) {
//                this.name = name;
//            }
//
//            public String getType() {
//                return type;
//            }
//
//            public void setType(String type) {
//                this.type = type;
//            }
//
//            public List<Integer> getAxial() {
//                return axial;
//            }
//
//
//    public double getGround_height() {
//        return ground_height;
//    }
//
//    public void setGround_height(double ground_height) {
//        this.ground_height = ground_height;
//    }
//
//    public String getVersion() {
//        return version;
//    }
//
//    public void setVersion(String version) {
//        this.version = version;
//    }
//
//    public double getAnt_pitch() {
//        return ant_pitch;
//    }
//
//    public void setAnt_pitch(double ant_pitch) {
//        this.ant_pitch = ant_pitch;
//    }
//
//    public double getAnt_height() {
//        return ant_height;
//    }
//
//    public void setAnt_height(double ant_height) {
//        this.ant_height = ant_height;
//    }
//            public void setAxial(List<Integer> axial) {
//                this.axial = axial;
//            }
//
//            public List<Integer> getLeft_front_tire() {
//                return left_front_tire;
//            }
//
//            public void setLeft_front_tire(List<Integer> left_front_tire) {
//                this.left_front_tire = left_front_tire;
//            }
//
//            public List<Double> getMain_ant() {
//                return main_ant;
//            }
//
//            public void setMain_ant(List<Double> main_ant) {
//                this.main_ant = main_ant;
//            }
//
//            public List<Integer> getRight_front_tire() {
//                return right_front_tire;
//            }
//
//            public void setRight_front_tire(List<Integer> right_front_tire) {
//                this.right_front_tire = right_front_tire;
//            }
//
//            public List<Integer> getRight_rear_tire() {
//                return right_rear_tire;
//            }
//
//            public void setRight_rear_tire(List<Integer> right_rear_tire) {
//                this.right_rear_tire = right_rear_tire;
//            }
//
//            public List<Integer> getLeft_rear_tire() {
//                return left_rear_tire;
//            }
//
//            public void setLeft_rear_tire(List<Integer> left_rear_tire) {
//                this.left_rear_tire = left_rear_tire;
//            }
//
//            public List<Integer> getBody() {
//                return body;
//            }
//
//            public void setBody(List<Integer> body) {
//                this.body = body;
//            }
//
//            public List<Double> getPoint() {
//                return point;
//            }
//
//            public void setPoint(List<Double> point) {
//                this.point = point;
//            }
//        }
//    }
}
app/src/main/java/safeluck/drive/evaluation/util/DataInit.kt
@@ -24,10 +24,7 @@
import safeluck.drive.evaluation.app
import safeluck.drive.evaluation.bean.*
import safeluck.drive.evaluation.bean.SimulateNightBean.QuestionBean
import safeluck.drive.evaluation.httpmodule.HttpCarRespBean
import safeluck.drive.evaluation.httpmodule.HttpRequetBean
import safeluck.drive.evaluation.httpmodule.HttpRoadMapRsp
import safeluck.drive.evaluation.httpmodule.HttpYardRsp
import safeluck.drive.evaluation.httpmodule.*
import safeluck.drive.evaluation.httpmodule.RetrofitCreator.Companion.getRestService
import safeluck.drive.evaluation.platformMessage.PlatFormConstant
import java.io.File
@@ -326,6 +323,7 @@
                        else ->{
                            mapInfoHead.type = BaseDataUIBean.TYPE_.car
                            val car = gson.fromJson<HttpCarRespBean>(str,HttpCarRespBean::class.java)
                            val gcar = gson.fromJson<HttpGisCarRespBean>(str, HttpGisCarRespBean::class.java)
//                        car.isResult = false
                            if (car.isResult){
                                if (car.data !=null){
@@ -337,8 +335,10 @@
//                                    Log.i(TAG, "解析之后的车模型=$str")
                                    CThreadPoolExecutor.runInBackground(Runnable{
                                        str = gson.toJson(car.data.map_json)
                                        var giscarStr = gson.toJson(gcar.data.map_json)
                                        MyLog.i(PlatFormConstant.HTTPTAG,"车辆模型保存成功")
                                        FileUtil.writeTxtFileToSD(app.getAppContext(),fileName,str,"")
                                        FileUtil.writeTxtFileToSD(app.getAppContext(),"gis"+fileName,giscarStr,"")
                                        sendVehicleInfo()
                                    })
app/src/main/res/layout/layout_arc_gis.xml
@@ -1,22 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
   >
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_height="match_parent"
    android:orientation="horizontal"
    android:layout_width="match_parent">
    <FrameLayout
        android:id="@+id/activity_main"
        android:layout_width="0dp"
        android:layout_height="match_parent"
      android:layout_weight="3"
        >
    <com.esri.arcgisruntime.mapping.view.MapView
        android:id="@+id/mapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </com.esri.arcgisruntime.mapping.view.MapView>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|left"
        android:id="@+id/btn_change_map"
        android:background="@drawable/btn_state_save"
        <com.esri.arcgisruntime.mapping.view.MapView
            android:id="@+id/mapView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            >
        </com.esri.arcgisruntime.mapping.view.MapView>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|left"
            android:id="@+id/btn_change_map"
            android:background="@drawable/btn_state_save"
        android:text="切换地图"/>
</FrameLayout>
            android:text="切换地图"/>
    </FrameLayout>
    <SurfaceView
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:id="@+id/surfaceview_arcgis"/>
</LinearLayout>