分享

百度地图api之路线规划

 AI科技馆 2018-07-25

2016年09月23日 14:49:02

百度地图的路线规划还是比较容易的,需要注意的就是实现OnGetRoutePlanResultListener接口。

会重写四个方法

  1. <span style="font-family:SimSun;"> void onGetWalkingRouteResult(WalkingRouteResult var1);

  2. void onGetTransitRouteResult(TransitRouteResult var1);

  3. void onGetDrivingRouteResult(DrivingRouteResult var1);

  4. void onGetBikingRouteResult(BikingRouteResult var1);</span>
没看懂没关系,下边我会一一解说

1.

<span style="font-family:SimSun;">void onGetWalkingRouteResult(WalkingRouteResult var1);</span>
这个方法是用来写不行路线规划的,var1则是百度返回的路线数据了

2.

<span style="font-family:SimSun;">void onGetTransitRouteResult(TransitRouteResult var1);</span>
这个则是乘车路线,包含公交,地铁,不行,以及以后的飞机,火车等,想想,我的哥,好厉害呦

3.

<span style="font-family:SimSun;">void onGetDrivingRouteResult(DrivingRouteResult var1);</span>
这个是自驾路线

4.

<span style="font-family:SimSun;">void onGetBikingRouteResult(BikingRouteResult var1);</span>

这个方法就是咱们经常说的绿色环保无污染的交通工具自行车了

当然还有需要注意的就是MyTransitRouteOverlay和MyWalkingRouteOverlay这两个类,这分别是自定义的,运用的是自己的起点和终点的图片,当然,如果你想用系统的,我也拦不住你,对不撒

  1. <span style="font-family:SimSun;"> private class MyWalkingRouteOverlay extends WalkingRouteOverlay {

  2. public MyWalkingRouteOverlay(BaiduMap baiduMap) {
  3. super(baiduMap);
  4. }

  5. @Override
  6. public BitmapDescriptor getStartMarker() {
  7. if (useDefaultIcon) {
  8. return BitmapDescriptorFactory.fromResource(R.drawable.icon_st);
  9. }
  10. return null;
  11. }

  12. @Override
  13. public BitmapDescriptor getTerminalMarker() {
  14. if (useDefaultIcon) {
  15. return BitmapDescriptorFactory.fromResource(R.drawable.icon_en);
  16. }
  17. return null;
  18. }
  19. }</span>

  1. <span style="font-family:SimSun;"> private class MyTransitRouteOverlay extends TransitRouteOverlay {

  2. public MyTransitRouteOverlay(BaiduMap baiduMap) {
  3. super(baiduMap);
  4. }

  5. @Override
  6. public BitmapDescriptor getStartMarker() {
  7. if (useDefaultIcon) {
  8. return BitmapDescriptorFactory.fromResource(R.drawable.icon_st);
  9. }
  10. return null;
  11. }

  12. @Override
  13. public BitmapDescriptor getTerminalMarker() {
  14. if (useDefaultIcon) {
  15. return BitmapDescriptorFactory.fromResource(R.drawable.icon_en);
  16. }
  17. return null;
  18. }
  19. }</span>

恩就是这么简单,其他的已经没有什么了,好了,废话不多说了,直接上代码,注释已经写的差不多了

activity类

  1. <span style="font-family:SimSun;">import android.app.Activity;
  2. import android.app.Dialog;
  3. import android.content.Context;
  4. import android.os.Bundle;
  5. import android.view.View;
  6. import android.view.Window;
  7. import android.widget.AdapterView;
  8. import android.widget.Button;
  9. import android.widget.EditText;
  10. import android.widget.ListView;
  11. import android.widget.Toast;

  12. import com.baidu.mapapi.map.BaiduMap;
  13. import com.baidu.mapapi.map.BitmapDescriptor;
  14. import com.baidu.mapapi.map.BitmapDescriptorFactory;
  15. import com.baidu.mapapi.map.MapPoi;
  16. import com.baidu.mapapi.map.MapView;
  17. import com.baidu.mapapi.model.LatLng;
  18. import com.baidu.mapapi.search.core.RouteLine;
  19. import com.baidu.mapapi.search.core.SearchResult;
  20. import com.baidu.mapapi.search.route.BikingRouteResult;
  21. import com.baidu.mapapi.search.route.DrivingRoutePlanOption;
  22. import com.baidu.mapapi.search.route.DrivingRouteResult;
  23. import com.baidu.mapapi.search.route.OnGetRoutePlanResultListener;
  24. import com.baidu.mapapi.search.route.PlanNode;
  25. import com.baidu.mapapi.search.route.RoutePlanSearch;
  26. import com.baidu.mapapi.search.route.TransitRoutePlanOption;
  27. import com.baidu.mapapi.search.route.TransitRouteResult;
  28. import com.baidu.mapapi.search.route.WalkingRoutePlanOption;
  29. import com.baidu.mapapi.search.route.WalkingRouteResult;
  30. import com.demo.demo_location.mapapi.overlayutil.DrivingRouteOverlay;
  31. import com.demo.demo_location.mapapi.overlayutil.TransitRouteOverlay;
  32. import com.demo.demo_location.mapapi.overlayutil.WalkingRouteOverlay;

  33. import java.util.List;

  34. /**
  35. * Created by 李博 on 2016/9/22.
  36. */
  37. public class RouteLineActivity extends Activity implements
  38. View.OnClickListener, BaiduMap.OnMapClickListener,
  39. OnGetRoutePlanResultListener{

  40. private Button btn_walk;
  41. private Button btn_car;
  42. private Button btn_bus;
  43. private MapView mMapView;
  44. private EditText et_start;
  45. private EditText et_end;
  46. private BaiduMap mBaiduMap;
  47. //搜索服务类
  48. private RoutePlanSearch mSearch;

  49. //起点
  50. private PlanNode start;
  51. //终点
  52. private PlanNode end;

  53. private boolean useDefaultIcon = false;

  54. private RouteLine route;

  55. private TransitRouteResult nowResult = null;

  56. private DrivingRouteResult nowResultd = null;

  57. @Override
  58. protected void onCreate(Bundle savedInstanceState) {
  59. super.onCreate(savedInstanceState);
  60. setContentView(R.layout.soso_layout);
  61. btn_walk = (Button) findViewById(R.id.btn_walk);
  62. btn_car = (Button) findViewById(R.id.btn_car);
  63. btn_bus = (Button) findViewById(R.id.btn_bus);
  64. et_end = (EditText) findViewById(R.id.et_end);
  65. et_start = (EditText) findViewById(R.id.et_start);
  66. //地图初始化
  67. mMapView = (MapView) findViewById(R.id.mapView);
  68. mBaiduMap = mMapView.getMap();
  69. //点击事件
  70. btn_bus.setOnClickListener(this);
  71. btn_car.setOnClickListener(this);
  72. btn_walk.setOnClickListener(this);

  73. //地图点击事件
  74. mBaiduMap.setOnMapClickListener(this);
  75. //初始化搜索模块
  76. mSearch = RoutePlanSearch.newInstance();
  77. //搜索返回结果的事件 回调
  78. mSearch.setOnGetRoutePlanResultListener(this);

  79. }


  80. @Override
  81. public void onClick(View v) {
  82. switch (v.getId()){
  83. case R.id.btn_bus:
  84. setBtn_bus();
  85. break;
  86. case R.id.btn_car:
  87. setBtn_car();
  88. break;
  89. case R.id.btn_walk:
  90. setBtn_walk();
  91. break;

  92. }
  93. }
  94. /**步行*/
  95. private void setBtn_walk(){ //设置起点
  96. start = PlanNode.withCityNameAndPlaceName("北京", et_start.getText().toString());
  97. end = PlanNode.withCityNameAndPlaceName("北京", et_end.getText().toString());

  98. if(et_end.getText().toString().isEmpty() && et_start.getText().toString().isEmpty()){
  99. Toast.makeText(getApplicationContext(), "起点和终点不能为空", Toast.LENGTH_SHORT).show();
  100. } else {
  101. mSearch.walkingSearch(new WalkingRoutePlanOption()
  102. .from(start).to(end));
  103. }


  104. }
  105. /**自驾*/
  106. private void setBtn_car(){
  107. //设置起点
  108. start = PlanNode.withCityNameAndPlaceName("北京", et_start.getText().toString());
  109. end = PlanNode.withCityNameAndPlaceName("北京", et_end.getText().toString());
  110. if(et_end.getText().toString().isEmpty() && et_start.getText().toString().isEmpty()){
  111. Toast.makeText(getApplicationContext(), "起点和终点不能为空", Toast.LENGTH_SHORT).show();
  112. } else {
  113. mSearch.drivingSearch((new DrivingRoutePlanOption()).from(start).to(end));
  114. }
  115. }
  116. /**公交*/
  117. private void setBtn_bus(){
  118. //设置起点
  119. start = PlanNode.withCityNameAndPlaceName("北京", et_start.getText().toString());
  120. end = PlanNode.withCityNameAndPlaceName("北京", et_end.getText().toString());
  121. if(et_end.getText().toString().isEmpty() && et_start.getText().toString().isEmpty()){
  122. Toast.makeText(getApplicationContext(), "起点和终点不能为空", Toast.LENGTH_SHORT).show();
  123. } else {
  124. mSearch.transitSearch((new TransitRoutePlanOption())
  125. .from(start).city("北京").to(end));
  126. }
  127. }


  128. @Override
  129. public void onGetWalkingRouteResult(WalkingRouteResult result) {
  130. if(result == null || result.error != SearchResult.ERRORNO.NO_ERROR){
  131. Toast.makeText(getApplicationContext(), "未找到结果", Toast.LENGTH_SHORT).show();
  132. }
  133. if(result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR){
  134. // 起终点或途经点地址有岐义,通过以下接口获取建议查询信息
  135. // result.getSuggestAddrInfo()
  136. return ;
  137. }

  138. if(result.error == SearchResult.ERRORNO.NO_ERROR){

  139. route = result.getRouteLines().get(0);
  140. // TransitOverlay是baidu map api提供的用于在地图上显示公交换乘路线的Overlay
  141. WalkingRouteOverlay option = new MyWalkingRouteOverlay(mBaiduMap);
  142. mBaiduMap.setOnMarkerClickListener(option);

  143. option.setData(result.getRouteLines().get(0));
  144. option.addToMap();
  145. option.zoomToSpan();
  146. }


  147. }

  148. @Override
  149. public void onGetTransitRouteResult(final TransitRouteResult result) {

  150. if(result == null || result.error != SearchResult.ERRORNO.NO_ERROR){
  151. Toast.makeText(getApplicationContext(), "未找到结果", Toast.LENGTH_SHORT).show();
  152. }
  153. if(result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR){
  154. // 起终点或途经点地址有岐义,通过以下接口获取建议查询信息
  155. // result.getSuggestAddrInfo()
  156. return ;
  157. }

  158. if(result.error == SearchResult.ERRORNO.NO_ERROR){
  159. //线路条数 多于一条
  160. if(result.getRouteLines().size() > 1){

  161. MyTransitDlg myTransitDlg = new MyTransitDlg(RouteLineActivity.this, result.getRouteLines(),
  162. RouteLineAdapter.Type.TRANSIT_ROUTE);
  163. myTransitDlg.setOnItemInDlgClickLinster(new OnItemInDlgClickListener() {
  164. @Override
  165. public void onItemClick(int position) {
  166. TransitRouteOverlay overlay = new MyTransitRouteOverlay(mBaiduMap);
  167. mBaiduMap.setOnMarkerClickListener(overlay);
  168. overlay.setData(result.getRouteLines().get(position));
  169. overlay.addToMap();
  170. overlay.zoomToSpan();
  171. }
  172. });
  173. myTransitDlg.show();
  174. //线路只有一条
  175. } else if(result.getRouteLines().size() == 1){

  176. route = result.getRouteLines().get(0);
  177. TransitRouteOverlay overlay = new TransitRouteOverlay(mBaiduMap);
  178. mBaiduMap.setOnMarkerClickListener(overlay);
  179. overlay.setData(result.getRouteLines().get(0));
  180. overlay.addToMap();
  181. overlay.zoomToSpan();

  182. //没有线路
  183. } else {
  184. return ;
  185. }
  186. }
  187. }

  188. @Override
  189. public void onGetDrivingRouteResult(final DrivingRouteResult result) {
  190. if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
  191. Toast.makeText(getApplicationContext(), "抱歉,未找到结果", Toast.LENGTH_SHORT).show();
  192. }
  193. if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) {
  194. // 起终点或途经点地址有岐义,通过以下接口获取建议查询信息
  195. // result.getSuggestAddrInfo()
  196. return;
  197. }
  198. if (result.error == SearchResult.ERRORNO.NO_ERROR) {

  199. //线路多于一条
  200. if(result.getRouteLines().size() >1){
  201. nowResultd = result;

  202. MyTransitDlg myTransitDlg = new MyTransitDlg(RouteLineActivity.this,
  203. result.getRouteLines(), RouteLineAdapter.Type.DRIVING_ROUTE);
  204. myTransitDlg.setOnItemInDlgClickLinster(new OnItemInDlgClickListener() {
  205. @Override
  206. public void onItemClick(int position) {

  207. route = nowResultd.getRouteLines().get(position);
  208. DrivingRouteOverlay overlay = new DrivingRouteOverlay(mBaiduMap);
  209. mBaiduMap.setOnMarkerClickListener(overlay);
  210. overlay.setData(nowResultd.getRouteLines().get(position));
  211. overlay.addToMap();
  212. overlay.zoomToSpan();

  213. }
  214. });
  215. myTransitDlg.show();
  216. } else if(result.getRouteLines().size() == 1){
  217. route = result.getRouteLines().get(0);
  218. DrivingRouteOverlay overlay = new DrivingRouteOverlay(mBaiduMap);

  219. mBaiduMap.setOnMarkerClickListener(overlay);
  220. overlay.setData(result.getRouteLines().get(0));
  221. overlay.addToMap();
  222. overlay.zoomToSpan();
  223. } else {
  224. return ;
  225. }
  226. }
  227. }

  228. @Override
  229. public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {

  230. }

  231. @Override
  232. public void onMapClick(LatLng latLng) {

  233. }

  234. @Override
  235. public boolean onMapPoiClick(MapPoi mapPoi) {
  236. return false;
  237. }

  238. private class MyTransitRouteOverlay extends TransitRouteOverlay {

  239. public MyTransitRouteOverlay(BaiduMap baiduMap) {
  240. super(baiduMap);
  241. }

  242. @Override
  243. public BitmapDescriptor getStartMarker() {
  244. if (useDefaultIcon) {
  245. return BitmapDescriptorFactory.fromResource(R.drawable.icon_st);
  246. }
  247. return null;
  248. }

  249. @Override
  250. public BitmapDescriptor getTerminalMarker() {
  251. if (useDefaultIcon) {
  252. return BitmapDescriptorFactory.fromResource(R.drawable.icon_en);
  253. }
  254. return null;
  255. }
  256. }

  257. private class MyWalkingRouteOverlay extends WalkingRouteOverlay {

  258. public MyWalkingRouteOverlay(BaiduMap baiduMap) {
  259. super(baiduMap);
  260. }

  261. @Override
  262. public BitmapDescriptor getStartMarker() {
  263. if (useDefaultIcon) {
  264. return BitmapDescriptorFactory.fromResource(R.drawable.icon_st);
  265. }
  266. return null;
  267. }

  268. @Override
  269. public BitmapDescriptor getTerminalMarker() {
  270. if (useDefaultIcon) {
  271. return BitmapDescriptorFactory.fromResource(R.drawable.icon_en);
  272. }
  273. return null;
  274. }
  275. }


  276. @Override
  277. protected void onPause() {
  278. mMapView.onPause();
  279. super.onPause();
  280. }

  281. @Override
  282. protected void onResume() {
  283. mMapView.onResume();
  284. super.onResume();
  285. }

  286. @Override
  287. protected void onDestroy() {
  288. mSearch.destroy();
  289. mMapView.onDestroy();
  290. super.onDestroy();
  291. }

  292. // 响应DLg中的List item 点击
  293. interface OnItemInDlgClickListener {
  294. public void onItemClick( int position);
  295. }

  296. // 供路线选择的Dialog
  297. class MyTransitDlg extends Dialog {

  298. private List<? extends RouteLine> mtransitRouteLines;
  299. private ListView transitRouteList;
  300. private RouteLineAdapter mTransitAdapter;

  301. OnItemInDlgClickListener onItemInDlgClickListener;

  302. public MyTransitDlg(Context context, int theme) {
  303. super(context, theme);
  304. }

  305. public MyTransitDlg(Context context, List< ? extends RouteLine> transitRouteLines, RouteLineAdapter.Type
  306. type) {
  307. this( context, 0);
  308. mtransitRouteLines = transitRouteLines;
  309. mTransitAdapter = new RouteLineAdapter( context, mtransitRouteLines , type);
  310. requestWindowFeature(Window.FEATURE_NO_TITLE);
  311. }

  312. @Override
  313. protected void onCreate(Bundle savedInstanceState) {
  314. super.onCreate(savedInstanceState);
  315. setContentView(R.layout.activity_transit_dialog);

  316. transitRouteList = (ListView) findViewById(R.id.transitList);
  317. transitRouteList.setAdapter(mTransitAdapter);

  318. transitRouteList.setOnItemClickListener( new AdapterView.OnItemClickListener() {

  319. @Override
  320. public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
  321. onItemInDlgClickListener.onItemClick( position);
  322. dismiss();

  323. }
  324. });
  325. }

  326. public void setOnItemInDlgClickLinster( OnItemInDlgClickListener itemListener) {
  327. onItemInDlgClickListener = itemListener;
  328. }

  329. }

  330. }
  331. </span>
因为乘车路线如果是多条的话是一个listview,所以,适配器在所难免了

adapter类

  1. <span style="font-family:SimSun;">import android.content.Context;
  2. import android.view.LayoutInflater;
  3. import android.view.View;
  4. import android.view.ViewGroup;
  5. import android.widget.BaseAdapter;
  6. import android.widget.TextView;

  7. import com.baidu.mapapi.search.core.RouteLine;
  8. import com.baidu.mapapi.search.route.DrivingRouteLine;

  9. import java.util.List;

  10. public class RouteLineAdapter extends BaseAdapter {

  11. private List<? extends RouteLine> routeLines;
  12. private LayoutInflater layoutInflater;
  13. private Type mtype;

  14. public RouteLineAdapter(Context context, List<?extends RouteLine> routeLines, Type type) {
  15. this.routeLines = routeLines;
  16. layoutInflater = LayoutInflater.from( context);
  17. mtype = type;
  18. }

  19. @Override
  20. public int getCount() {
  21. return routeLines.size();
  22. }

  23. @Override
  24. public Object getItem(int position) {
  25. return position;
  26. }

  27. @Override
  28. public long getItemId(int position) {
  29. return position;
  30. }

  31. @Override
  32. public View getView(int position, View convertView, ViewGroup parent) {
  33. NodeViewHolder holder;
  34. if (convertView == null) {
  35. convertView = layoutInflater.inflate(R.layout.activity_transit_item, null);
  36. holder = new NodeViewHolder();
  37. holder.name = (TextView) convertView.findViewById(R.id.transitName);
  38. holder.lightNum = (TextView) convertView.findViewById(R.id.lightNum);
  39. holder.dis = (TextView) convertView.findViewById(R.id.dis);
  40. convertView.setTag(holder);
  41. } else {
  42. holder = (NodeViewHolder) convertView.getTag();
  43. }

  44. switch (mtype) {
  45. case TRANSIT_ROUTE:
  46. holder.name.setText("路线" + (position + 1));
  47. int time = routeLines.get(position).getDuration();
  48. if ( time / 3600 == 0 ) {
  49. holder.lightNum.setText( "大约需要:" + time / 60 + "分钟" );
  50. } else {
  51. holder.lightNum.setText( "大约需要:" + time / 3600 + "小时" + (time % 3600) / 60 + "分钟" );
  52. }
  53. holder.dis.setText("距离大约是:" + routeLines.get(position).getDistance());
  54. break;

  55. case DRIVING_ROUTE:
  56. DrivingRouteLine drivingRouteLine = (DrivingRouteLine) routeLines.get(position);
  57. holder.name.setText( "线路" + (position + 1));
  58. holder.lightNum.setText( "红绿灯数:" + drivingRouteLine.getLightNum());
  59. holder.dis.setText("拥堵距离为:" + drivingRouteLine.getCongestionDistance() + "米");
  60. break;

  61. default:

  62. }

  63. return convertView;
  64. }

  65. private class NodeViewHolder {

  66. private TextView name;
  67. private TextView lightNum;
  68. private TextView dis;
  69. }

  70. public enum Type {
  71. TRANSIT_ROUTE, // 公交
  72. DRIVING_ROUTE // 驾车
  73. }
  74. }
  75. </span>
主布局
  1. <span style="font-family:SimSun;"><?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas./apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">

  6. <LinearLayout
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"
  9. android:orientation="horizontal">
  10. <EditText
  11. android:layout_width="wrap_content"
  12. android:layout_height="wrap_content"
  13. android:hint="起点"
  14. android:layout_weight="1"
  15. android:id="@+id/et_start"/>

  16. <EditText
  17. android:layout_width="wrap_content"
  18. android:layout_height="wrap_content"
  19. android:hint="终点"
  20. android:layout_weight="1"
  21. android:id="@+id/et_end"/>
  22. </LinearLayout>
  23. <LinearLayout
  24. android:layout_width="match_parent"
  25. android:layout_height="wrap_content"
  26. android:gravity="center"
  27. android:orientation="horizontal"
  28. android:padding="10dp">

  29. <Button
  30. android:id="@+id/btn_walk"
  31. android:layout_width="wrap_content"
  32. android:layout_height="wrap_content"
  33. android:text="步行"
  34. android:textSize="20dp" />

  35. <Button
  36. android:id="@+id/btn_bus"
  37. android:layout_width="wrap_content"
  38. android:layout_height="wrap_content"
  39. android:text="公交"
  40. android:textSize="20dp" />

  41. <Button
  42. android:id="@+id/btn_car"
  43. android:layout_width="wrap_content"
  44. android:layout_height="wrap_content"
  45. android:text="自驾"
  46. android:textSize="20dp" />
  47. </LinearLayout>

  48. <com.baidu.mapapi.map.MapView
  49. android:id="@+id/mapView"
  50. android:layout_width="match_parent"
  51. android:layout_height="match_parent"
  52. android:layout_weight="1"></com.baidu.mapapi.map.MapView>

  53. </LinearLayout></span>

listview的item布局

  1. <span style="font-family:SimSun;"><?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas./apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical">

  6. <TextView
  7. android:id="@+id/transitName"
  8. android:layout_width="match_parent"
  9. android:layout_height="match_parent" />

  10. <TextView
  11. android:id="@+id/lightNum"
  12. android:layout_width="match_parent"
  13. android:layout_height="match_parent" />

  14. <TextView
  15. android:id="@+id/dis"
  16. android:layout_width="match_parent"
  17. android:layout_height="match_parent" />


  18. </LinearLayout></span>
如果在出错的话,那就是图片了,自己百度找两张就可以了

但是问题来了,本菜在百度上找了半天,也没有找到公交路线详情,没办法,只能去百度地图API找了,结果百度给我的是





返回类型 方法
MKPlanNode getEnd()
返回路线终点
int getNumPlan()
返回方案数目
MKTransitRoutePlan getPlan(int index)
返回第index个方案
MKPlanNode getStart()
返回路线起点
MKRouteAddrResult getAddrResult()
返回起点或终点的地址信息结果 

什么鬼,根本就没有公交详情乘车路线啊,是我没找到还是他们就没写出来,如果我没找到,那我继续找,如果是因为没有写出来,来来来,开发百度地图的那个,你过来,我保证不打死你,给你留半口气,好了,玩笑话,别当真
恩,百度地图路线规划就介绍到这里了,下篇准备写,百度地图的搜索地址。

百度地图给的需要写城市和地址两个,我要的是输入一个地址就可以定位的啊,反正我还没找到呢,有建议的,请保留,不服,你顺着点线爬过来打我啊。

以后更新路线规划并显示出详细的路线规划信息!!



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多