Merge branch 'master' of https://gitee.com/endian11/DriveJudge
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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); |
| | |
| | | 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(); |
| | |
| | | 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) { |
| | |
| | | |
| | | 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(()->{ |
| | |
| | | |
| | | }); |
| | | 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; |
| | | } |
| | | |
| | |
| | | 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); |
| | | |
| | | |
| | |
| | | |
| | | } |
| | | } |
| | | 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) { |
| | | |
| | |
| | | // 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); |
| | |
| | | } |
| | | 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 ; |
| | | } |
| | |
| | | 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; |
| | | } |
| | |
| | | if(gisCarModel== null){ |
| | | return; |
| | | } |
| | | |
| | | long beginTime = System.currentTimeMillis(); |
| | | |
| | | |
| | |
| | | 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); |
| | | |
| | | |
| | | } |
| | |
| | | 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)); |
| | | } |
| | | }); |
| | | |
| | | |
| | | } |
| | | }; |
| | | } |
New file |
| | |
| | | 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); |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | 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); |
| | | } |
| | | |
| | | } |
| | |
| | | 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测"} |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | } |
New file |
| | |
| | | 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; |
| | | // } |
| | | // } |
| | | // } |
| | | |
| | | |
| | | |
| | | } |
| | |
| | | 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 |
| | |
| | | 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){ |
| | |
| | | // 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() |
| | | }) |
| | | |
| | |
| | | <?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> |