English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Пример кода для реализации навигации по местоположению и目的地 в Android

Сегодня я случайно увидел демо, в котором технический гений использует Baidu Map для геолокации и реализации навигации к месту назначения. Мне это очень понравилось, поэтому я решил поделиться им. Давайте посмотрим на результаты реализации:

       

После входа сначала будет получено текущее положение, которое будет отображено на карте. После ввода места назначения на карте появится оптимальный маршрут. В данном случае я установил маршрут с минимальным расстоянием для езды на автомобиле. В коде также есть комментарии о автобусных маршрутах и маршрутах пешком. Кроме того, в консоли выводится информация о каждом узле маршрута, а также расстояние от起始ной точки до места назначения, информация отображается в навигационных данных текущего узла.如下图:

 

Далее посмотрим, как это реализуется. Сначала зарегистрируйтесь в качестве разработчика Baidu, зайдите в Baidu Map API, чтобы ознакомиться с соответствующей информацией. Затем зарегистрируйте APP KEY для приложения, которое нужно добавить в карту. После регистрации скачайте jar-файл Baidu Map, создайте новый проект и импортируйте его. Ниже приведен конкретный код реализации, в котором есть подробные комментарии:

public class NavigationDemoActivity extends MapActivity { 
  private String mMapKey = "регистрация своего ключа"; 
  private EditText destinationEditText = null; 
  private Button startNaviButton = null; 
  private MapView mapView = null; 
  private BMapManager mMapManager = null; 
  private MyLocationOverlay myLocationOverlay = null; 
  //onResume при регистрации этого listener, при onPause необходимо удалить, обратите внимание, что этот listener не встроен в Android, а из API Baidu 
  private LocationListener locationListener; 
  private MKSearch searchModel; 
  GeoPoint pt; 
  @Override 
  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.main); 
    destinationEditText = (EditText) this.findViewById(R.id.et_destination); 
    startNaviButton = (Button) this.findViewById(R.id.btn_navi); 
    mMapManager = new BMapManager(getApplication()); 
    mMapManager.init(mMapKey, new MyGeneralListener()); 
    super.initMapActivity(mMapManager); 
    mapView = (MapView) this.findViewById(R.id.bmapsView); 
    //设置启用内置的缩放控件 
    mapView.setBuiltInZoomControls(true);  
    //设置在缩放动画过程中也显示overlay,默认为不绘制 
//    mapView.setDrawOverlayWhenZooming(true); 
    //获取当前位置层 
    myLocationOverlay = new MyLocationOverlay(this, mapView); 
    //将当前位置的层添加到地图底层中 
    mapView.getOverlays().add(myLocationOverlay); 
    // 注册定位事件 
    locationListener = new LocationListener(){ 
      @Override 
      public void onLocationChanged(Location location) { 
        if (location != null){ 
          //生成GEO类型坐标并在地图上定位到该坐标标示的地点 
           pt = new GeoPoint((int)(location.getLatitude()*1e6), 
              (int)(location.getLongitude()*1e6)); 
//         System.out.println("---"+location.getLatitude() +":"+location.getLongitude()); 
          mapView.getController().animateTo(pt); 
        } 
      } 
    }); 
    // Инициализация модуля поиска 
    searchModel = new MKSearch(); 
    // Установить стратегию маршрута на наименьшую длину 
    searchModel.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST); 
    searchModel.init(mMapManager, new MKSearchListener() { 
      // Метод вызова обратного вызова получения маршрута вождения 
      @Override 
      public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) { 
        // Номер ошибки можно посмотреть в определениях MKEvent 
        if (error != 0 || res == null) { 
          Toast.makeText(NavigationDemoActivity.this, "Извините, результатов не найдено", Toast.LENGTH_SHORT).show(); 
          return; 
        } 
        RouteOverlay routeOverlay = new RouteOverlay(NavigationDemoActivity.this, mapView); 
        // Здесь показывается только один план в качестве примера 
        MKRoute route = res.getPlan(0).getRoute(0); 
        int distanceM = route.getDistance(); 
        String distanceKm = String.valueOf(distanceM / 1000) +"."+String.valueOf(distanceM % 1000); 
        System.out.println("Расстояние:"+distanceKm+" километров---количество узлов:"+route.getNumSteps()); 
        for (int i = 0; i < route.getNumSteps(); i++) { 
          MKStep step = route.getStep(i); 
          System.out.println("节点信息:"+step.getContent()); 
        } 
        routeOverlay.setData(route); 
        mapView.getOverlays().clear(); 
        mapView.getOverlays().add(routeOverlay); 
        mapView.invalidate(); 
        mapView.getController().animateTo(res.getStart().pt); 
      } 
      //以下两种方式和上面的驾车方案实现方法一样 
      @Override 
      public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) { 
        //获取步行路线 
      } 
      @Override 
      public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) { 
        //获取公交线路 
      } 
      @Override 
      public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) { 
      } 
      @Override 
      public void onGetAddrResult(MKAddrInfo arg0, int arg1) { 
      } 
      @Override 
      public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) { 
      } 
      @Override 
      public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) { 
      } 
    }); 
    startNaviButton.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
        String destination = destinationEditText.getText().toString(); 
        //设置起始地(当前位置) 
        MKPlanNode startNode = new MKPlanNode(); 
        startNode.pt = pt; 
        //设置目的地 
        MKPlanNode endNode = new MKPlanNode();  
        endNode.name = destination; 
        // Расширить поиск городов 
        String city = getResources().getString(R.string.beijing); 
//       System.out.println("----"+city+"---"+destination+"---"+pt); 
        searchModel.drivingSearch(city, startNode, city, endNode); 
        // Маршрут пешком 
//       searchModel.walkingSearch(city, startNode, city, endNode); 
        // Маршрут公共交通 
//       searchModel.transitSearch(city, startNode, endNode); 
      } 
    }); 
  } 
  @Override 
  protected void onResume() { 
    mMapManager.getLocationManager().requestLocationUpdates(locationListener); 
    myLocationOverlay.enableMyLocation(); 
    myLocationOverlay.enableCompass(); // Открывать компас 
    mMapManager.start(); 
    super.onResume(); 
  } 
  @Override 
  protected void onPause() { 
    mMapManager.getLocationManager().removeUpdates(locationListener); 
    myLocationOverlay.disableMyLocation(); // Показать текущее местоположение 
    myLocationOverlay.disableCompass(); // Закрыть компас 
    mMapManager.stop(); 
    super.onPause(); 
  } 
  @Override 
  protected boolean isRouteDisplayed() { 
    // TODO Автоматически сгенерированный метод-шаблон 
    return false; 
  } 
  // Обычный слушатель событий, используется для обработки обычных сетевых ошибок, ошибок проверки авторизации и т.д. 
  class MyGeneralListener implements MKGeneralListener { 
      @Override 
      public void onGetNetworkState(int iError) {}} 
        Log.d("MyGeneralListener", "ошибка состояния сети "+ iError); 
        Toast.makeText(NavigationDemoActivity.this, "Ваше сетевое соединение не работает!", 
            Toast.LENGTH_LONG).show(); 
      } 
      @Override 
      public void onGetPermissionState(int iError) { 
        Log.d("MyGeneralListener", "ошибка состояния разрешения "+ iError); 
        if (iError == MKEvent.ERROR_PERMISSION_DENIED) { 
          // Ошибка ключа авторизации: 
          Toast.makeText(NavigationDemoActivity.this,  
              "Пожалуйста, в файле BMapApiDemoApp.java введите правильный ключ авторизации!", 
              Toast.LENGTH_LONG).show(); 
        } 
      } 
    } 
} 

Затем идет файл разметки:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
  android:layout_width="fill_parent" 
  android:layout_height="fill_parent" 
  android:orientation="vertical" > 
  <LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="horizontal" > 
    <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:textSize="18sp" 
      android:text="Destination:" /> 
    <EditText 
      android:id="@+id/et_destination" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" /> 
  </LinearLayout> 
  <Button  
    android:id="@+id/btn_navi" 
    android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:text="Start navigate"/> 
  <com.baidu.mapapi.MapView 
    android:id="@+id/bmapsView" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:clickable="true" /> 
</LinearLayout> 

AndroidMainifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android"> 
  package="com.ericssonlabs" 
  android:versionCode="1" 
  android:versionName="1.0" > 
  <uses-sdk android:minSdkVersion="8" /> 
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> 
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> 
  <uses-permission android:name="android.permission.INTERNET"></uses-permission> 
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>  
  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>  
  <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission> 
  <supports-screens android:largeScreens="true"} 
    android:normalScreens="true" android:smallScreens="true" 
    android:resizeable="true" android:anyDensity="true"/> 
  <uses-sdk android:minSdkVersion="3"></uses-sdk> 
  <application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
      android:name=".NavigationDemoActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
        <action android:name="android.intent.action.MAIN" /> 
        <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
    </activity> 
  </application> 
</manifest> 

Вот все коды для реализации определения местоположения и навигации до места на карте Baidu, не знаю, это ли то, что вы хотели?

Это все содержимое статьи, надеюсь, это поможет вам в изучении, также希望大家多多 поддерживать呐喊 руководства.

Заявление: содержимое статьи взято из интернета, авторские права принадлежат авторам, материалы предоставлены пользователями интернета, сайт не имеет права собственности, материалы не редактировались вручную, и не несет ответственности за них. Если вы обнаружите материалы,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма, пожалуйста, замените # на @) для сообщения о нарушении и предоставьте соответствующие доказательства. Если подтвердится, сайт немедленно удалят материалы,涉嫌侵权.

Основной учебник
Рекомендуется для просмотра