diff --git a/app/build.gradle b/app/build.gradle index deefe1c..2dfe5be 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -12,8 +12,8 @@ android { applicationId "com.navinfo.outdoor" minSdkVersion 23 targetSdkVersion 30 - versionCode 31 - versionName "8.221118" + versionCode 32 + versionName "8.221125" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } lintOptions { diff --git a/app/src/main/java/com/navinfo/outdoor/activity/AutoTakePictureActivity.java b/app/src/main/java/com/navinfo/outdoor/activity/AutoTakePictureActivity.java index ebe9b95..99a439f 100644 --- a/app/src/main/java/com/navinfo/outdoor/activity/AutoTakePictureActivity.java +++ b/app/src/main/java/com/navinfo/outdoor/activity/AutoTakePictureActivity.java @@ -17,6 +17,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.DisplayMetrics; +import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.view.Window; @@ -214,10 +215,11 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic private Switch locationSwitch; private boolean locationEnable=true; private ImageView imgViewSettingHook; // 调起隐藏设置的按钮 - private TencentLocation oldCurrentLocation = null; + private Point oldCurrentLocation = null; // 记录上一次的位置信息 private MediaPlayer mediaPlayer; - private ImageView imgNaviDistance; // 自动规划到距离最近的数据开关 + private ImageView imgNaviDistance/*自动规划到距离最近的数据开关*/, imgRoadDirection; // 道路方向匹配开关 private Polyline currentNaviLine; // 当前界面上正显示的导航路径线,重绘路径时需要清除此前已绘制的路径 + private boolean startMatchEnableDirection = false; // 是否启用方向匹配起点 @Override protected void onCreate(@Nullable Bundle savedInstanceState) { @@ -268,6 +270,7 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic btnClearMatch = findViewById(R.id.clear_all_match_data); btnStopPicture = findViewById(R.id.btn_stop_picture); imgNaviDistance = findViewById(R.id.img_navi_distance); + imgRoadDirection = findViewById(R.id.img_road_direction); //获取地图 tencentMap = tvMapView.getMap(); @@ -278,6 +281,8 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic uiSettings.setRotateGesturesEnabled(false);//禁止地图旋转手势. uiSettings.setTiltGesturesEnabled(false);//禁止倾斜手势. setLocMarkerStyle(LOCATION_TYPE_LOCATION_ROTATE); + tencentMap.setLocationSource(new MyTecentLocationSource(this)); + tencentMap.setMyLocationEnabled(true); DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); FrameLayout.LayoutParams layoutParamsMap = (FrameLayout.LayoutParams) tvMapView.getLayoutParams();//相机的宽高 @@ -443,6 +448,14 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic } } }); + + imgRoadDirection.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + view.setSelected(!view.isSelected()); + startMatchEnableDirection = view.isSelected(); + } + }); } private long lastClickTime = 0; private int settingHookClickCount = 1; @@ -507,9 +520,7 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic @Override public boolean onDown(float v, float v1) { - if (isMapSlide) { - setLocMarkerStyle(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER); - } + setLocMarkerStyle(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER); return false; } @@ -589,13 +600,13 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic SharedPreferences spf = getSharedPreferences("MatchEntity", Context.MODE_PRIVATE); Gson gson = new GsonBuilder().serializeSpecialFloatingPointValues().create(); - String matchedData = spf.getString("data", null); + String matchedData = spf.getString("match-data", null); if (matchedData!=null) { List<RoadMatchEntity> dataList = gson.fromJson(matchedData, new TypeToken<List<RoadMatchEntity>>(){}.getType()); roadMatchEntityList.addAll(dataList); } // 清空缓存数据 - spf.edit().remove("data"); + spf.edit().remove("match-data"); spf.edit().commit(); } @@ -632,10 +643,26 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic roadMatchEntity.setDataDetail(it); roadMatchEntity.setGeometry((LineString) geometry); // roadMatchEntity.setBuffer(geometry.buffer(MATCH_BUFFER_DISTANCE).toString()); + // 实时设置当前任务的起始角度 if (geometry instanceof LineString) { LineString lineString = (LineString) geometry; // 计算前两个点的坐标角度 - roadMatchEntity.setAngle(Angle.angle(lineString.getCoordinateN(0), lineString.getCoordinateN(0))); + // 获取当前数据的前两个点的方向 + Coordinate[] coordinates = lineString.getCoordinates(); + // 循环取出当前数据的坐标点,为防止出现重复点,需要循环做判断 + Coordinate[] lineCoordinates = new Coordinate[2]; + lineCoordinates[0] = coordinates[0]; + lineCoordinates[1] = coordinates[0]; + for (Coordinate c: coordinates) { + if (c.x!=lineCoordinates[0].x&&c.y!=lineCoordinates[0].y) { + lineCoordinates[1] = c; + break; + } + } + if (lineCoordinates[0]!=lineCoordinates[1]) { + double dataBearing = getBearing(lineCoordinates[0].x, lineCoordinates[1].x, lineCoordinates[0].y, lineCoordinates[1].y); + roadMatchEntity.setAngle(dataBearing); + } roadMatchEntity.setsPoint(lineString.getStartPoint().toString()); roadMatchEntity.setePoint(lineString.getEndPoint().toString()); } @@ -679,24 +706,39 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic /** * 开始自动匹配 * */ + private double minDistance = MATCH_START_BUFFER_DISTANCE; // 最小距离,需要在匹配过程点时判断哪个任务是距离最小的 private void startMatchRoadLink(Point currentPoint) { if (roadLinkEntityList == null/*没有需要匹配的道路数据*/ || currentPoint == null/*没有位置信息*/) { return; } - float currentSpeed = getSpeed(); - double matchStartDistance = MATCH_BUFFER_DISTANCE; + double[] speedAndBearing = getSpeedAndBearing(currentPoint); + double currentSpeed = speedAndBearing[0]; // 当前速度 + double currentBearing = speedAndBearing[1]; // 当前方向 + double matchMiddleDistance = MATCH_BUFFER_DISTANCE; // 如果速度大于70,则动态调整起点捕捉范围 if (currentSpeed>=70) { - matchStartDistance = MATCH_BUFFER_DISTANCE*1.5; + matchMiddleDistance = MATCH_BUFFER_DISTANCE*1.5; } // 此处开始匹配起点 List<RoadMatchEntity> matchStartList = roadLinkEntityList.stream() + // 筛选当前任务与起点距离 .filter(it-> GeometryTools.createGeometry(it.getsPoint()).distance(currentPoint)<MATCH_START_BUFFER_DISTANCE) + // 筛选方向 + .filter(it-> { + if (startMatchEnableDirection) { + double dataBearing = it.getAngle(); + if (currentBearing!=0&&(Math.abs(dataBearing-currentBearing)<=90 || Math.abs(dataBearing-currentBearing)>=270)) { + return true; + } + return false; + } else { + return true; + } + }) + // 判断筛选出的数据是否已经在匹配列表中,如果不存在,需要自动领取该任务、记录开始采集时间 + .filter( + o -> roadMatchEntityList.stream().noneMatch(roadMatchEntity -> o.getId()==roadMatchEntity.getId())) .collect(Collectors.toList()); - // 判断筛选出的数据是否已经在匹配列表中,如果不存在,需要自动领取该任务、记录开始采集时间 - matchStartList = matchStartList.stream().filter( - o -> roadMatchEntityList.stream().noneMatch(roadMatchEntity -> o.getId()==roadMatchEntity.getId()) - ).collect(Collectors.toList()); if (matchStartList!=null&&!matchStartList.isEmpty()) { // 存在新匹配到的数据 matchStartList.stream().forEach( @@ -723,37 +765,47 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic } // 尝试用当前位置点匹配已经匹配到的roadLink,如果能匹配到,需要将该点记录,如果无法匹配,则需要评估已匹配的link是否需要被剔除 + minDistance = MATCH_START_BUFFER_DISTANCE; // 使用距离起终点的最大阈值初始化最小距离 if (!roadMatchEntityList.isEmpty()) { // 因为单个点位只能匹配一条任务,需要获取当前点位距离所有任务最近的距离 - roadMatchEntityList.stream().forEach(it->it.setCurrentLineDistance(GeometryTools.createGeometry(it.getGeometry()).distance(currentPoint))); - // 筛选出本次距离最近的线 - RoadMatchEntity minRoadMatchEntity = roadMatchEntityList.stream().min((o1, o2)-> { - if (o1.getCurrentLineDistance()<o2.getCurrentLineDistance()){ - return -1; - } else if (o1.getCurrentLineDistance()==o2.getCurrentLineDistance()) { - return 0; - } else { - return 1; + roadMatchEntityList.stream().forEach(it->{ + double currentDistance = GeometryTools.createGeometry(it.getGeometry()).distance(currentPoint); + it.setCurrentLineDistance(currentDistance); + if (currentDistance<=minDistance) { + minDistance = currentDistance; } - }).get(); + }); List<RoadMatchEntity> unMatchList = new ArrayList<>(); Map<Integer, RoadMatchEntity> finishEntityMap = new HashMap<>(); - double finalMatchStartDistance = matchStartDistance; + double finalMatchMiddleDistance = matchMiddleDistance; roadMatchEntityList.stream().forEach( roadMatchEntity -> { double currentDistance = roadMatchEntity.getCurrentLineDistance(); - boolean isMatch=currentDistance<= finalMatchStartDistance; // 当前点位是否可以和link匹配到 + boolean isMatch=currentDistance<= finalMatchMiddleDistance; // 当前点位是否可以和link匹配到 if (isMatch) { // 可以匹配到 - if (minRoadMatchEntity.getId() == roadMatchEntity.getId()) { // 并且该条数据还是最近的点, 将当前点位匹配到此任务下 - // 可以匹配到,并且是最近的任务,更新任务的开始时间 - if (roadMatchEntity.getMatchPointList().size() == 0) { + if (roadMatchEntity.getCurrentLineDistance()<=minDistance) { // 并且该条数据还是最近的点, 将当前点位匹配到此任务下(注意,当距离完全相等时,同一点位可能同时匹配到多个任务) + if (roadMatchEntity.getMatchPointList().size() == 0) { // 可以匹配到,并且从未匹配过,更新任务的开始时间 roadMatchEntity.setStartMatchTime(System.currentTimeMillis()); } + // 更新连续匹配的个数 roadMatchEntity.setMatchCount(roadMatchEntity.getMatchCount()+1); - roadMatchEntity.setUnMatchCount(0); // 有匹配的数据,则连续未匹配个数归0 + // 匹配到最近的任务,将当前点加入到已匹配道路中 roadMatchEntity.getMatchPointList().add(new MyCoordinate(currentPoint.getX(), currentPoint.getY())); + // 如果连续匹配个数大于1(可以连成线),更新已匹配长度 + if (roadMatchEntity.getMatchCount()>1) { + roadMatchEntity.setMatchedLength( + roadMatchEntity.getMatchedLength() + + + // 加上最后两个点的长度 + GeometryTools.getLineStringByMyCoordinate(roadMatchEntity.getMatchPointList().subList(roadMatchEntity.getMatchPointList().size()-2, roadMatchEntity.getMatchPointList().size())).getLength() + ); + } + } else { // 在阈值内,但是并非最近的点 + roadMatchEntity.setMatchCount(0); // 连续匹配个数置为0 } + roadMatchEntity.setUnMatchCount(0); // 有匹配的数据,则连续未匹配个数归0(即使不是最近的数据,在阈值内即认为可匹配,未匹配点数也置为0) + double currentEndDistance = currentPoint.distance(GeometryTools.createGeometry(roadMatchEntity.getePoint())); // 当前距离终点的距离 // 记录本次的匹配距离,如果本次匹配距离大于上一次,且上一次匹配终点时间不为0(说明已经提前匹配到终点了),则结束匹配,否则继续等待匹配,设置过EndMathchTime的数据即为可以结束匹配的数据,下一次如果未匹配,也可以结束 if (roadMatchEntity.getEndMathchTime()>0/*endMatchTime不为0,说明该数据已经匹配到终点*/&¤tEndDistance>roadMatchEntity.getLastEndDistance()) { @@ -761,17 +813,17 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic // 更新终点时间为距离终点逐渐变大时的时间 roadMatchEntity.setEndMathchTime(System.currentTimeMillis()); } - // 匹配到终点、或匹配距离超过90% - if ((roadMatchEntity.getMatchPointList().size()>=2&&GeometryTools.getLineStringByMyCoordinate(roadMatchEntity.getMatchPointList()).getLength()/roadMatchEntity.getLength()>=MATCH_CONFIRM_FINISH_BUFFER) - || currentEndDistance<= finalMatchStartDistance) { + // 匹配距离超过指定阈值,认为该条数据可完成,记录当前位置与终点的距离,当距离从小变大时,完成该任务 + if (roadMatchEntity.getMatchPointList().size()>=2&&roadMatchEntity.getMatchedLength()/roadMatchEntity.getLength()>=MATCH_CONFIRM_FINISH_BUFFER) { roadMatchEntity.setEndMathchTime(System.currentTimeMillis()); // 匹配到终点后,记录该条数据的最新一次匹配距离,当下一次匹配距离大于当前距离,则认为该数据完全匹配,结束匹配 roadMatchEntity.setLastEndDistance(currentEndDistance); } //=============如果在匹配范围内,但是该数据并非最近的点,不需要记录匹配,也无需增加未匹配点的个数 } else { // 无法匹配 - // 将无法匹配的点位个数记录到对象中 + // 更新连续无法匹配的点位个数 roadMatchEntity.setUnMatchCount(roadMatchEntity.getUnMatchCount()+1); + // 有未匹配的数据,连续匹配个数也归0 roadMatchEntity.setMatchCount(0);// 设置连续匹配的数据个数为0 roadMatchEntity.getUnMatchPointList().add(new MyCoordinate(currentPoint.getX(), currentPoint.getY())); // 当连续未匹配个数大于等于20个时,该任务被认为可以结束(舍弃或完成-需根据匹配到的数据长度与任务长度做对比) @@ -780,7 +832,7 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic if (matchPointList == null || matchPointList.size()<2) { // 已匹配的点位不足2个,无法计算长度,直接放弃该任务 unMatchList.add(roadMatchEntity); } else { - if (GeometryTools.getLineStringByMyCoordinate(matchPointList).getLength()/roadMatchEntity.getLength()>=MATCH_CONFIRM_FINISH_BUFFER) { // 已匹配距离与任务长度距离比例超过指定阈值,该任务可完成 + if (roadMatchEntity.getMatchedLength()/roadMatchEntity.getLength()>=MATCH_CONFIRM_FINISH_BUFFER) { // 已匹配距离与任务长度距离比例超过指定阈值,该任务可完成 roadMatchEntity.setEndMathchTime(System.currentTimeMillis()); finishEntityMap.put(roadMatchEntity.getId(), roadMatchEntity); } else { @@ -788,35 +840,6 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic } } } -// // 该数据未匹配,但是如果此前已经匹配到结束点,则仍然认为匹配成功 -// if (roadMatchEntity.getEndMathchTime()>0) { -// finishEntityMap.put(roadMatchEntity.getId(), roadMatchEntity); -// } else { -// // 判断当前是否存在已匹配的点 -// if (roadMatchEntity.getMatchPointList().size()>1) { // 存在匹配的点超过1个,根据长度判断 -// if (GeometryTools.getLineStringByMyCoordinate(roadMatchEntity.getMatchPointList()).getLength()/roadMatchEntity.getLength()>UNMATCH_GIVE_UP_DISTANCE_BUFFER) { -// // 匹配距离超过20%,根据匹配点和未匹配点个数的对比率判断是否需要放弃 -// if (((float)roadMatchEntity.getUnMatchPointList().size())/roadMatchEntity.getMatchPointList().size()>UNMATCH_COUNT_BUFFER) { -// unMatchList.add(roadMatchEntity); -// } -// } else {// 当前匹配距离不超过20%,则必须有连续多个点未匹配才可以放弃该Link -// if (roadMatchEntity.getUnMatchCount()>UNMATCH_BUFFER_MIDDLE_BUFFER) { -// unMatchList.add(roadMatchEntity); -// } -// } -// } else { // 从未匹配过的数据 -// // 未匹配个数超过指定阈值,也认为数据不匹配 -// if (roadMatchEntity.getMatchPointList().size()==0) { // 已匹配的个数为0 -// if (roadMatchEntity.getUnMatchCount()>UNMATCH_BUFFER_START_BUFFER) { -// unMatchList.add(roadMatchEntity); -// } -// } else if (roadMatchEntity.getMatchPointList().size()==1) { // 已匹配的个数为1 -// if (roadMatchEntity.getUnMatchCount()>UNMATCH_BUFFER_MIDDLE_BUFFER) { -// unMatchList.add(roadMatchEntity); -// } -// } -// } -// } } } ); @@ -838,22 +861,27 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic } if (!unMatchList.isEmpty()) { - // 过滤需要舍弃的link - for (RoadMatchEntity unMatchEntity: unMatchList) { - roadMatchEntityList.remove(unMatchEntity); - } - cancelReciverTask(unMatchList).subscribe(new Consumer<PoiEntity>() { + cancelReciverTask(unMatchList).subscribe(new Observer<PoiEntity>() { @Override - public void accept(PoiEntity poiEntity) throws Exception { + public void onSubscribe(Disposable d) { + // 过滤需要舍弃的link + for (RoadMatchEntity unMatchEntity: unMatchList) { + roadMatchEntityList.remove(unMatchEntity); + } } - }, new Consumer<Throwable>() { + @Override - public void accept(Throwable throwable) throws Exception { - Toast.makeText(AutoTakePictureActivity.this, throwable.getMessage(), Toast.LENGTH_SHORT).show(); + public void onNext(PoiEntity poiEntity) { + } - }, new Action() { + @Override - public void run() throws Exception { + public void onError(Throwable e) { + Toast.makeText(AutoTakePictureActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show(); + } + + @Override + public void onComplete() { // 重新刷新地图 initRoadLine2Map(); } @@ -1102,7 +1130,9 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic .token(Constant.ACCESS_TOKEN); Response response = okGoBuilder.getSynchronization(); Gson gson = new Gson(); - TaskByNetBean taskByNetBean = gson.fromJson(response.body().string(), TaskByNetBean.class); + String body = response.body().string(); + TaskByNetBean taskByNetBean = gson.fromJson(body, TaskByNetBean.class); + Log.d("AutoTake:", body); if (taskByNetBean.getCode() == 200) { // 继续保存 TaskByNetBean.BodyBean listBean = taskByNetBean.getBody(); @@ -1382,12 +1412,12 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic case R.id.iv_zoom_add://放大 CameraUpdate cameraUpdateIn = CameraUpdateFactory.zoomIn(); tencentMap.animateCamera(cameraUpdateIn); - setLocMarkerStyle(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER); + setLocMarkerStyle(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER); break; case R.id.iv_zoom_del://缩小 CameraUpdate cameraUpdateOut = CameraUpdateFactory.zoomOut(); tencentMap.animateCamera(cameraUpdateOut); - setLocMarkerStyle(MyLocationStyle.LOCATION_TYPE_FOLLOW_NO_CENTER); + setLocMarkerStyle(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER); break; case R.id.iv_location://定位: if (Constant.currentLocation != null) { @@ -1420,8 +1450,6 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic /*设置定位图标样式*/ private void setLocMarkerStyle(int type) { - tencentMap.setLocationSource(new MyTecentLocationSource(this)); - tencentMap.setMyLocationEnabled(true); MyLocationStyle locationStyle = new MyLocationStyle(); //LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER locationStyle = locationStyle.myLocationType(type); @@ -1432,7 +1460,7 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic locationStyle.fillColor(getResources().getColor(android.R.color.transparent)); locationStyle.strokeWidth(1); tencentMap.setMyLocationStyle(locationStyle); - if (LOCATION_TYPE_LOCATION_ROTATE_NO_CENTER == type) { + if (LOCATION_TYPE_LOCATION_ROTATE == type) { ivLocation.setEnabled(false); } else { ivLocation.setEnabled(true); @@ -1592,7 +1620,7 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic // roadMatchEntity已匹配数据如果存在,缓存 SharedPreferences.Editor editor = getSharedPreferences("MatchEntity", Context.MODE_PRIVATE).edit(); Gson gson = new GsonBuilder().serializeSpecialFloatingPointValues().create(); - editor.putString("data", gson.toJson(roadMatchEntityList)); + editor.putString("match-data", gson.toJson(roadMatchEntityList)); editor.commit(); } if (gpsUtils!=null) { @@ -1956,7 +1984,7 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic } // 判断当前点位和上一个点位的距离,如果距离过近,忽略该点 Point currentPoint = (Point) GeometryTools.createGeometry(new LatLng(tencentLocation.getLatitude(), tencentLocation.getLongitude())); - if (lastPositionPoint!=null&&lastPositionPoint.distance(currentPoint)<MATCH_BUFFER_DISTANCE) { // 如果当前点小于最小距离阈值,过滤该数据 + if (lastPositionPoint!=null&&lastPositionPoint.distance(currentPoint)<3e-7) { // 如果当前点小于最小距离阈值,过滤该数据 return false; } lastPositionPoint = currentPoint; @@ -1993,15 +2021,21 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic } }); - private float getSpeedAndBearing() { - float bearing = 0; - if (Constant.currentLocation.getDirection() != 0) { - bearing = (float) Constant.currentLocation.getDirection(); - } else { - // 使用上一个点和当前点位的向量计算方向 - if (oldCurrentLocation!=null&&oldCurrentLocation.getLatitude()!=Constant.currentLocation.getLatitude()&&oldCurrentLocation.getLongitude()!=Constant.currentLocation.getLongitude()) { + private double[] getSpeedAndBearing(Point currentPoint) { + double[] speedAndBearing = new double[2]; - } + double bearing = 0; +// if (Constant.currentLocation.getDirection() != 0) { +// bearing = (float) Constant.currentLocation.getDirection(); +// } else { +// // 使用上一个点和当前点位的向量计算方向 +// if (oldCurrentLocation!=null&&oldCurrentLocation.getLatitude()!=Constant.currentLocation.getLatitude()&&oldCurrentLocation.getLongitude()!=Constant.currentLocation.getLongitude()) { +// bearing = getBearing(oldCurrentLocation.getLongitude(), Constant.currentLocation.getLongitude(), oldCurrentLocation.getLatitude(), Constant.currentLocation.getLatitude()); +// } +// } + // 使用上一个点和当前点位的向量计算方向 + if (oldCurrentLocation!=null&&oldCurrentLocation.getX()!=currentPoint.getX()&&oldCurrentLocation.getY()!=currentPoint.getY()) { + bearing = getBearing(oldCurrentLocation.getX(), currentPoint.getX(), oldCurrentLocation.getY(), currentPoint.getY()); } float speed = Constant.currentLocation.getSpeed();//米/秒 @@ -2009,14 +2043,28 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic speed = (speed * 3600 / 1000);//km/h } else { if (oldCurrentLocation != null) { - LatLng startLatLng = new LatLng(oldCurrentLocation.getLatitude(), oldCurrentLocation.getLongitude());//旧的坐标 - LatLng endLatLng = new LatLng(Constant.currentLocation.getLatitude(), Constant.currentLocation.getLongitude());//新的坐标 + LatLng startLatLng = new LatLng(oldCurrentLocation.getY(), oldCurrentLocation.getX());//旧的坐标 + LatLng endLatLng = new LatLng(currentPoint.getY(), currentPoint.getX());//新的坐标 double geometry = GeometryTools.distanceToDouble(startLatLng, endLatLng);//米 speed = (float) (geometry * 3600 / 1000); } - oldCurrentLocation = Constant.currentLocation; + oldCurrentLocation = currentPoint; } - return speed; + speedAndBearing[0] = speed; + speedAndBearing[1] = bearing; + + return speedAndBearing; + } + + private double getBearing(double startLongitude, double endLongitude, double startLatitude, double endLatitude) { + double x = endLongitude - startLongitude; + double y = endLatitude - startLatitude; + double angle = Math.atan(x / y)*180/Math.PI; + if((x>0&&y<0)||(x<0&&y<0)){ + angle=angle+180; + } + angle = (angle+720)%360; + return angle; } @Subscribe(threadMode = ThreadMode.MAIN) @@ -2026,17 +2074,17 @@ public class AutoTakePictureActivity extends BaseActivity implements View.OnClic return; } TencentLocation tencentLocation = (TencentLocation) msg.obj; - if (tencentMap != null && ivLocation!=null && !ivLocation.isEnabled()) { // 当定位按钮禁用, - CameraUpdate cameraSigma = CameraUpdateFactory.newCameraPosition(new CameraPosition( - new LatLng(tencentLocation.getLatitude(), tencentLocation.getLongitude()), //中心点坐标,地图目标经纬度 - 17, //目标缩放级别 - 0, //目标倾斜角 - 0)); //目标旋转角 0~360° (正北方为0) - tencentMap.animateCamera(cameraSigma); - } +// if (tencentMap != null && ivLocation!=null && !ivLocation.isEnabled()) { // 当定位按钮禁用, +// CameraUpdate cameraSigma = CameraUpdateFactory.newCameraPosition(new CameraPosition( +// new LatLng(tencentLocation.getLatitude(), tencentLocation.getLongitude()), //中心点坐标,地图目标经纬度 +// 17, //目标缩放级别 +// 0, //目标倾斜角 +// 0)); //目标旋转角 0~360° (正北方为0) +// tencentMap.animateCamera(cameraSigma); +// } // 判断当前点位和上一个点位的距离,如果距离过近,忽略该点 Point currentPoint = (Point) GeometryTools.createGeometry(new LatLng(tencentLocation.getLatitude(), tencentLocation.getLongitude())); - if (lastPositionPoint!=null&&lastPositionPoint.distance(currentPoint)<MATCH_BUFFER_DISTANCE) { // 如果当前点小于最小距离阈值,过滤该数据 + if (lastPositionPoint!=null&&lastPositionPoint.distance(currentPoint)<5e-7) { // 如果当前点小于最小距离阈值,过滤该数据 return; } lastPositionPoint = currentPoint; diff --git a/app/src/main/java/com/navinfo/outdoor/bean/RoadMatchEntity.java b/app/src/main/java/com/navinfo/outdoor/bean/RoadMatchEntity.java index 588f63d..df231e0 100644 --- a/app/src/main/java/com/navinfo/outdoor/bean/RoadMatchEntity.java +++ b/app/src/main/java/com/navinfo/outdoor/bean/RoadMatchEntity.java @@ -36,6 +36,7 @@ public class RoadMatchEntity implements Serializable { private int unMatchCount; // <连续>未匹配到的点位个数 private List<MyCoordinate> matchPointList = new ArrayList<>(); // 已匹配的点位列表 private List<MyCoordinate> unMatchPointList = new ArrayList<>(); // 未匹配的点位列表 + private double matchedLength = 0; public int getId() { return id; @@ -162,6 +163,14 @@ public class RoadMatchEntity implements Serializable { this.currentLineDistance = currentLineDistance; } + public double getMatchedLength() { + return matchedLength; + } + + public void setMatchedLength(double matchedLength) { + this.matchedLength = matchedLength; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java b/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java index b29b987..440d66c 100644 --- a/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java +++ b/app/src/main/java/com/navinfo/outdoor/fragment/RoadFragment.java @@ -103,6 +103,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList private RadioButton rbtnRoadOpen/*道路已开通*/, rbtnRoadPartOpen/*道路部分开通*/, rbtnRoadHasntOpen/*道路未开通*/, rbtnRoadHasntFind/*道路未找到*/, rbtnRoadOther/*其他*/; private RadioGroup rgRoadStatus; // 道路状态的radioGroup private EditText edtCheckedOther; + private int existence = 0; // 是否存在 public static RoadFragment newInstance(Bundle bundle) { RoadFragment fragment = new RoadFragment(); @@ -230,6 +231,10 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList @Override public void onCheckedChanged(RadioGroup group, int checkedId) { rgRoadStatus.setTag(findViewById(checkedId).getTag()); + existence = (int) findViewById(checkedId).getTag(); + if (showPoiEntity!=null) { + showPoiEntity.setExistence(existence); + } switch (checkedId) { case R.id.rbtn_road_other: edtCheckedOther.setVisibility(View.VISIBLE); @@ -400,6 +405,15 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList if (showPoiEntity.getTaskId()>0) { etRoadName.setEnabled(false); } + if (rgRoadStatus!=null) { + for (int i = 0; i < rgRoadStatus.getChildCount(); i++) { + RadioButton childAt = (RadioButton) rgRoadStatus.getChildAt(i); + if (childAt.getTag().equals(showPoiEntity.getExistence())) { + childAt.setChecked(true); + break; + } + } + } } } @@ -648,7 +662,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList httpParams.put("workType", 0); httpParams.put("memo", poiEntity.getMemo()); // 增加对应九天平台的参数 - httpParams.put("existence", rgRoadStatus.getTag().toString()); + httpParams.put("existence", existence); httpParams.put("description", edtCheckedOther!=null&&edtCheckedOther.isShown()? edtCheckedOther.getText().toString().trim(): ""); OkGoBuilder okGoBuilder = OkGoBuilder.getInstance() @@ -719,7 +733,7 @@ public class RoadFragment extends BaseDrawerFragment implements View.OnClickList httpParams.put("workType", 0); httpParams.put("memo", poiEntity.getMemo()); // 增加对应九天平台的参数 - httpParams.put("existence", rgRoadStatus.getTag().toString()); + httpParams.put("existence", existence); httpParams.put("description", edtCheckedOther!=null&&edtCheckedOther.isShown()? edtCheckedOther.getText().toString().trim(): ""); OkGoBuilder okGoBuilder = OkGoBuilder.getInstance() .time(30) diff --git a/app/src/main/java/com/navinfo/outdoor/http/HttpInterface.java b/app/src/main/java/com/navinfo/outdoor/http/HttpInterface.java index 720779c..e73822a 100644 --- a/app/src/main/java/com/navinfo/outdoor/http/HttpInterface.java +++ b/app/src/main/java/com/navinfo/outdoor/http/HttpInterface.java @@ -3,8 +3,8 @@ package com.navinfo.outdoor.http; public class HttpInterface { // public static final String IP = "http://172.23.138.133:9999/m4";//测试接口-IP public static final String IPm = "http://dtxbmaps.navinfo.com/dtxb/dev/m4";//开发接口-外网 - public static final String IP = "http://dtxbmaps.navinfo.com/dtxb/test/m4";//测试接口-外网 - public static final String IP1 = "http://dtxbmaps.navinfo.com/dtxb/m4";//正式接口 + public static final String IP1 = "http://dtxbmaps.navinfo.com/dtxb/test/m4";//测试接口-外网 + public static final String IP = "http://dtxbmaps.navinfo.com/dtxb/m4";//正式接口 public static final String USER_PATH = "/user/";//我的 public static final String MSG_LIST_PATH = "/msgList/";//发现 public static final String USER_LOGIN_PATH = "/userlogin/";//登录 diff --git a/app/src/main/res/drawable/selector_direction.xml b/app/src/main/res/drawable/selector_direction.xml new file mode 100644 index 0000000..90adb01 --- /dev/null +++ b/app/src/main/res/drawable/selector_direction.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_pressed="true" + android:drawable="@mipmap/direction_press"/> <!-- pressed --> + <item android:state_focused="true" + android:drawable="@mipmap/direction_press"/> <!-- focused --> + <item android:state_selected="true" + android:drawable="@mipmap/direction_press"/> + <item android:state_checked="true" + android:drawable="@mipmap/direction_press"/> + <item android:state_enabled="false" + android:drawable="@mipmap/direction_press"/> + <item android:drawable="@mipmap/direction" /> <!-- default --> +</selector> \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_picture_map_change.xml b/app/src/main/res/drawable/selector_picture_map_change.xml new file mode 100644 index 0000000..f69bdea --- /dev/null +++ b/app/src/main/res/drawable/selector_picture_map_change.xml @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:state_pressed="true" + android:drawable="@mipmap/exchange_press"/> <!-- pressed --> + <item android:state_focused="true" + android:drawable="@mipmap/exchange_press"/> <!-- focused --> + <item android:state_selected="true" + android:drawable="@mipmap/exchange_press"/> + <item android:state_checked="true" + android:drawable="@mipmap/exchange_press"/> + <item android:state_enabled="false" + android:drawable="@mipmap/exchange_press"/> + <item android:drawable="@mipmap/exchange" /> <!-- default --> +</selector> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_auto_take_pictures.xml b/app/src/main/res/layout/activity_auto_take_pictures.xml index 17093ac..6326eaa 100644 --- a/app/src/main/res/layout/activity_auto_take_pictures.xml +++ b/app/src/main/res/layout/activity_auto_take_pictures.xml @@ -127,12 +127,13 @@ <ImageView android:id="@+id/btn_switch" - android:layout_width="wrap_content" - android:layout_height="wrap_content" + android:layout_width="36dp" + android:layout_height="36dp" + android:background="@drawable/selector_round_bg" android:layout_marginTop="25dp" - android:layout_marginEnd="25dp" - android:src="@mipmap/switcher" + android:src="@drawable/selector_picture_map_change" android:padding="@dimen/default_widget_padding" + android:layout_marginRight="@dimen/default_widget_padding" android:text="切换" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> @@ -160,16 +161,29 @@ <ImageView android:id="@+id/img_navi_distance" - android:layout_width="50dp" - android:layout_height="50dp" + android:layout_width="36dp" + android:layout_height="36dp" android:src="@drawable/selector_navi_distance" android:background="@drawable/selector_round_bg" android:text="按距离自动导航" - android:padding="8dp" + android:visibility="gone" + android:padding="@dimen/default_widget_padding" android:layout_margin="@dimen/default_widget_padding" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toBottomOf="@id/location_switch"/> + <ImageView + android:id="@+id/img_road_direction" + android:layout_width="36dp" + android:layout_height="36dp" + android:background="@drawable/selector_round_bg" + android:text="起点方向捕捉" + android:src="@drawable/selector_direction" + android:padding="@dimen/default_widget_padding" + android:layout_margin="@dimen/default_widget_padding" + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toBottomOf="@id/img_navi_distance"></ImageView> + <RadioGroup android:id="@+id/radio_group_picture" android:layout_width="wrap_content" diff --git a/app/src/main/res/layout/fragment_gather_get.xml b/app/src/main/res/layout/fragment_gather_get.xml index 4d23c8b..8747395 100644 --- a/app/src/main/res/layout/fragment_gather_get.xml +++ b/app/src/main/res/layout/fragment_gather_get.xml @@ -23,6 +23,7 @@ android:textSize="@dimen/pickerview_topbar_title_textsize" android:textColor="@color/colorWhite" android:padding="@dimen/default_widget_padding" + android:visibility="gone" android:background="@drawable/selector_red_bg" app:layout_constraintRight_toLeftOf="@id/btn_delete" app:layout_constraintBaseline_toBaselineOf="@id/btn_delete" diff --git a/app/src/main/res/layout/treasure_fragment.xml b/app/src/main/res/layout/treasure_fragment.xml index 67934e4..ab62c6c 100644 --- a/app/src/main/res/layout/treasure_fragment.xml +++ b/app/src/main/res/layout/treasure_fragment.xml @@ -117,6 +117,7 @@ android:id="@+id/img_navi_distance" android:layout_width="50dp" android:layout_height="50dp" + android:visibility="gone" android:src="@drawable/selector_navi_distance" android:background="@drawable/selector_round_bg" android:text="按距离自动导航" diff --git a/app/src/main/res/mipmap-xxhdpi/direction.png b/app/src/main/res/mipmap-xxhdpi/direction.png new file mode 100644 index 0000000..915f79c Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/direction.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/direction_press.png b/app/src/main/res/mipmap-xxhdpi/direction_press.png new file mode 100644 index 0000000..a9e4f4d Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/direction_press.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/exchange.png b/app/src/main/res/mipmap-xxhdpi/exchange.png new file mode 100644 index 0000000..15fd5e0 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/exchange.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/exchange_press.png b/app/src/main/res/mipmap-xxhdpi/exchange_press.png new file mode 100644 index 0000000..89fd72b Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/exchange_press.png differ