feat: 增加路径规划公共方法

This commit is contained in:
xiaoyan 2022-10-31 11:15:16 +08:00
parent fcb107eb1b
commit e0109151ec
2 changed files with 195 additions and 13 deletions

View File

@ -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<RouteData> 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<NaviPoi> 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<RouteData> mRouteDatas) {
RouteData routeData = mRouteDatas.get(0);
ArrayList<TrafficItem> traffics = getTrafficItemsFromList(routeData.getTrafficIndexList());
List<LatLng> 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<TrafficItem> getTrafficItemsFromList(ArrayList<Integer> indexList) {
ArrayList<TrafficItem> 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);
}

View File

@ -3,4 +3,10 @@
<dimen name="top_pind_sp">20dp</dimen>
<dimen name="fab_margin">16dp</dimen>
<dimen name="default_widget_padding">6dp</dimen>
<dimen name="navigation_line_width">10dp</dimen>
<dimen name="navigation_line_margin_left">30dp</dimen>
<dimen name="navigation_line_margin_top">50dp</dimen>
<dimen name="navigation_line_margin_right">80dp</dimen>
<dimen name="navigation_line_margin_bottom">30dp</dimen>
</resources>