From e0109151ec2a050910f37d4ff0e50d3462372796 Mon Sep 17 00:00:00 2001 From: xiaoyan Date: Mon, 31 Oct 2022 11:15:16 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E8=A7=84=E5=88=92=E5=85=AC=E5=85=B1=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/navinfo/outdoor/util/NaviUtils.java | 202 ++++++++++++++++-- app/src/main/res/values/dimens.xml | 6 + 2 files changed, 195 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/navinfo/outdoor/util/NaviUtils.java b/app/src/main/java/com/navinfo/outdoor/util/NaviUtils.java index cc4449a..12c373f 100644 --- a/app/src/main/java/com/navinfo/outdoor/util/NaviUtils.java +++ b/app/src/main/java/com/navinfo/outdoor/util/NaviUtils.java @@ -1,6 +1,7 @@ package com.navinfo.outdoor.util; import android.content.Context; +import android.util.Log; import android.view.View; import android.widget.RadioButton; import android.widget.RadioGroup; @@ -14,16 +15,33 @@ import com.navinfo.outdoor.R; import com.navinfo.outdoor.api.Constant; import com.tencent.map.navi.CalcRouteCallback; import com.tencent.map.navi.TencentNaviManager; +import com.tencent.map.navi.TencentRouteSearchCallback; import com.tencent.map.navi.car.CarRouteSearchOptions; import com.tencent.map.navi.car.TencentCarNaviManager; import com.tencent.map.navi.data.CalcRouteResult; import com.tencent.map.navi.data.NaviPoi; +import com.tencent.map.navi.data.RouteColors; +import com.tencent.map.navi.data.RouteData; +import com.tencent.map.navi.data.TrafficItem; +import com.tencent.map.navi.ride.RideRouteSearchOptions; import com.tencent.map.navi.ride.TencentRideNaviManager; +import com.tencent.map.navi.walk.TencentWalkNaviManager; +import com.tencent.tencentmap.mapsdk.maps.CameraUpdateFactory; +import com.tencent.tencentmap.mapsdk.maps.TencentMap; +import com.tencent.tencentmap.mapsdk.maps.model.BitmapDescriptorFactory; +import com.tencent.tencentmap.mapsdk.maps.model.LatLng; +import com.tencent.tencentmap.mapsdk.maps.model.LatLngBounds; +import com.tencent.tencentmap.mapsdk.maps.model.MarkerOptions; +import com.tencent.tencentmap.mapsdk.maps.model.Polyline; +import com.tencent.tencentmap.mapsdk.maps.model.PolylineOptions; import java.util.ArrayList; +import java.util.List; public class NaviUtils { private static NaviUtils instance; + private Context mContext; + private TencentMap tencentMap; public static NaviUtils getInstance() { if (instance == null) { instance = new NaviUtils(); @@ -31,6 +49,11 @@ public class NaviUtils { return instance; } + public void init(Context mContext, TencentMap tencentMap) { + this.mContext = mContext; + this.tencentMap = tencentMap; + } + public void selectNaviType(AppCompatActivity mContext, SelectNaviTypeListener selectNaviTypeListener) { CustomDialog selectNaviTypeDialog = CustomDialog.build(mContext, R.layout.dialog_select_navi_type, new CustomDialog.OnBindView() { @Override @@ -100,24 +123,177 @@ public class NaviUtils { * */ public void searchRoute(Constant.NAV_TYPE nav_type, TencentNaviManager naviManager, NaviPoi start, NaviPoi end) throws Exception { - if (nav_type == Constant.NAV_TYPE.CAR) { + if (nav_type == Constant.NAV_TYPE.CAR) { // 驾车模式 TencentCarNaviManager carNaviManager = (TencentCarNaviManager)naviManager; - CarRouteSearchOptions options = CarRouteSearchOptions.create(); - carNaviManager.searchRoute(start, end, new ArrayList<>(), options, new CalcRouteCallback() { - @Override - public void onCalcRouteSuccess(CalcRouteResult calcRouteResult) { - // 路径规划成功 - } - - @Override - public void onCalcRouteFailure(CalcRouteResult calcRouteResult) { - // 路径规划失败 - } - }); + carNaviManager.searchRoute(start, end, new ArrayList<>(), options, routeSearchCallback); + } else if (nav_type == Constant.NAV_TYPE.RIDE) { // 骑行模式 + TencentRideNaviManager rideNaviManager = (TencentRideNaviManager)naviManager; + RideRouteSearchOptions options = RideRouteSearchOptions.create(); + rideNaviManager.searchRoute(start, end, options, routeSearchCallback); + } else { // 步行模式 + TencentWalkNaviManager walkNaviManager = (TencentWalkNaviManager) naviManager; + walkNaviManager.searchRoute(start, end, routeSearchCallback); } } + /** + * 算路回调 + */ + private TencentRouteSearchCallback routeSearchCallback = new TencentRouteSearchCallback() { + @Override + public void onRouteSearchFailure(int i, String s) { + //i错误码提示:1001为网络错误,1002为无网络,2001为返回数据无效(或空),2002为起终点参数错误,2003为途经点参数错误,2004为吸附失败,2005为算路失败,2999为服务器内部错误 + Log.e("route","error:"+i); + } + + @Override + public void onRouteSearchSuccess(ArrayList arrayList) { + // 添加道路Route到地图,默认选取第一条 + addRoutes(arrayList); + zoomToRoute(arrayList.get(0)); +// addMarkerStart(start.getLatitude(),start.getLongitude()); +// addMarkerDestination(dest.getLatitude(),dest.getLongitude()); +// addMarkerPass(wayPoints); + } + + @Override + public void onCalcRouteSuccess(CalcRouteResult calcRouteResult) { + + } + + @Override + public void onCalcRouteFailure(CalcRouteResult calcRouteResult) { + + } + }; + + private void addMarkerStart(double latitude, double longitude) { + LatLng startPoint = new LatLng(latitude, longitude); + tencentMap.addMarker(new MarkerOptions(startPoint) + .icon(BitmapDescriptorFactory.fromAsset("navi_marker_start.png")) + .anchor(0.5f, 1)); + + + } + + private void addMarkerDestination(double latitude, double longitude) { + + LatLng destinationPoint = new LatLng(latitude, longitude); + tencentMap.addMarker(new MarkerOptions(destinationPoint) + .icon(BitmapDescriptorFactory.fromAsset("navi_marker_end.png")) + .anchor(0.5f, 1)); + + + } + + private void addMarkerPass(ArrayList wayPoints) { + + for (NaviPoi wayPoint : wayPoints) { + LatLng destinationPoint = new LatLng(wayPoint.getLatitude(), wayPoint.getLongitude()); + tencentMap.addMarker(new MarkerOptions(destinationPoint) + .icon(BitmapDescriptorFactory.fromAsset("navi_marker_pass.png")) + .anchor(0.5f, 1)); + } + } + + private void addRoutes(ArrayList mRouteDatas) { + RouteData routeData = mRouteDatas.get(0); + ArrayList traffics = getTrafficItemsFromList(routeData.getTrafficIndexList()); + List mRoutePoints = routeData.getRoutePoints(); + // 点的个数 + int pointSize = mRoutePoints.size(); + // 路段总数 三个index是一个路况单元,分别为:路况级别,起点,终点 + int trafficSize = traffics.size(); + // 路段index所对应的颜色值数组 + int[] trafficColors = new int[pointSize]; + // 路段index数组 + int[] trafficColorsIndex = new int[pointSize]; + int pointStart = 0; + int pointEnd = 0; + int trafficColor = 0; + int index = 0; + for (int j = 0; j < trafficSize; j++) { + pointStart = traffics.get(j).getFromIndex(); + // 规避错乱数据 + if (pointStart < pointEnd) { + pointStart = pointEnd; + } + pointEnd = traffics.get(j).getToIndex(); + trafficColor = getTrafficColorByCode(traffics.get(j).getTraffic()); + + for (int k = pointStart; k < pointEnd || k == pointSize - 1; k++) { + trafficColors[index] = trafficColor; + trafficColorsIndex[index] = index; + index++; + } + } + + PolylineOptions options = new PolylineOptions() + .addAll(routeData.getRoutePoints()) + .width(15) + .arrow(true) + .colors(trafficColors, trafficColorsIndex) + .zIndex(10); + + Polyline polyline = tencentMap.addPolyline(options); + + } + private void zoomToRoute(RouteData routeData) { + int marginLeft = mContext.getResources().getDimensionPixelSize(R.dimen.navigation_line_margin_left); + int marginTop = mContext.getResources().getDimensionPixelSize(R.dimen.navigation_line_margin_top); + int marginRight = mContext.getResources().getDimensionPixelSize(R.dimen.navigation_line_margin_right); + int marginBottom = mContext.getResources().getDimensionPixelSize(R.dimen.navigation_line_margin_bottom); + LatLngBounds.Builder builder = new LatLngBounds.Builder(); + + builder.include(routeData.getRoutePoints()); + LatLngBounds bounds = builder.build(); + tencentMap.moveCamera(CameraUpdateFactory.newLatLngBoundsRect(bounds, marginLeft, marginRight, marginTop, marginBottom)); + + } + + + private int getTrafficColorByCode(int type) { + int color = 0xFFFFFFFF; + switch (type) { + case 0: + // 路况标签-畅通 + // 绿色 + color = RouteColors.COLOR_MAIN_DAY_SMOOTH; + break; + case 1: + // 路况标签-缓慢 + // 黄色 + color = RouteColors.COLOR_MAIN_DAY_SLOW; + break; + case 2: + // 路况标签-拥堵 + // 红色 + color = RouteColors.COLOR_MAIN_DAY_VERY_SLOW; + break; + case 3: + // 路况标签-无路况 + color = RouteColors.COLOR_MAIN_DAY_UNKNOWN; + break; + case 4: + // 路况标签-特别拥堵(猪肝红) + color = RouteColors.COLOR_MAIN_DAY_JAM; + break; + } + return color; + } + + private ArrayList getTrafficItemsFromList(ArrayList indexList) { + ArrayList trafficItems = new ArrayList<>(); + for (int i = 0; i < indexList.size(); i = i + 3) { + TrafficItem item = new TrafficItem(); + item.setTraffic(indexList.get(i)); + item.setFromIndex(indexList.get(i + 1)); + item.setToIndex(indexList.get(i + 2)); + trafficItems.add(item); + } + return trafficItems; + } public interface SelectNaviTypeListener { void selectNaviType(Constant.NAV_TYPE nav_type); } diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index e2c15eb..0b15929 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -3,4 +3,10 @@ 20dp 16dp 6dp + + 10dp + 30dp + 50dp + 80dp + 30dp \ No newline at end of file