yy1717
2020-07-06 e5659a16092dc90fd7b06f3659158ddae6e1edd3
app/src/main/java/safeluck/drive/evaluation/fragment/JiaXiaoFragment.java
@@ -1,16 +1,71 @@
package safeluck.drive.evaluation.fragment;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.esri.arcgisruntime.ArcGISRuntimeEnvironment;
import com.esri.arcgisruntime.arcgisservices.ArcGISMapServiceInfo;
import com.esri.arcgisruntime.data.ServiceFeatureTable;
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.geometry.SpatialReferences;
import com.esri.arcgisruntime.layers.ArcGISMapImageLayer;
import com.esri.arcgisruntime.layers.ArcGISMapImageSublayer;
import com.esri.arcgisruntime.layers.ArcGISSublayer;
import com.esri.arcgisruntime.layers.ArcGISTiledLayer;
import com.esri.arcgisruntime.layers.ArcGISVectorTiledLayer;
import com.esri.arcgisruntime.layers.FeatureLayer;
import com.esri.arcgisruntime.layers.MobileBasemapLayer;
import com.esri.arcgisruntime.layers.SublayerList;
import com.esri.arcgisruntime.loadable.LoadStatus;
import com.esri.arcgisruntime.loadable.LoadStatusChangedEvent;
import com.esri.arcgisruntime.loadable.LoadStatusChangedListener;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.Basemap;
import com.esri.arcgisruntime.mapping.Viewpoint;
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.portal.Portal;
import com.esri.arcgisruntime.portal.PortalItem;
import com.esri.arcgisruntime.symbology.LineSymbol;
import com.esri.arcgisruntime.symbology.SimpleFillSymbol;
import com.esri.arcgisruntime.symbology.SimpleLineSymbol;
import com.esri.arcgisruntime.symbology.SimpleMarkerSymbol;
import com.esri.arcgisruntime.util.ListenableList;
import com.google.gson.Gson;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import me.yokeyword.fragmentation.SupportFragment;
import safeluck.drive.evaluation.R;
import safeluck.drive.evaluation.app;
import safeluck.drive.evaluation.bean.GisCarModel;
import safeluck.drive.evaluation.util.CThreadPoolExecutor;
import safeluck.drive.evaluation.util.FileUtil;
import safeluck.drive.evaluation.util.Utils;
/**驾校信息UI
 * MyApplication2
@@ -22,13 +77,344 @@
    public static SupportFragment newInstance(){
        return new JiaXiaoFragment();
    }
    private static final String TAG = JiaXiaoFragment.class.getSimpleName();
    private MapView mMapView ;
    private static final int MSG_CAR = 100;
    double yaw = 0;
    GraphicsOverlay mGraphicsOverlay;
    private int count =0;
    private double startX = -8647.003,startY = 14590.7213;
    private Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case MSG_CAR:
                    count++;
                    yaw +=count;
                    addGraphicLayer(yaw,startX+count,startY+count);
                    sendEmptyMessageDelayed(MSG_CAR,1000);
                    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_jiaxiao_info,container,false);
        View view = inflater.inflate(R.layout.layout_arc_gis,container,false);
        mMapView = view.findViewById(R.id.mapView);
        setupMap();
        addTrailheadsLayer();
//        addImageLayer();
        mHandler.sendEmptyMessageDelayed(MSG_CAR,1000);
//        drawPolygon();
        return view;
    }
    private SublayerList mSublayersList;
    private void setupMap() {
        if (mMapView != null) {
            ArcGISMap map = new ArcGISMap();
            mMapView.setMap(map);
            mGraphicsOverlay= new GraphicsOverlay();
            mMapView.getGraphicsOverlays().add(mGraphicsOverlay);
        }
    }
    private void addTrailheadsLayer() {
        String url = "http://192.168.0.47:6080/arcgis/rest/services/%E5%9C%9F%E4%B8%BB%E8%80%83%E5%9C%BA/MapServer/";
        ArcGISMapImageLayer arcGISMapImageLayer = new ArcGISMapImageLayer(url);
        arcGISMapImageLayer.loadAsync();
        arcGISMapImageLayer.addLoadStatusChangedListener(loadStatusChangedEvent -> {
            if (loadStatusChangedEvent.getNewLoadStatus() == LoadStatus.LOADED){
                SublayerList tables = arcGISMapImageLayer.getSublayers();
                Log.i(TAG,"ServiceFeatureTables size = "+tables.size());
                for (int i = tables.size()-1; i >= 0; i--) {
        ServiceFeatureTable serviceFeatureTable = new ServiceFeatureTable(url+String.valueOf(i));
        FeatureLayer featureLayer = new FeatureLayer(serviceFeatureTable);
        ArcGISMap map = mMapView.getMap();
        map.getOperationalLayers().add(featureLayer);
    }
            }
        });
    }
    private void addGraphicLayer(double yaw,double x,double y){
        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);
        PointCollection points = new PointCollection(SpatialReference.create(4544));
        CThreadPoolExecutor.runInBackground(new Runnable() {
            @Override
            public void run() {
                StringBuffer buffer= FileUtil.readAssetTxtFile(app.getAppContext(),"giscar.json");
                Log.i(TAG,"giscar="+buffer.toString());
                GisCarModel gisCarModel= new Gson().fromJson(buffer.toString(),GisCarModel.class);
//                List<safeluck.drive.evaluation.bean.Point> carNew=Utils.getCarPoint(0,45,new safeluck.drive.evaluation.bean.Point(-8633.77199999988,14471.793700000271));
                List<safeluck.drive.evaluation.bean.Point> carNew=Utils.getCarPoint(0,yaw,new safeluck.drive.evaluation.bean.Point(x,y));
                List<Integer> bodys =gisCarModel.getBody();
                for (int i = 0; i <bodys.size(); i++) {
                    Log.i(TAG,String.format("车身点位置:%d",bodys.get(i)));
                    Log.i(TAG,"新坐标"+carNew.get(bodys.get(i)).getX()+" Y="+carNew.get(bodys.get(i)).getY());
                    points.add(carNew.get(bodys.get(i)).getX(),carNew.get(bodys.get(i)).getY());
                }
                CThreadPoolExecutor.runOnMainThread(new Runnable() {
                    @Override
                    public void run() {
                        Polygon polygon = new Polygon(points);
                        Graphic graphic = new Graphic(polygon,simpleFillSymbol);
                        mGraphicsOverlay.getGraphics().clear();
                        mGraphicsOverlay.getGraphics().add(graphic);
                        drawrightCenterGls(gisCarModel,carNew);
                        drawPoint(new Point(x,y));
                    }
                });
            }
        });
    }
    private void drawPoint(Point point) {
        SimpleMarkerSymbol simpleMarkerSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.CIRCLE, Color.WHITE, 5);
        Graphic graphic = new Graphic(point, simpleMarkerSymbol);
        mGraphicsOverlay.getGraphics().add(graphic);
    }
    private void drawrightCenterGls(GisCarModel gisCarModel, List<safeluck.drive.evaluation.bean.Point> carNew) {
        SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.SOLID, Color.BLACK, 0.5f);
        SimpleFillSymbol simpleFillSymbol = new SimpleFillSymbol(SimpleFillSymbol.Style.SOLID, Color.argb(255,0,0,0), lineSymbol);
        PointCollection points = new PointCollection(SpatialReference.create(4544));
        drawGlses(carNew, simpleFillSymbol, points, gisCarModel.getRight_center_glass());
        drawGlses(carNew, simpleFillSymbol, points, gisCarModel.getLeft_center_glass());
        List<Integer> frontCLs = new ArrayList<>();
        frontCLs.addAll(gisCarModel.getLeft_front_glass());
        frontCLs.addAll(gisCarModel.getRight_front_glass());
        drawGlses(carNew, simpleFillSymbol, points, frontCLs);
        frontCLs.clear();
        frontCLs.addAll(gisCarModel.getLeft_rear_glass());
        frontCLs.addAll(gisCarModel.getRight_rear_glass());
        drawGlses(carNew, simpleFillSymbol, points, frontCLs);
    }
    private void drawGlses(List<safeluck.drive.evaluation.bean.Point> carNew, SimpleFillSymbol simpleFillSymbol, PointCollection points, List<Integer> left_center_glass) {
        List<Integer> leftCenterGls = left_center_glass;
        points.clear();
        for (int i = 0; i < leftCenterGls.size(); i++) {
            int pos = leftCenterGls.get(i);
            points.add(carNew.get(pos).getX(), carNew.get(pos).getY());
        }
        Polygon polygon1 = new Polygon(points);
        Graphic graphic1 = new Graphic(polygon1, simpleFillSymbol);
        mGraphicsOverlay.getGraphics().add(graphic1);
    }
    /**
     * 绘制面
     */
    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);
            }
        });
    }
private void addImageLayer(){
            String url = "http://192.168.0.47:6080/arcgis/rest/services/%E5%9C%9F%E4%B8%BB%E8%80%83%E5%9C%BA/MobileServer";
    // create a MapImageLayer with dynamically generated map images
    final ArcGISMapImageLayer mapImageLayer = new ArcGISMapImageLayer(url);
//    mapImageLayer.loadAsync();
    // Add a listener that is invoked when layer loading has completed.
    mapImageLayer.addDoneLoadingListener(() -> {
        if (mapImageLayer.getLoadStatus() == LoadStatus.LOADED) {
            ArcGISMapServiceInfo mapServiceInfo = mapImageLayer.getMapServiceInfo();
            Log.i(TAG, "addImageLayer: 加载完成。。。");
            // work with map service info here
        }
    });
    // create an empty map instance
    ArcGISMap map = new ArcGISMap();
    // add map image layer as operational layer
    map.getOperationalLayers().add(mapImageLayer);
    // set the map to be displayed in this view
    mMapView.setMap(map);
}
private void addtiledLayer(){
//    String url = "http://192.168.0.47:6080/arcgis/rest/services/%E5%9C%9F%E4%B8%BB%E8%80%83%E5%9C%BA/MapServer";
    String url = "http://192.168.0.47:6080/arcgis/manager/service.html?name=SampleWorldCities.MapServer";
    // create a MapImageLayer with dynamically generated map images
    final ArcGISTiledLayer arcGISTiledLayer = new ArcGISTiledLayer(url);
    // Add a listener that is invoked when layer loading has completed.
    arcGISTiledLayer.addDoneLoadingListener(() -> {
        if (arcGISTiledLayer.getLoadStatus() == LoadStatus.LOADED) {
            // work with map service info here
            Log.i(TAG,"ArcGISTiledLayer加载完成");
        }
    });
    Basemap basemap = new Basemap(arcGISTiledLayer);
    // create a map with the basemap
    ArcGISMap arcGISMap = new ArcGISMap(basemap);
    // set the map to be displayed in this view
    mMapView.setMap(arcGISMap);
}
private void addVectorTiledLayer(){
    String url = "http://192.168.0.47:6080/arcgis/rest/services/%E5%9C%9F%E4%B8%BB%E8%80%83%E5%9C%BA/MapServer";
    // create a MapImageLayer with dynamically generated map images
    final ArcGISVectorTiledLayer mVectorTiledLayer = new ArcGISVectorTiledLayer(url);
    // Add a listener that is invoked when layer loading has completed.
    mVectorTiledLayer.addDoneLoadingListener(() -> {
        if (mVectorTiledLayer.getLoadStatus() == LoadStatus.LOADED) {
            // work with map service info here
            Log.i(TAG,"ArcGISTiledLayer加载完成");
        }
    });
    Basemap basemap = new Basemap(mVectorTiledLayer);
    // create a map with the basemap
    ArcGISMap arcGISMap = new ArcGISMap(basemap);
    Viewpoint vp = new Viewpoint(47.606726, -122.335564, 72223.819286);
    arcGISMap.setInitialViewpoint(vp);
    // set the map to be displayed in this view
    mMapView.setMap(arcGISMap);
}
    @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() {
        if (mMapView != null) {
            mMapView.dispose();
        }
        super.onDetach();
    }
}