English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Сегодня я случайно увидел демо, в котором технический гений использует 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 (во время отправки письма, пожалуйста, замените # на @) для сообщения о нарушении и предоставьте соответствующие доказательства. Если подтвердится, сайт немедленно удалят материалы,涉嫌侵权.