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);
|
}
|
|
}
|