在项目中用到地图的地方往往会有导航功能,那么这一节将介绍一下使用高德地图来实现驾车路线规划的功能。

首先来两张示例图供参考:

           

接下来还是直接上代码更直观

建立DriverRouteActivity.java主程序类

package com.junto.gdmaptest.routeactivity;import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;import com.amap.api.maps.AMap;
import com.amap.api.maps.MapView;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.services.core.AMapException;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.route.BusRouteResult;
import com.amap.api.services.route.DrivePath;
import com.amap.api.services.route.DriveRouteResult;
import com.amap.api.services.route.RideRouteResult;
import com.amap.api.services.route.RouteSearch;
import com.amap.api.services.route.WalkRouteResult;
import com.junto.gdmaptest.R;
import com.junto.gdmaptest.overlay.DrivingRouteOverlay;
import com.junto.gdmaptest.util.AMapUtil;/*** Created by WangJinyong on 2018/10/30.* 驾车路线规划*/public class DriveRouteActivity extends Activity implements RouteSearch.OnRouteSearchListener {private AMap aMap;private MapView mapView;private LatLonPoint mStartPoint = new LatLonPoint(39.942295,116.335891);//起点private LatLonPoint mEndPoint = new LatLonPoint(39.995576,116.481288);//终点private RouteSearch mRouteSearch;private DriveRouteResult mDriveRouteResult;private final int ROUTE_TYPE_DRIVE = 2;private ProgressDialog progDialog = null;// 搜索时进度条private RelativeLayout mBottomLayout;private TextView mRotueTimeDes, mRouteDetailDes;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_driveroute);//获取地图控件引用mapView = findViewById(R.id.route_map);//在activity执行onCreat时执行mapView.onCreate(savedInstanceState),创建地图,必需要写的mapView.onCreate(savedInstanceState);initView();setfromandtoMarker();searchRouteResult(ROUTE_TYPE_DRIVE, RouteSearch.DrivingDefault);}@Overrideprotected void onResume() {super.onResume();mapView.onResume();}@Overrideprotected void onPause() {super.onPause();mapView.onPause();}@Overrideprotected void onDestroy() {super.onDestroy();mapView.onDestroy();}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);mapView.onSaveInstanceState(outState);}private void initView(){//初始化AMap对象if (aMap == null) {aMap = mapView.getMap();}mRouteSearch = new RouteSearch(this);mRouteSearch.setRouteSearchListener(this);mBottomLayout = findViewById(R.id.bottom_layout);mRotueTimeDes = findViewById(R.id.firstline);mRouteDetailDes = findViewById(R.id.secondline);}private void setfromandtoMarker() {aMap.addMarker(new MarkerOptions().position(AMapUtil.convertToLatLng(mStartPoint)).icon(BitmapDescriptorFactory.fromResource(R.mipmap.start)));aMap.addMarker(new MarkerOptions().position(AMapUtil.convertToLatLng(mEndPoint)).icon(BitmapDescriptorFactory.fromResource(R.mipmap.end)));}/*** 显示进度框*/private void showProgressDialog() {if (progDialog == null)progDialog = new ProgressDialog(this);progDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);progDialog.setIndeterminate(false);progDialog.setCancelable(true);progDialog.setMessage("正在搜索");progDialog.show();}/*** 隐藏进度框*/private void dissmissProgressDialog() {if (progDialog != null) {progDialog.dismiss();}}/*** 开始搜索路径规划方案*/public void searchRouteResult(int routeType, int mode) {if (mStartPoint == null) {Toast.makeText(this,"定位中,稍后再试...",Toast.LENGTH_SHORT).show();return;}if (mEndPoint == null) {Toast.makeText(this,"终点未设置",Toast.LENGTH_SHORT).show();}showProgressDialog();final RouteSearch.FromAndTo fromAndTo = new RouteSearch.FromAndTo(mStartPoint, mEndPoint);if (routeType == ROUTE_TYPE_DRIVE) {// 驾车路径规划RouteSearch.DriveRouteQuery query = new RouteSearch.DriveRouteQuery(fromAndTo, mode, null,null, "");// 第一个参数表示路径规划的起点和终点,第二个参数表示驾车模式,第三个参数表示途经点,第四个参数表示避让区域,第五个参数表示避让道路mRouteSearch.calculateDriveRouteAsyn(query);// 异步路径规划驾车模式查询}}/*** 公交路线搜索结果方法回调*/@Overridepublic void onBusRouteSearched(BusRouteResult busRouteResult, int i) {}/*** 驾车路线搜索结果方法回调*/@Overridepublic void onDriveRouteSearched(DriveRouteResult result, int errorCode) {dissmissProgressDialog();aMap.clear();// 清理地图上的所有覆盖物if (errorCode == AMapException.CODE_AMAP_SUCCESS) {if (result != null && result.getPaths() != null) {if (result.getPaths().size() > 0) {mDriveRouteResult = result;final DrivePath drivePath = mDriveRouteResult.getPaths().get(0);DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(this, aMap, drivePath,mDriveRouteResult.getStartPos(),mDriveRouteResult.getTargetPos(), null);drivingRouteOverlay.setNodeIconVisibility(false);//设置节点marker是否显示drivingRouteOverlay.setIsColorfulline(true);//是否用颜色展示交通拥堵情况,默认truedrivingRouteOverlay.removeFromMap();drivingRouteOverlay.addToMap();drivingRouteOverlay.zoomToSpan();int dis = (int) drivePath.getDistance();int dur = (int) drivePath.getDuration();String des = AMapUtil.getFriendlyTime(dur)+"("+AMapUtil.getFriendlyLength(dis)+")";mRotueTimeDes.setText(des);mRouteDetailDes.setVisibility(View.VISIBLE);int taxiCost = (int) mDriveRouteResult.getTaxiCost();mRouteDetailDes.setText("打车约"+taxiCost+"元");mBottomLayout.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(DriveRouteActivity.this,DriveRouteDetailActivity.class);intent.putExtra("drive_path", drivePath);intent.putExtra("drive_result",mDriveRouteResult);startActivity(intent);}});} else if (result != null && result.getPaths() == null) {Toast.makeText(this,"对不起,没有搜索到相关数据!",Toast.LENGTH_SHORT).show();}} else {Toast.makeText(this,"对不起,没有搜索到相关数据!",Toast.LENGTH_SHORT).show();}} else {Toast.makeText(this,errorCode,Toast.LENGTH_SHORT).show();}}/*** 步行路线搜索结果方法回调*/@Overridepublic void onWalkRouteSearched(WalkRouteResult walkRouteResult, int i) {}/*** 骑行路线搜索结果方法回调*/@Overridepublic void onRideRouteSearched(RideRouteResult rideRouteResult, int i) {}
}

布局文件activity_driveroute.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><RelativeLayoutandroid:id="@+id/bottom_layout"android:layout_width="match_parent"android:layout_height="70dp"android:layout_alignParentBottom="true"android:padding="5dp"android:background="@color/gray_lite"android:gravity="center_vertical"android:visibility="visible" ><TextViewandroid:id="@+id/firstline"android:layout_width="wrap_content"android:layout_height="35dp"android:layout_marginLeft="12dp"android:singleLine="true"android:textColor="#333333"android:textSize="16sp" /><TextViewandroid:id="@+id/secondline"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/firstline"android:layout_marginLeft="12dp"android:gravity="right"android:singleLine="true"android:textColor="#999999"android:textSize="13sp"android:visibility="visible"/><LinearLayoutandroid:id="@+id/detail"android:layout_width="wrap_content"android:layout_height="35dp"android:layout_alignParentRight="true"android:layout_marginRight="10dp"android:orientation="horizontal"android:gravity="center_vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="center_vertical"android:text="详情"android:textColor="@color/blue"android:textSize="14sp" /><Buttonandroid:layout_width="7dp"android:layout_height="13dp"android:layout_marginLeft="4dp"android:background="@mipmap/arrow_right_blue"android:gravity="center_vertical" /></LinearLayout></RelativeLayout><com.amap.api.maps.MapViewandroid:id="@+id/route_map"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_above="@id/bottom_layout" ></com.amap.api.maps.MapView></RelativeLayout>

跳转到路线详情页的类DriveRouteDetailActivity.java

package com.junto.gdmaptest.routeactivity;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.View;
import android.widget.ListView;
import android.widget.TextView;import com.amap.api.services.route.DrivePath;
import com.amap.api.services.route.DriveRouteResult;
import com.amap.api.services.route.DriveStep;
import com.amap.api.services.route.TMC;
import com.junto.gdmaptest.R;
import com.junto.gdmaptest.util.AMapUtil;import java.util.List;/*** Created by WangJinyong on 2018/10/31.* 公交路线详情*/public class DriveRouteDetailActivity extends Activity {private DrivePath mDrivePath;private DriveRouteResult mDriveRouteResult;private TextView mTitle, mTitleDriveRoute, mDesDriveRoute;private ListView mDriveSegmentList;private DriveSegmentListAdapter mDriveSegmentListAdapter;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_driveroutedetail);getIntentData();init();}private void getIntentData() {Intent intent = getIntent();if (intent == null) {return;}mDrivePath = intent.getParcelableExtra("drive_path");mDriveRouteResult = intent.getParcelableExtra("drive_result");}private void init() {mTitle = findViewById(R.id.title_center);mTitleDriveRoute = findViewById(R.id.firstline);mDesDriveRoute = findViewById(R.id.secondline);mTitle.setText("驾车路线详情");String dur = AMapUtil.getFriendlyTime((int) mDrivePath.getDuration());String dis = AMapUtil.getFriendlyLength((int) mDrivePath.getDistance());mTitleDriveRoute.setText(dur + "(" + dis + ")");int taxiCost = (int) mDriveRouteResult.getTaxiCost();mDesDriveRoute.setText("打车约"+taxiCost+"元");mDesDriveRoute.setVisibility(View.VISIBLE);configureListView();}private void configureListView() {mDriveSegmentList = findViewById(R.id.bus_segment_list);mDriveSegmentListAdapter = new DriveSegmentListAdapter(this.getApplicationContext(), mDrivePath.getSteps());mDriveSegmentList.setAdapter(mDriveSegmentListAdapter);}public void onBackClick(View view) {this.finish();}
}

详情页的布局文件:activity_driveroutedetail.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/act_background"android:orientation="vertical"><RelativeLayoutandroid:id="@+id/route_title"android:layout_width="match_parent"android:layout_height="44dp"><LinearLayoutandroid:id="@+id/title_back"android:layout_width="70dp"android:layout_height="match_parent"android:layout_alignParentLeft="true"android:layout_alignParentStart="true"android:descendantFocusability="beforeDescendants"android:gravity="center_vertical"android:onClick="onBackClick"android:orientation="vertical"android:paddingLeft="5dp"android:paddingStart="5dp"><ImageViewandroid:layout_width="30dp"android:layout_height="match_parent"android:clickable="false"android:scaleType="center"android:src="@mipmap/back" /></LinearLayout><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="match_parent"android:layout_centerInParent="true"android:gravity="center"android:orientation="vertical"><TextViewandroid:id="@+id/title_center"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text=""android:textColor="@color/black"android:textSize="15sp"android:textStyle="bold" /></LinearLayout></RelativeLayout><LinearLayoutandroid:id="@+id/bus_path"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="70dp"android:background="@color/phone_bg"android:gravity="center_vertical"android:orientation="vertical"android:padding="5dp"><TextViewandroid:id="@+id/firstline"android:layout_width="wrap_content"android:layout_height="35dp"android:layout_marginLeft="12dp"android:singleLine="true"android:textColor="#333333"android:textSize="16sp" /><TextViewandroid:id="@+id/secondline"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/firstline"android:layout_marginLeft="12dp"android:gravity="right"android:singleLine="true"android:textColor="#999999"android:textSize="13sp"android:visibility="gone" /></LinearLayout><ImageViewandroid:layout_width="match_parent"android:layout_height="1dp"android:background="#e0e0e0" /><ListViewandroid:id="@+id/bus_segment_list"android:layout_width="match_parent"android:layout_height="match_parent"android:cacheColorHint="@color/transparent"android:divider="@color/transparent"android:fadingEdge="none"android:fadingEdgeLength="0dp"android:footerDividersEnabled="false"android:headerDividersEnabled="false"android:listSelector="@color/transparent"></ListView></LinearLayout></LinearLayout>

详情页用到了列表,列表的Adapter

package com.junto.gdmaptest.routeactivity;import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;import com.amap.api.services.route.DriveStep;
import com.junto.gdmaptest.R;
import com.junto.gdmaptest.util.AMapUtil;import java.util.ArrayList;
import java.util.List;/*** 驾车路线详情页adapter* @author ligen*/
public class DriveSegmentListAdapter extends BaseAdapter {private Context mContext;private List<DriveStep> mItemList = new ArrayList<DriveStep>();public DriveSegmentListAdapter(Context context, List<DriveStep> list) {this.mContext = context;mItemList.add(new DriveStep());for (DriveStep driveStep : list) {mItemList.add(driveStep);}mItemList.add(new DriveStep());}@Overridepublic int getCount() {return mItemList.size();}@Overridepublic Object getItem(int position) {return mItemList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder = null;if (convertView == null) {holder = new ViewHolder();convertView = View.inflate(mContext, R.layout.item_bus_segment, null);holder.driveDirIcon = convertView.findViewById(R.id.bus_dir_icon);holder.driveLineName = convertView.findViewById(R.id.bus_line_name);holder.driveDirUp = convertView.findViewById(R.id.bus_dir_icon_up);holder.driveDirDown = convertView.findViewById(R.id.bus_dir_icon_down);holder.splitLine = convertView.findViewById(R.id.bus_seg_split_line);convertView.setTag(holder);} else {holder = (ViewHolder) convertView.getTag();}final DriveStep item = mItemList.get(position);if (position == 0) {holder.driveDirIcon.setImageResource(R.mipmap.dir_start);holder.driveLineName.setText("出发");holder.driveDirUp.setVisibility(View.GONE);holder.driveDirDown.setVisibility(View.VISIBLE);holder.splitLine.setVisibility(View.GONE);return convertView;} else if (position == mItemList.size() - 1) {holder.driveDirIcon.setImageResource(R.mipmap.dir_end);holder.driveLineName.setText("到达终点");holder.driveDirUp.setVisibility(View.VISIBLE);holder.driveDirDown.setVisibility(View.GONE);holder.splitLine.setVisibility(View.VISIBLE);return convertView;} else {String actionName = item.getAction();int resID = AMapUtil.getDriveActionID(actionName);holder.driveDirIcon.setImageResource(resID);holder.driveLineName.setText(item.getInstruction());holder.driveDirUp.setVisibility(View.VISIBLE);holder.driveDirDown.setVisibility(View.VISIBLE);holder.splitLine.setVisibility(View.VISIBLE);return convertView;}}private class ViewHolder {TextView driveLineName;ImageView driveDirIcon;ImageView driveDirUp;ImageView driveDirDown;ImageView splitLine;}
}

列表的行布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/white" ><ImageViewandroid:id="@+id/bus_seg_split_line"android:layout_width="match_parent"android:layout_height="1dp"android:layout_marginLeft="50dp"android:layout_marginStart="50dp"android:background="#e0e0e0"/><RelativeLayoutandroid:id="@+id/bus_route_direction"android:layout_width="wrap_content"android:layout_height="44dp"android:layout_alignParentLeft="true"android:layout_alignParentStart="true"android:layout_marginLeft="11dp"android:layout_marginStart="11dp" ><ImageViewandroid:id="@+id/bus_dir_icon"android:layout_width="22dp"android:layout_height="wrap_content"android:layout_centerVertical="true"android:src="@mipmap/dir_start" /><ImageViewandroid:id="@+id/bus_dir_icon_up"android:layout_width="2dp"android:layout_height="match_parent"android:layout_above="@id/bus_dir_icon"android:layout_centerHorizontal="true"android:background="#b6b6b6"android:visibility="gone"/><ImageViewandroid:id="@+id/bus_dir_icon_down"android:layout_width="2dp"android:layout_height="match_parent"android:layout_below="@id/bus_dir_icon"android:layout_centerHorizontal="true"android:background="#b6b6b6" android:visibility="gone"/></RelativeLayout><RelativeLayoutandroid:id="@+id/bus_item"android:layout_width="match_parent"android:layout_height="44dp" ><RelativeLayoutandroid:id="@+id/stationinfo"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_centerVertical="true"android:layout_alignParentEnd="true"android:layout_alignParentRight="true"><ImageViewandroid:id="@+id/bus_expand_image"android:layout_width="25dp"android:layout_height="match_parent"android:layout_alignParentEnd="true"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginEnd="6dp"android:layout_marginRight="6dp"android:clickable="true"android:scaleType="centerInside"android:src="@mipmap/down"android:visibility="gone" /><TextViewandroid:id="@+id/bus_station_num"android:layout_width="wrap_content"android:layout_height="match_parent"android:layout_centerVertical="true"android:layout_toLeftOf="@id/bus_expand_image"android:layout_toStartOf="@id/bus_expand_image"android:gravity="center_vertical"android:textColor="@color/blue"android:textSize="12sp"android:visibility="gone" ></TextView></RelativeLayout><TextViewandroid:id="@+id/bus_line_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginLeft="50dp"android:layout_marginStart="50dp"android:layout_marginRight="70dp"android:layout_marginEnd="70dp"android:textColor="#333333"android:text="出发"android:textSize="14sp" /></RelativeLayout><LinearLayoutandroid:id="@+id/expand_content"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/bus_item"android:orientation="vertical"></LinearLayout>
</RelativeLayout>

以上内容即为两点间的驾车路线规划以及路线详情。

出行路线规划还有公交路线规划、步行路线规划、骑行路线规划,实现这些功能都是要实现RouteSearch.OnRouteSearchListener接口,在对应的回调方法里实现功能就行了

    /*** 公交路线搜索结果方法回调*/@Overridepublic void onBusRouteSearched(BusRouteResult busRouteResult, int i) {dissmissProgressDialog();aMap.clear();// 清理地图上的所有覆盖物if (errorCode == AMapException.CODE_AMAP_SUCCESS) {if (result != null && result.getPaths() != null) {if (result.getPaths().size() > 0) {mBusRouteResult = result;BusResultListAdapter mBusResultListAdapter = new BusResultListAdapter(mContext, mBusRouteResult);mBusResultList.setAdapter(mBusResultListAdapter);      } else if (result != null && result.getPaths() == null) {ToastUtil.show(mContext, R.string.no_result);}} else {ToastUtil.show(mContext, R.string.no_result);}} else {ToastUtil.showerror(this.getApplicationContext(), errorCode);}}/*** 步行路线搜索结果方法回调*/@Overridepublic void onWalkRouteSearched(WalkRouteResult walkRouteResult, int i) {dissmissProgressDialog();aMap.clear();// 清理地图上的所有覆盖物if (errorCode == AMapException.CODE_AMAP_SUCCESS) {if (result != null && result.getPaths() != null) {if (result.getPaths().size() > 0) {mWalkRouteResult = result;final WalkPath walkPath = mWalkRouteResult.getPaths().get(0);WalkRouteOverlay walkRouteOverlay = new WalkRouteOverlay(this, aMap, walkPath,mWalkRouteResult.getStartPos(),mWalkRouteResult.getTargetPos());walkRouteOverlay.removeFromMap();walkRouteOverlay.addToMap();walkRouteOverlay.zoomToSpan();mBottomLayout.setVisibility(View.VISIBLE);int dis = (int) walkPath.getDistance();int dur = (int) walkPath.getDuration();String des = AMapUtil.getFriendlyTime(dur)+"("+AMapUtil.getFriendlyLength(dis)+")";mRotueTimeDes.setText(des);mRouteDetailDes.setVisibility(View.GONE);mBottomLayout.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(mContext,WalkRouteDetailActivity.class);intent.putExtra("walk_path", walkPath);intent.putExtra("walk_result",mWalkRouteResult);startActivity(intent);}});} else if (result != null && result.getPaths() == null) {ToastUtil.show(mContext, R.string.no_result);}} else {ToastUtil.show(mContext, R.string.no_result);}} else {ToastUtil.showerror(this.getApplicationContext(), errorCode);}}/*** 骑行路线搜索结果方法回调*/@Overridepublic void onRideRouteSearched(RideRouteResult rideRouteResult, int i) {dissmissProgressDialog();aMap.clear();// 清理地图上的所有覆盖物if (errorCode == AMapException.CODE_AMAP_SUCCESS) {if (result != null && result.getPaths() != null) {if (result.getPaths().size() > 0) {mRideRouteResult = result;final RidePath ridePath = mRideRouteResult.getPaths().get(0);RideRouteOverlay rideRouteOverlay = new RideRouteOverlay(this, aMap, ridePath,mRideRouteResult.getStartPos(),mRideRouteResult.getTargetPos());rideRouteOverlay.removeFromMap();rideRouteOverlay.addToMap();rideRouteOverlay.zoomToSpan();mBottomLayout.setVisibility(View.VISIBLE);int dis = (int) ridePath.getDistance();int dur = (int) ridePath.getDuration();String des = AMapUtil.getFriendlyTime(dur)+"("+AMapUtil.getFriendlyLength(dis)+")";mRotueTimeDes.setText(des);mRouteDetailDes.setVisibility(View.GONE);mBottomLayout.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(mContext,RideRouteDetailActivity.class);intent.putExtra("ride_path", ridePath);intent.putExtra("ride_result",mRideRouteResult);startActivity(intent);}});} else if (result != null && result.getPaths() == null) {ToastUtil.show(mContext, R.string.no_result);}} else {ToastUtil.show(mContext, R.string.no_result);}} else {ToastUtil.showerror(this.getApplicationContext(), errorCode);}}

补充少加的一个类: AMapUtil

/*** */
package com.junto.gdmaptest.util;import android.text.Html;
import android.text.Spanned;
import android.widget.EditText;import com.amap.api.maps.model.LatLng;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.route.BusPath;
import com.amap.api.services.route.BusStep;
import com.amap.api.services.route.RouteBusLineItem;
import com.amap.api.services.route.RouteRailwayItem;
import com.junto.gdmaptest.R;import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;public class AMapUtil {/*** 判断edittext是否null*/public static String checkEditText(EditText editText) {if (editText != null && editText.getText() != null&& !(editText.getText().toString().trim().equals(""))) {return editText.getText().toString().trim();} else {return "";}}public static Spanned stringToSpan(String src) {return src == null ? null : Html.fromHtml(src.replace("\n", "<br />"));}public static String colorFont(String src, String color) {StringBuffer strBuf = new StringBuffer();strBuf.append("<font color=").append(color).append(">").append(src).append("</font>");return strBuf.toString();}public static String makeHtmlNewLine() {return "<br />";}public static String makeHtmlSpace(int number) {final String space = "&nbsp;";StringBuilder result = new StringBuilder();for (int i = 0; i < number; i++) {result.append(space);}return result.toString();}public static String getFriendlyLength(int lenMeter) {if (lenMeter > 10000) // 10 km{int dis = lenMeter / 1000;return dis + ChString.Kilometer;}if (lenMeter > 1000) {float dis = (float) lenMeter / 1000;DecimalFormat fnum = new DecimalFormat("##0.0");String dstr = fnum.format(dis);return dstr + ChString.Kilometer;}if (lenMeter > 100) {int dis = lenMeter / 50 * 50;return dis + ChString.Meter;}int dis = lenMeter / 10 * 10;if (dis == 0) {dis = 10;}return dis + ChString.Meter;}public static boolean IsEmptyOrNullString(String s) {return (s == null) || (s.trim().length() == 0);}/*** 把LatLng对象转化为LatLonPoint对象*/public static LatLonPoint convertToLatLonPoint(LatLng latlon) {return new LatLonPoint(latlon.latitude, latlon.longitude);}/*** 把LatLonPoint对象转化为LatLon对象*/public static LatLng convertToLatLng(LatLonPoint latLonPoint) {return new LatLng(latLonPoint.getLatitude(), latLonPoint.getLongitude());}/*** 把集合体的LatLonPoint转化为集合体的LatLng*/public static ArrayList<LatLng> convertArrList(List<LatLonPoint> shapes) {ArrayList<LatLng> lineShapes = new ArrayList<LatLng>();for (LatLonPoint point : shapes) {LatLng latLngTemp = AMapUtil.convertToLatLng(point);lineShapes.add(latLngTemp);}return lineShapes;}/*** long类型时间格式化*/public static String convertToTime(long time) {SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date = new Date(time);return df.format(date);}public static final String HtmlBlack = "#000000";public static final String HtmlGray = "#808080";public static String getFriendlyTime(int second) {if (second > 3600) {int hour = second / 3600;int miniate = (second % 3600) / 60;return hour + "小时" + miniate + "分钟";}if (second >= 60) {int miniate = second / 60;return miniate + "分钟";}return second + "秒";}//路径规划方向指示和图片对应public static int getDriveActionID(String actionName) {if (actionName == null || actionName.equals("")) {return R.mipmap.dir3;}if ("左转".equals(actionName)) {return R.mipmap.dir2;}if ("右转".equals(actionName)) {return R.mipmap.dir1;}if ("向左前方行驶".equals(actionName) || "靠左".equals(actionName)) {return R.mipmap.dir6;}if ("向右前方行驶".equals(actionName) || "靠右".equals(actionName)) {return R.mipmap.dir5;}if ("向左后方行驶".equals(actionName) || "左转调头".equals(actionName)) {return R.mipmap.dir7;}if ("向右后方行驶".equals(actionName)) {return R.mipmap.dir8;}if ("直行".equals(actionName)) {return R.mipmap.dir3;}if ("减速行驶".equals(actionName)) {return R.mipmap.dir4;}return R.mipmap.dir3;}public static int getWalkActionID(String actionName) {if (actionName == null || actionName.equals("")) {return R.mipmap.dir13;}if ("左转".equals(actionName)) {return R.mipmap.dir2;}if ("右转".equals(actionName)) {return R.mipmap.dir1;}if ("向左前方".equals(actionName) || "靠左".equals(actionName) || actionName.contains("向左前方")) {return R.mipmap.dir6;}if ("向右前方".equals(actionName) || "靠右".equals(actionName) || actionName.contains("向右前方")) {return R.mipmap.dir5;}if ("向左后方".equals(actionName)|| actionName.contains("向左后方")) {return R.mipmap.dir7;}if ("向右后方".equals(actionName)|| actionName.contains("向右后方")) {return R.mipmap.dir8;}if ("直行".equals(actionName)) {return R.mipmap.dir3;}if ("通过人行横道".equals(actionName)) {return R.mipmap.dir9;}if ("通过过街天桥".equals(actionName)) {return R.mipmap.dir11;}if ("通过地下通道".equals(actionName)) {return R.mipmap.dir10;}return R.mipmap.dir13;}public static String getBusPathTitle(BusPath busPath) {if (busPath == null) {return String.valueOf("");}List<BusStep> busSetps = busPath.getSteps();if (busSetps == null) {return String.valueOf("");}StringBuffer sb = new StringBuffer();for (BusStep busStep : busSetps) {StringBuffer title = new StringBuffer();if (busStep.getBusLines().size() > 0) {for (RouteBusLineItem busline : busStep.getBusLines()) {if (busline == null) {continue;}String buslineName = getSimpleBusLineName(busline.getBusLineName());title.append(buslineName);title.append(" / ");}
//                  RouteBusLineItem busline = busStep.getBusLines().get(0);sb.append(title.substring(0, title.length() - 3));sb.append(" > ");}if (busStep.getRailway() != null) {RouteRailwayItem railway = busStep.getRailway();sb.append(railway.getTrip()+"("+railway.getDeparturestop().getName()+" - "+railway.getArrivalstop().getName()+")");sb.append(" > ");}}return sb.substring(0, sb.length() - 3);}public static String getBusPathDes(BusPath busPath) {if (busPath == null) {return String.valueOf("");}long second = busPath.getDuration();String time = getFriendlyTime((int) second);float subDistance = busPath.getDistance();String subDis = getFriendlyLength((int) subDistance);float walkDistance = busPath.getWalkDistance();String walkDis = getFriendlyLength((int) walkDistance);return String.valueOf(time + " | " + subDis + " | 步行" + walkDis);}public static String getSimpleBusLineName(String busLineName) {if (busLineName == null) {return String.valueOf("");}return busLineName.replaceAll("\\(.*?\\)", "");}}

本节实现了路线规划功能,下一节我们再来实现路线导航功能。

有好多朋友想要Demo,为了方便,我刚刚把Demo上传了,下面是下载地址:

https://download.csdn.net/download/u013184970/11945615

(六)高德地图之驾车路线规划相关推荐

  1. android高德地图api驾车路线规划,驾车路径规划-调起高德地图-示例中心-JS API 示例 | 高德地图API...

    html,body,#container{ height:100%; } .btn{ position: fixed; bottom: 20px; right: 20px; background-co ...

  2. android高德地图api驾车路线规划,规划结果 + 驾车路线绘制

    html, body, #container { width: 100%; height: 100%; } 规划结果 + 驾车路线绘制 var map = new AMap.Map("con ...

  3. android高德地图api驾车路线规划,可拖拽驾车路线规划

    可拖拽的路线规划 html, body, #container { width: 100%; height: 100%; } 请拖拽路径试试 var map, route, marker; //基本地 ...

  4. 高德地图WebAPI : 驾车路径规划

    参考API 一个demo 获取路径规划返回结果中的两点间最短驾车距离 import java.io.BufferedReader; import java.io.BufferedReader; imp ...

  5. java 高德地图路线规划_高德地图api之路线规划

    1.引入 2.创建并初始化实例对象 const map = new AMap.Map("container") 3.创建一个导航元素,用来承载导航路线(这里不要忘了,是个坑,用的啥 ...

  6. 百度地图的驾车路线规划

    属性 属性名 类型 默认值 描述 location String, Point, None location表示检索区域,其类型可为空.坐标点或城市名称的字符串.当参数为空时,检索位置由当前地图中心点 ...

  7. 高德地图的汽车路线规划的路线颜色样式更改

    高德用的汽车路线规划,动画回放的功能,路线颜色改不了,粗细也改不了,所以会很丑.甲方爸爸很生气,后果很严重!!! 先来欣赏一下改之前的长什么样 然后改之后看看: 是不是好看很多!!! 只贴部分代码片段 ...

  8. 高德地图做汽车路线规划的时候清除之前的路线

    在做这个汽车路线规划的时候遇到的问题:就是汽车位置到起点的路线,然后变成汽车位置从起点至终点,那么汽车位置到起点的路线没有清除,还留在上面,要强制刷新页面才能清除!这样当然是不行的!!! 解决办法就是 ...

  9. React使用百度地图实现驾车路线规划

    1.创建基本地图 <Map center={{ lng, lat }} zoom="11" style={{ height: '39vh'}} enableScrollWhe ...

最新文章

  1. C# checked、unchecked操作符
  2. opencv-python视频处理之白闪效果
  3. 联想电脑怎么进入Android,联想电脑怎么连接手机
  4. C#中创建圆形/按钮(使用重绘)
  5. 为啥有的人能受穷,却不能吃苦?
  6. Static 单例模式
  7. linux ulipad,如何在windows下安装配置python工具Ulipad
  8. WebApp最佳实践用户体验篇:针对多种屏幕尺寸合理设计
  9. mean-shift均值偏移算法
  10. Python——青蛙旅行项目
  11. 对销售代表的100个忠告
  12. Javascript正则表达式表示固定开头和结尾的字符串
  13. could not resolve dependency: npm err! peer react@“^16.8.0 || ^17.0.0“ from @material-ui/core@4.12.4
  14. 200个SOLIDWORKS使用技巧
  15. javascript百炼成仙 第一章 掌握JavaScript基础1.8 对象的取值
  16. 生态圈——小组制组织结构思考
  17. 彩涂板废气处理吸附工艺
  18. 机器人学习NO2.导航和路径规划
  19. larver php7.0,关于PHP7.0与PHP5.6下Laravel博客应用性能对比分析详解
  20. 微软修复Win7 SP1安装时出现的黑屏错误“0xC0000009A”

热门文章

  1. Adobe Photoshop CS5.1 Extended 12.1中文特别版
  2. 2021年部分漏洞整合+检测工具
  3. matlab消除泊松噪声,基于自适应噪声方差估计的去除泊松噪声的算法.PDF
  4. 详细设计说明书(GB8567——88)
  5. 简要介绍语音识别技术在各领域的应用
  6. linux如何关闭硬件加速,启用硬件加速是什么意思?如何关闭【详解】
  7. matlab怎么读取指定坐标的RGB值
  8. 在地址栏上输入一个url,到这个页面呈现出来,中间会发生什么?
  9. 计算机系学不学工程力学,工程力学专业属于什么门类
  10. Android USB开发小结:host模式与accessory模式