From 3c918119be7003cab14019ace2ccdd183f95bb0a Mon Sep 17 00:00:00 2001 From: endian11 <Dana_Lee1016@126.com> Date: 星期二, 09 二月 2021 11:41:51 +0800 Subject: [PATCH] 上传移动地图包形式的fragment 和vtpk行驶的fragment --- app/src/main/java/safeluck/drive/evaluation/fragment/ArcGisMapFragmentMMPK.java | 600 ++++++++++++++++++++++++++++++ app/src/main/java/safeluck/drive/evaluation/fragment/ArcGisMapFragmentVTPK.java | 590 +++++++++++++++++++++++++++++ 2 files changed, 1,190 insertions(+), 0 deletions(-) diff --git a/app/src/main/java/safeluck/drive/evaluation/fragment/ArcGisMapFragmentMMPK.java b/app/src/main/java/safeluck/drive/evaluation/fragment/ArcGisMapFragmentMMPK.java new file mode 100644 index 0000000..6e19331 --- /dev/null +++ b/app/src/main/java/safeluck/drive/evaluation/fragment/ArcGisMapFragmentMMPK.java @@ -0,0 +1,600 @@ +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()+"/lianfang.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()+"/lianfang_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 < 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涓婃墍鏈塯raphic=========================================*/ + long clearTime = System.currentTimeMillis(); + + + mGraphicsOverlay.getGraphics().clear(); + Log.i(TAG,"clear鏂规硶鏃堕棿+"+(System.currentTimeMillis()-clearTime)); + /**==============================娓呴櫎GraphicsOverlay涓婃墍鏈塯raphic 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); + } + +} diff --git a/app/src/main/java/safeluck/drive/evaluation/fragment/ArcGisMapFragmentVTPK.java b/app/src/main/java/safeluck/drive/evaluation/fragment/ArcGisMapFragmentVTPK.java new file mode 100644 index 0000000..7e7d37c --- /dev/null +++ b/app/src/main/java/safeluck/drive/evaluation/fragment/ArcGisMapFragmentVTPK.java @@ -0,0 +1,590 @@ +package safeluck.drive.evaluation.fragment; + +import android.content.Context; +import android.graphics.Color; +import android.os.Bundle; +import android.os.Environment; +import android.os.Handler; +import android.os.Message; +import android.text.TextUtils; +import android.util.Log; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.anyun.basecommonlib.MyLog; +import com.esri.arcgisruntime.data.TileCache; +import com.esri.arcgisruntime.geometry.Point; +import com.esri.arcgisruntime.geometry.PointCollection; +import com.esri.arcgisruntime.geometry.Polygon; +import com.esri.arcgisruntime.geometry.Polyline; +import com.esri.arcgisruntime.geometry.SpatialReference; +import com.esri.arcgisruntime.layers.ArcGISMapImageLayer; +import com.esri.arcgisruntime.layers.ArcGISTiledLayer; +import com.esri.arcgisruntime.layers.ArcGISVectorTiledLayer; +import com.esri.arcgisruntime.mapping.ArcGISMap; +import com.esri.arcgisruntime.mapping.Basemap; +import com.esri.arcgisruntime.mapping.view.DefaultMapViewOnTouchListener; +import com.esri.arcgisruntime.mapping.view.Graphic; +import com.esri.arcgisruntime.mapping.view.GraphicsOverlay; +import com.esri.arcgisruntime.mapping.view.MapView; +import com.esri.arcgisruntime.symbology.SimpleFillSymbol; +import com.esri.arcgisruntime.symbology.SimpleLineSymbol; +import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol; +import com.google.gson.Gson; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.LinkedBlockingQueue; + +import me.yokeyword.fragmentation.SupportFragment; +import safeluck.drive.evaluation.Constant; +import safeluck.drive.evaluation.DB.exam_status.ExamStatus; +import safeluck.drive.evaluation.R; +import safeluck.drive.evaluation.bean.ExamPlatformData; +import safeluck.drive.evaluation.bean.GisCarModel; +import safeluck.drive.evaluation.bean.RTKInfoBean; +import safeluck.drive.evaluation.cEventCenter.CEventCenter; +import safeluck.drive.evaluation.cEventCenter.ICEventListener; +import safeluck.drive.evaluation.util.CThreadPoolExecutor; +import safeluck.drive.evaluation.util.FileUtil; +import safeluck.drive.evaluation.util.Utils; + +/**椹炬牎淇℃伅UI + * MyApplication2 + * Created by lzw on 2019/3/20. 11:22:39 + * 閭锛�632393724@qq.com + * All Rights Saved! Chongqing AnYun Tech co. LTD + */ +public class ArcGisMapFragmentVTPK extends SupportFragment implements View.OnClickListener { + + private static final String TAG = ArcGisMapFragmentVTPK.class.getSimpleName(); + private static final int ENTER = 1;//杩涘叆 绉戜簩鏌愪釜椤圭洰鍦板浘 + + private LinkedBlockingQueue queue = new LinkedBlockingQueue(100); + private ExecutorService consumer = Executors.newSingleThreadExecutor(); + private ExecutorService producer = Executors.newSingleThreadExecutor(); + SimpleLineSymbol lineSymbolGls = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.BLACK, 0.5f); + + + PointCollection points = new PointCollection(SpatialReference.create(4544)); + private Gson gson = new Gson(); + private ICEventListener icEventListener = new ICEventListener() { + @Override + public void onCEvent(String topic, int msgCode, int resultCode, Object obj) { + + + + + producer.execute(()->{ + String json = (String)obj; + Log.i(TAG,String.format("褰撳墠绾跨▼鍙�%d,json=%s",Thread.currentThread().getId(),json)); + RTKInfoBean rtkInfoBean = gson.fromJson(json,RTKInfoBean.class); + queue.offer(rtkInfoBean); + }); + +// MyLog.i(TAG,"澶勭悊瀹�11.鏃堕棿="+Utils.formatTimeYYMMDDHHmmSSSSS(System.currentTimeMillis())); + + + } + }; + private ICEventListener icEventListener1 = new ICEventListener() { + @Override + public void onCEvent(String topic, int msgCode, int resultCode, Object obj) { + if (msgCode==13){ + ExamStatus examStatus = (ExamStatus)obj; + if (examStatus.getMap_id()>-1){ + if (examStatus.getEnter()==ENTER){ + MyLog.i(TAG,String.format("杩涘叆[%d] map",examStatus.getMap_id())); + double scale = mMapView.getMapScale(); + mMapView.setViewpointScaleAsync(scale * 0.2*0.2); + }else{ + MyLog.i(TAG,String.format("閫�鍑篬%d] map",examStatus.getMap_id())); + double scale = mMapView.getMapScale(); + mMapView.setViewpointScaleAsync(scale * 5*5); + } + } + } + } + }; + + public static SupportFragment newInstance(String s){ + ArcGisMapFragmentVTPK jiaXiaoFragment = new ArcGisMapFragmentVTPK(); + Bundle bundle = new Bundle(); + bundle.putString("arcgis_url",s); + jiaXiaoFragment.setArguments(bundle); + return jiaXiaoFragment; + } + + + private MapView mMapView ; + private static final int MSG_CAR = 100; + double yaw = 0; + + GraphicsOverlay mGraphicsOverlay; + GraphicsOverlay mGraphicsOverlay_body; + private double startY = 428882,startX = 3291858; + private Handler mHandler = new Handler(){ + @Override + public void handleMessage(Message msg) { + switch (msg.what){ + case MSG_CAR: + + List<safeluck.drive.evaluation.bean.Point> newCarPoints = (List<safeluck.drive.evaluation.bean.Point>) msg.obj; + Log.i(TAG,"handle message newcarPoints.size="+newCarPoints.size()); + drawGlses(newCarPoints,gisCarModel); + + break; + } + } + }; + + PointCollection mPointCollection = new PointCollection(SpatialReference.create(4544)); + @Nullable + @Override + public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + + + View view = inflater.inflate(R.layout.layout_arc_gis,container,false); + mMapView = view.findViewById(R.id.mapView); + view.findViewById(R.id.btn_change_map).setOnClickListener(this); + Log.i(TAG,String.format("褰撳墠绾跨▼鍙�%d,json=%s",Thread.currentThread().getId(),"onCreateView")); + url = getArguments().getString("arcgis_url"); + CThreadPoolExecutor.runInBackground(()->{ + + readGisCar(); + + + }); + consumer.execute(new CalRunnable()); + + setupMap(); + + +// addTrailheadsLayer(); + + + + url = Environment.getExternalStorageDirectory().getAbsolutePath()+"/ArcGISTileVectorMine.vtpk"; + Log.i(TAG,"url ========="+url); + ArcGISVectorTiledLayer arcGISTiledLayer = new ArcGISVectorTiledLayer (url); + Basemap basemap = new Basemap(arcGISTiledLayer); + ArcGISMap arcGISMap = new ArcGISMap(basemap); + mMapView.setMap(arcGISMap); + + return view; + } + + + + RTKInfoBean rtkInfoBean; + boolean flag = true; + + @Override + public void onClick(View v) { + switch (v.getId()){ + case R.id.btn_change_map: + if (ExamPlatformData.getInstance().getExamType()>ExamPlatformData.EXAM_TYPE_ChangKAO){ + RoadDriveMapFragmentab jiaXiaoFragment = findFragment(RoadDriveMapFragmentab.class); + if (jiaXiaoFragment == null) { + jiaXiaoFragment = (RoadDriveMapFragmentab) RoadDriveMapFragmentab.newInstance(); + } + startWithPop(jiaXiaoFragment); + }else{ + MapFragment jiaXiaoFragment = findFragment(MapFragment.class); + if (jiaXiaoFragment == null) { + jiaXiaoFragment = (MapFragment) MapFragment.newInstance(); + } + startWithPop(jiaXiaoFragment); + } + + + break; + } + } + + class CalRunnable implements Runnable{ + + @Override + public void run() { + while (flag){ + + + rtkInfoBean = (RTKInfoBean)queue.poll(); + if (rtkInfoBean != null){ + Log.i(TAG,String.format("鍙栧嚭涓�涓紝queue.size=%d,rtkinfo=%s,绾跨▼鍙�=%d",queue.size(),rtkInfoBean.toString(),Thread.currentThread().getId())); + yaw = rtkInfoBean.getHeading(); + startX = rtkInfoBean.getCoord_y(); + startY = rtkInfoBean.getCoord_x(); + + + addGraphicLayer(yaw,startX,startY); + + + + } + + } + + } + } + + + + + + + + + private void setupMap() { + if (mMapView != null) { + + + mGraphicsOverlay = addGraphicsOverlay(mMapView); + + } + } +String url ; + private void addTrailheadsLayer() { + if (!TextUtils.isEmpty(url)){ + Log.i(TAG,"map_url="+url); + final ArcGISMapImageLayer mapImageLayer = new ArcGISMapImageLayer(url); + // create an empty map instance + ArcGISMap map = new ArcGISMap(); + Log.i(TAG,String.format("map.getMiniScale=%f",map.getMinScale())); + map.setMinScale(1000.0); + // add map image layer as operational layer + map.getOperationalLayers().add(mapImageLayer); + mMapView.setMap(map); + }else{ + Toast.makeText(_mActivity, "url涓虹┖", Toast.LENGTH_SHORT).show(); + } + + + + } + + + + GisCarModel gisCarModel; + boolean once =true; + private void addGraphicLayer(double yaw,double x,double y){ + Log.i(TAG,"addgraphicLayer寮�濮�"); + long time = System.currentTimeMillis(); + + + + if (gisCarModel != null){ + + + long qudianTime = System.currentTimeMillis(); + List<safeluck.drive.evaluation.bean.Point> carNew =Utils.getCarPoint(0,yaw,new safeluck.drive.evaluation.bean.Point(x,y),gisCarModel); + Log.i(TAG,String.format("鍙栧埌鐐硅�楁椂=%d姣,绾跨▼鍙�=%d",System.currentTimeMillis()-qudianTime,Thread.currentThread().getId())); + if (carNew == null) return; + if (once){ + Message message = Message.obtain(); + message.what = MSG_CAR; + + message.obj = carNew; + mHandler.sendMessage(message); + + } + + + + + + + } + + + long period= System.currentTimeMillis()-time; + Log.i(TAG,"鎵цaddGraphicLayer鏂规硶锛岃�楁椂="+period); + + + + } + + private GraphicsOverlay addGraphicsOverlay(MapView mapView){ + //create the graphics overlay + GraphicsOverlay graphicsOverlay = new GraphicsOverlay(); + mGraphicsOverlay_body = new GraphicsOverlay(); + //add the overlay to the map view + mapView.getGraphicsOverlays().add(mGraphicsOverlay_body); + mapView.getGraphicsOverlays().add(graphicsOverlay); + return graphicsOverlay; + } + private void readGisCar() { + + String carFilePath = Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+_mActivity.getPackageName()+"/giscar.json"; + if (TextUtils.isEmpty(carFilePath)){ + MyLog.i (TAG, "GISCar杞﹁締妯″瀷鏂囦欢涓嶅瓨鍦�"); + return ; + } + byte[] fileContentBytes= FileUtil.readFile(carFilePath); + if (fileContentBytes !=null&&fileContentBytes.length>0){ + String buffer= new String(fileContentBytes); + gisCarModel = new Gson().fromJson(buffer, GisCarModel.class); + }else{ + return; + } + + + } + + + + PointCollection points1 = new PointCollection(SpatialReference.create(4544)); + PointCollection points2 = new PointCollection(SpatialReference.create(4544)); + PointCollection points3 = new PointCollection(SpatialReference.create(4544)); + PointCollection points4 = new PointCollection(SpatialReference.create(4544)); + SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.rgb(232,0,0), 0.5f); + SimpleFillSymbol simpleFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.argb(255,232,0,0), lineSymbol); + + SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.WHITE, 5); + SimpleFillSymbol simpleFillSymbolGls = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.argb(255,0,0,0), lineSymbolGls); + private void drawGlses(List<safeluck.drive.evaluation.bean.Point> carNew, GisCarModel gisCarModel) { + + if(gisCarModel== null){ + return; + } + long beginTime = System.currentTimeMillis(); + + +/**==============================car body=========================================*/ + + List<Integer> bodys =gisCarModel.getBody(); + points.clear(); + for (int i = 0; i <bodys.size(); i++) { + points.add(carNew.get(bodys.get(i)).getX(),carNew.get(bodys.get(i)).getY()); + } + + Polygon polygon = new Polygon(points); + + Graphic graphic = new Graphic(polygon,simpleFillSymbol); + + + + /**===============================car body end========================================*/ + + +/**==============================鐢诲ぉ绾�=========================================*/ + + +// Graphic graphicAnt = new Graphic(new Point(startX,startY), simpleMarkerSymbol); + + /**==============================鐢诲ぉ绾跨粨鏉� END=========================================*/ + + + + List<Integer> leftCenterGls = gisCarModel.getLeft_center_glass(); + points1.clear(); + for (int i = 0; i < leftCenterGls.size(); i++) { + int pos = leftCenterGls.get(i); + points1.add(carNew.get(pos).getX(), carNew.get(pos).getY()); + + } + List<Integer> rightCenterGls = gisCarModel.getRight_center_glass(); + points2.clear(); + for (int i = 0; i < leftCenterGls.size(); i++) { + int pos = rightCenterGls.get(i); + points2.add(carNew.get(pos).getX(), carNew.get(pos).getY()); + + } + + + List<Integer> frontCLs = new ArrayList<>(); + frontCLs.addAll(gisCarModel.getLeft_front_glass()); + frontCLs.addAll(gisCarModel.getRight_front_glass()); + + + points3.clear(); + for (int i = 0; i < frontCLs.size(); i++) { + int pos = frontCLs.get(i); + points3.add(carNew.get(pos).getX(), carNew.get(pos).getY()); + + } + frontCLs.clear(); + frontCLs.addAll(gisCarModel.getLeft_rear_glass()); + frontCLs.addAll(gisCarModel.getRight_rear_glass()); + points4.clear(); + for (int i = 0; i < frontCLs.size(); i++) { + int pos = frontCLs.get(i); + points4.add(carNew.get(pos).getX(), carNew.get(pos).getY()); + + } + Polygon polygon1 = new Polygon(points1); + Polygon polygon2 = new Polygon(points2); + Polygon polygon3 = new Polygon(points3); + Polygon polygon4 = new Polygon(points4); + + + //create graphics + + Graphic buoyGraphic1 = new Graphic(polygon1, simpleFillSymbolGls); + Graphic buoyGraphic2 = new Graphic(polygon2, simpleFillSymbolGls); + Graphic buoyGraphic3 = new Graphic(polygon3, simpleFillSymbolGls); + Graphic buoyGraphic4 = new Graphic(polygon4, simpleFillSymbolGls); + //add the graphics to the graphics overlay + /**==============================娓呴櫎GraphicsOverlay涓婃墍鏈塯raphic=========================================*/ + long clearTime = System.currentTimeMillis(); + + + mGraphicsOverlay.getGraphics().clear(); + Log.i(TAG,"clear鏂规硶鏃堕棿+"+(System.currentTimeMillis()-clearTime)); + /**==============================娓呴櫎GraphicsOverlay涓婃墍鏈塯raphic 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); + } + +} -- Gitblit v1.8.0