English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Hoy, de manera casual, vi un demo de un experto en tecnología que utiliza Baidu Maps para localizar y realizar la navegación al destino. Me pareció muy bueno, así que lo compartí aquí para que todos lo vean. A continuación, veamos el efecto de la implementación:
Después de ingresar, primero obtendrá la ubicación actual, que se mostrará en el mapa. Después de ingresar el destino en el cuadro de entrada, aparecerá la ruta óptima en el mapa. Aquí he configurado la ruta de conducción con la distancia más corta. Además, también hay rutas de autobús y caminata, que se detallan en los comentarios del código. Además, en la consola, también se muestran las información de cada nodo en la ruta, así como la distancia desde el punto de partida y el destino, que se muestra como información de navegación en el nodo actual. Como se muestra en la siguiente imagen:
A continuación, veamos cómo se realiza, primero, registre una cuenta de desarrollador de Baidu y acceda a la documentación del API de Baidu Maps. Luego, registre la clave de aplicación APP para la aplicación que desea agregar al mapa. Después de registrarse, descargue el archivo jar de Baidu Maps, cree un proyecto nuevo e importe. A continuación, veamos el código específico de la implementación, que contiene comentarios detallados:
public class NavigationDemoActivity extends MapActivity { private String mMapKey = "registrarse con su clave"; private EditText destinationEditText = null; private Button startNaviButton = null; private MapView mapView = null; private BMapManager mMapManager = null; private MyLocationOverlay myLocationOverlay = null; //En el momento de onResume se registra este listener, en el momento de onPause se necesita Eliminar, atención: este listener no es del sistema Android, es del API de 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); //Se configura para habilitar el control deslizante de escala integrado mapView.setBuiltInZoomControls(true); //Al configurar el desplazamiento de la animación de escala también se muestra el overlay, por defecto no se dibuja // mapView.setDrawOverlayWhenZooming(true); //Obtener la capa de ubicación actual myLocationOverlay = new MyLocationOverlay(this, mapView); //Agregar la capa de la ubicación actual a la capa inferior del mapa mapView.getOverlays().add(myLocationOverlay); // Registrar eventos de ubicación locationListener = new LocationListener(){ @Override public void onLocationChanged(Location location) { if (location != null){ //Generar un punto GEO y ubicarse en el lugar indicado por el punto en el mapa pt = new GeoPoint((int)(location.getLatitude()*1e6), (int)(location.getLongitude()*1e6)); // System.out.println("---"+location.getLatitude() +":"+location.getLongitude()); mapView.getController().animateTo(pt); } } }); //Inicializar el módulo de búsqueda searchModel = new MKSearch(); //Establecer la estrategia de ruta para la distancia más corta searchModel.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST); searchModel.init(mMapManager, new MKSearchListener() { //Método de retroalimentación de obtención de rutas de conducción @Override public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) { // El número de error se puede consultar en las definiciones de MKEvent if (error != 0 || res == null) { Toast.makeText(NavigationDemoActivity.this, "Lo sentimos, no se encontraron resultados", Toast.LENGTH_SHORT).show(); return; } RouteOverlay routeOverlay = new RouteOverlay(NavigationDemoActivity.this, mapView); // Aquí se muestra solo una solución como ejemplo MKRoute route = res.getPlan(0).getRoute(0); int distanceM = route.getDistance(); String distanceKm = String.valueOf(distanceM / 1000) +.+String.valueOf(distanceM % 1000); System.out.println("Distancia:",+distanceKm+kilómetros---número de nodos:+route.getNumSteps()); for (int i = 0; i < route.getNumSteps(); i++) { MKStep step = route.getStep(i); System.out.println("Información de nodo:",+step.getContent()); } routeOverlay.setData(route); mapView.getOverlays().clear(); mapView.getOverlays().add(routeOverlay); mapView.invalidate(); mapView.getController().animateTo(res.getStart().pt); } //Las dos siguientes formas son iguales a la implementación del plan de conducción anterior @Override public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) { //obtener ruta a pie } @Override public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) { //obtener línea de autobús } @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 destino = destinoEditText.getText().toString(); //Establecer punto de partida (ubicación actual) MKPlanNode startNode = new MKPlanNode(); startNode.pt = pt; //Establecer destino MKPlanNode endNode = new MKPlanNode(); endNode.name = destino; //Expandir la ciudad de búsqueda String ciudad = getResources().getString(R.string.beijing); // System.out.println("----"+ciudad+"---"+destino+"---"+pt); searchModel.drivingSearch(city, startNode, city, endNode); //Ruta a pie // searchModel.walkingSearch(city, startNode, city, endNode); //Ruta de autobús // searchModel.transitSearch(city, startNode, endNode); } }); } @Override protected void onResume() { mMapManager.getLocationManager().requestLocationUpdates(locationListener); myLocationOverlay.enableMyLocation(); myLocationOverlay.enableCompass(); // Activar brújula mMapManager.start(); super.onResume(); } @Override protected void onPause() { mMapManager.getLocationManager().removeUpdates(locationListener); myLocationOverlay.disableMyLocation();//Mostrar ubicación actual myLocationOverlay.disableCompass(); // Cerrar brújula mMapManager.stop(); super.onPause(); } @Override protected boolean isRouteDisplayed() { // TODO Auto-metodo de plantilla generado return false; } // Escucha de eventos comunes, utilizado para manejar errores de red comunes, errores de verificación de autorización, etc. class MyGeneralListener implements MKGeneralListener { @Override public void onGetNetworkState(int iError) { Log.d("MyGeneralListener", "error en el estado de red de obtención es ")+ iError); Toast.makeText(NavigationDemoActivity.this, "¡Su red tiene un error!", Toast.LENGTH_LONG).show(); } @Override public void onGetPermissionState(int iError) { Log.d("MyGeneralListener", "error en el estado de permiso de obtención es ")+ iError); if (iError == MKEvent.ERROR_PERMISSION_DENIED) { // Error de clave de autorización: Toast.makeText(NavigationDemoActivity.this, "¡Por favor, ingrese la clave de autorización correcta en el archivo BMapApiDemoApp.java!", Toast.LENGTH_LONG).show(); } } } }
Luego está el archivo de diseño:
<?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="Destino:" /> <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="Inicio de navegación"/> <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-permiso android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission> <uses-permiso android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission> <uses-permiso android:name="android.permission.INTERNET"></uses-permission> <uses-permiso android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> <uses-permiso android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission> <uses-permiso android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission> <uses-permiso 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>
Aquí está todo el código necesario para implementar la ubicación y navegación al destino del mapa de Baidu, ¿no es esto lo que querían?
Este es el contenido completo del artículo, espero que sea útil para su aprendizaje y que todos nos apoyen en el tutorial de clamor.
Declaración: El contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido se ha subido por los usuarios de Internet de manera autónoma, este sitio web no posee los derechos de propiedad, no se ha realizado un procesamiento editorial manual y no asume ninguna responsabilidad legal. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#w.3Aviso: El contenido de este artículo se ha obtenido de la red, es propiedad del autor original, el contenido se ha subido por los usuarios de Internet de manera autónoma, este sitio web no posee los derechos de propiedad, no se ha realizado un procesamiento editorial manual y no asume ninguna responsabilidad legal. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a: notice#w proporcionando la evidencia relevante, y una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.