English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Aujourd'hui, j'ai vu par hasard un technicien expert utiliser Baidu Maps pour la localisation et la navigation vers la destination dans un exemple de démonstration. Cela m'a semblé très bien, donc je l'ai partagé ici. Voici les résultats de l'implémentation :
Après l'entrée, vous obtiendrez d'abord la position actuelle, qui sera affichée sur la carte. Après avoir saisi la destination dans le champ de saisie, une itinéraire optimal apparaîtra sur la carte. Ici, j'ai configuré un itinéraire de conduite avec la distance minimale. D'autres options, comme les itinéraires de transport en commun et les itinéraires piétons, sont également détaillées dans le code. De plus, les informations sur chaque noeud de l'itinéraire, ainsi que la distance entre le point de départ et le point d'arrivée, sont affichées dans la console. Les informations affichées sont les informations de navigation à ce noeud. Voici une illustration :
Ensuite, regardons comment cela est réalisé. D'abord, enregistrez un compte développeur Baidu, puis accédez à l'API Baidu Maps pour consulter les documents pertinents. Ensuite, enregistrez une clé APP pour l'application nécessitant l'intégration de la carte, téléchargez le fichier jar Baidu Maps, créez un nouveau projet et importez-le. Voici le code d'implémentation spécifique, avec des commentaires détaillés à l'intérieur :
public class NavigationDemoActivity extends MapActivity { private String mMapKey = "enregistrer sa clé"; private EditText destinationEditText = null; private Button startNaviButton = null; private MapView mapView = null; private BMapManager mMapManager = null; private MyLocationOverlay myLocationOverlay = null; //当onResume时注册此listener,onPause时需要Remove,注意此listener不是Android自带的,是百度API中的 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); //Obtenir la couche de position actuelle myLocationOverlay = new MyLocationOverlay(this, mapView); //Ajouter la couche de position actuelle au plan inférieur de la carte mapView.getOverlays().add(myLocationOverlay); // Enregistrer l'événement de localisation locationListener = new LocationListener(){ @Override public void onLocationChanged(Location location) { if (location != null){ //Générer un type de coordonnées GEO et localiser la position indiquée par cette coordonnée sur la carte pt = new GeoPoint((int)(location.getLatitude()*1e6), (int)(location.getLongitude()*1e6)); // System.out.println("---"+location.getLatitude() +:+location.getLongitude()); mapView.getController().animateTo(pt); } } }; //Initialiser le module de recherche searchModel = new MKSearch(); //Définir la stratégie de route pour la distance la plus courte searchModel.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST); searchModel.init(mMapManager, new MKSearchListener() { //Méthode de rappel de récupération de la route de conduite @Override public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) { // Le numéro d'erreur peut être consulté dans les définitions de MKEvent if (error != 0 || res == null) { Toast.makeText(NavigationDemoActivity.this, "Désolé, aucun résultat trouvé", Toast.LENGTH_SHORT).show(); return; } RouteOverlay routeOverlay = new RouteOverlay(NavigationDemoActivity.this, mapView); // Ce n'est qu'un exemple pour montrer une seule solution MKRoute route = res.getPlan(0).getRoute(0); int distanceM = route.getDistance(); String distanceKm = String.valueOf(distanceM / 10 +,+String.valueOf(distanceM % 1000); System.out.println("Distance : "+distanceKm+"kilomètres"---Nombre de nœuds :"+route.getNumSteps()); for (int i = 0; i < route.getNumSteps(); i++) { MKStep step = route.getStep(i); System.out.println("Informations sur le nœud : "+step.getContent()); } routeOverlay.setData(route); mapView.getOverlays().clear(); mapView.getOverlays().add(routeOverlay); mapView.invalidate(); mapView.getController().animateTo(res.getStart().pt); } //Les deux méthodes suivantes sont identiques à la méthode de mise en œuvre du plan de conduite précédent @Override public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) { //Obtenir le itinéraire de piéton } @Override public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) { //Obtenir le réseau de lignes de bus } @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(); //Définir le point de départ (position actuelle) MKPlanNode startNode = new MKPlanNode(); startNode.pt = pt; //Définir la destination MKPlanNode endNode = new MKPlanNode(); endNode.name = destination; //Développer la recherche de ville String city = getResources().getString(R.string.beijing); // System.out.println("----"+city+"---"+destination+"---"+pt); searchModel.drivingSearch(city, startNode, city, endNode); //Itinéraire à pied // searchModel.walkingSearch(city, startNode, city, endNode); //Ligne de bus // searchModel.transitSearch(city, startNode, endNode); } }); } @Override protected void onResume() { mMapManager.getLocationManager().requestLocationUpdates(locationListener); myLocationOverlay.enableMyLocation(); myLocationOverlay.enableCompass(); // Ouvrir le compas mMapManager.start(); super.onResume(); } @Override protected void onPause() { mMapManager.getLocationManager().removeUpdates(locationListener); myLocationOverlay.disableMyLocation();//Afficher la position actuelle myLocationOverlay.disableCompass(); // Fermer le compas de navigation mMapManager.stop(); super.onPause(); } @Override protected boolean isRouteDisplayed() { // TODO Auto-generé par le stub de méthode return false; } // Écouteurs d'événements courants, utilisés pour traiter les erreurs réseau habituelles, les erreurs de validation d'autorisation, etc. class MyGeneralListener implements MKGeneralListener { @Override public void onGetNetworkState(int iError) { Log.d("MyGeneralListener", "erreur d'état du réseau est "+ iError); Toast.makeText(NavigationDemoActivity.this, "Votre réseau est en erreur !", Toast.LENGTH_LONG).show(); } @Override public void onGetPermissionState(int iError) { Log.d("MyGeneralListener", "erreur d'état de permission est "+ iError); if (iError == MKEvent.ERROR_PERMISSION_DENIED) { // Clé d'autorisation incorrecte : Toast.makeText(NavigationDemoActivity.this, "Veuillez saisir la clé d'autorisation correcte dans le fichier BMapApiDemoApp.java!", Toast.LENGTH_LONG).show(); } } } }
Ensuite, le fichier de conception :
<?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="Démarrer la navigation"/> <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>
Voici tout le code pour réaliser la localisation de la carte Baidu et la navigation vers le point d'arrivée. Ne savez-vous pas si c'est ce que vous cherchez ?
C'est tout le contenu de cet article. J'espère que cela aidera à votre apprentissage et que vous soutiendrez également le tutoriel à crier.
Déclaration : le contenu de cet article est issu du réseau, propriété de l'auteur original, contribué et téléversé par les utilisateurs d'Internet, ce site ne détient pas de droits de propriété, n'a pas été traité par l'édition humaine et n'assume aucune responsabilité juridique connexe. Si vous trouvez du contenu suspect de violation de droits d'auteur, veuillez envoyer un e-mail à : notice#oldtoolbag.com (veuillez remplacer # par @ lors de l'envoi d'un e-mail pour signaler une violation, et fournir des preuves pertinentes. Une fois vérifié, ce site supprimera immédiatement le contenu suspect de violation de droits d'auteur.)