English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Hoje, acidentalmente vi um grande gênio usar o Baidu Maps para localização e implementar o Demo de navegação para destino. Fiquei impressionado e decidi compartilhar. Abaixo, vamos ver o efeito da implementação:
Após entrar, você receberá a localização atual, que será exibida no mapa. Após inserir o destino na caixa de entrada, uma rota ótima aparecerá no mapa. Aqui, configurei a rota de direção mais curta. Além disso, há também rotas de ônibus e a pé, detalhadas no código. Além disso, informações sobre cada nó da rota, bem como a distância entre o ponto de partida e o destino, são exibidas no console. As informações mostradas são as informações de navegação no nó atual. Como mostrado na figura a seguir:
A seguir, vamos ver como é implementado, primeiramente, registre uma conta de desenvolvedor do Baidu e acesse a API do Baidu Maps para consultar os materiais relevantes. A API do Baidu Maps, em seguida, é registrar a chave APP para o aplicativo que precisa incluir o mapa, após o registro, baixe o arquivo jar do Baidu Maps, crie um novo projeto e importe-o. Abaixo está o código de implementação específico, onde há comentários detalhados:
public class NavigationDemoActivity extends MapActivity { private String mMapKey = "registrar a chave de registro"; private EditText destinationEditText = null; private Button startNaviButton = null; private MapView mapView = null; private BMapManager mMapManager = null; private MyLocationOverlay myLocationOverlay = null; //Registra este listener no onResume, e Remove no onPause, observe que este listener não é do Android, é da API do 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); //Configura para habilitar o controle de zoom integrado mapView.setBuiltInZoomControls(true); //Configura para que o overlay também seja exibido durante a animação de zoom, o padrão é não desenhar // mapView.setDrawOverlayWhenZooming(true); //Obter a camada da posição atual myLocationOverlay = new MyLocationOverlay(this, mapView); //Adicionar a camada da posição atual à camada inferior do mapa mapView.getOverlays().add(myLocationOverlay); // Registrar o evento de localização locationListener = new LocationListener(){ @Override public void onLocationChanged(Location location) { if (location != null){ //Gerar o tipo de coordenada GEO e localizar no mapa o ponto indicado pela coordenada pt = new GeoPoint((int)(location.getLatitude()*1e6), (int)(location.getLongitude()*1e6)); // System.out.println("---"+location.getLatitude() +: "+location.getLongitude()); mapView.getController().animateTo(pt); } } }; //Inicializar o módulo de busca searchModel = new MKSearch(); //Definir a estratégia de rota para o menor distância searchModel.setDrivingPolicy(MKSearch.ECAR_DIS_FIRST); searchModel.init(mMapManager, new MKSearchListener() { //Método de chamada de retorno para obter a rota de direção @Override public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) { // O número de erro pode ser consultado nas definições de MKEvent if (error != 0 || res == null) { Toast.makeText(NavigationDemoActivity.this, "Desculpe, não foi encontrado nenhum resultado", Toast.LENGTH_SHORT).show(); return; } RouteOverlay routeOverlay = new RouteOverlay(NavigationDemoActivity.this, mapView); // Aqui apenas uma proposta é apresentada como exemplo MKRoute route = res.getPlan(0).getRoute(0); int distanceM = route.getDistance(); String distanceKm = String.valueOf(distanceM / 10 +,+String.valueOf(distanceM % 1000); System.out.println("Distância:"+distanceKm+"quilômetros"---Número de nós:+route.getNumSteps()); for (int i = 0; i < route.getNumSteps(); i++) { MKStep step = route.getStep(i); System.out.println("Informações de nó:"+step.getContent()); } routeOverlay.setData(route); mapView.getOverlays().clear(); mapView.getOverlays().add(routeOverlay); mapView.invalidate(); mapView.getController().animateTo(res.getStart().pt); } //As duas formas a seguir são iguais à implementação da rota de direção @Override public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) { //Obter rota a pé } @Override public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) { //Obter linha de ônibus } @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(); //Definir local de partida (posição atual) MKPlanNode startNode = new MKPlanNode(); startNode.pt = pt; //Definir destino MKPlanNode endNode = new MKPlanNode(); endNode.name = destino; //Expandir a cidade de pesquisa String cidade = getResources().getString(R.string.beijing); // System.out.println("----"+cidade+"---"+destino+"---"+pt); searchModel.drivingSearch(city, startNode, city, endNode); //Rota a pé // searchModel.walkingSearch(city, startNode, city, endNode); //Rota de ônibus // searchModel.transitSearch(city, startNode, endNode); } }); } @Override protected void onResume() { mMapManager.getLocationManager().requestLocationUpdates(locationListener); myLocationOverlay.enableMyLocation(); myLocationOverlay.enableCompass(); // Abra o compás mMapManager.start(); super.onResume(); } @Override protected void onPause() { mMapManager.getLocationManager().removeUpdates(locationListener); myLocationOverlay.disableMyLocation();//Mostrar a localização atual myLocationOverlay.disableCompass(); // Fechar o compás mMapManager.stop(); super.onPause(); } @Override protected boolean isRouteDisplayed() { // TODO Auto-esqueleto de método gerado return false; } // Escuta de eventos comuns, usada para lidar com erros de rede comuns, verificações de autorização, etc. class MyGeneralListener implements MKGeneralListener { @Override public void onGetNetworkState(int iError) { Log.d("MyGeneralListener", "erro no estado da rede é "+ iError); Toast.makeText(NavigationDemoActivity.this, "Seu erro de rede!", Toast.LENGTH_LONG).show(); } @Override public void onGetPermissionState(int iError) { Log.d("MyGeneralListener", "erro no estado de permissão é "+ iError); if (iError == MKEvent.ERROR_PERMISSION_DENIED) { // Erro de chave de autorização: Toast.makeText(NavigationDemoActivity.this, "Por favor, insira a chave de autorização correta no arquivo BMapApiDemoApp.java!", Toast.LENGTH_LONG).show(); } } } }
Então é o arquivo de layout:
<?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="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>
Aqui está todo o código necessário para implementar a localização do mapa do Baidu e a navegação para o destino, não sei se é o que você quer.
Isso é tudo o que há no artigo, espero que ajude na sua aprendizagem e que você apoie mais o tutorial de gritaria.
Declaração: O conteúdo deste artigo é de propriedade da internet, pertence ao respectivo proprietário, o conteúdo é contribuído e carregado voluntariamente pelos usuários da internet, este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade legal relevante. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#w3Aviso: O conteúdo deste artigo foi extraído da internet, pertence ao respectivo proprietário, o conteúdo foi contribuído e carregado voluntariamente pelos usuários da internet, este site não possui direitos de propriedade, não foi editado manualmente e não assume responsabilidade legal relevante. Se você encontrar conteúdo suspeito de violação de direitos autorais, por favor, envie um e-mail para: notice#w