您的位置:首页 > 其它

暂时只会这种导航,实时显示自己的位置,,求其他更好的方法,或api

2013-03-12 17:41 417 查看
有没有更好的方法解决实时显示自己的位置的导航



<?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>


package com.xmb.navigationdemoactivity;

import java.util.ArrayList;
import java.util.List;

import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.GeoPoint;
import com.baidu.mapapi.LocationListener;
import com.baidu.mapapi.MKAddrInfo;

import com.baidu.mapapi.ItemizedOverlay;
import com.baidu.mapapi.MKDrivingRouteResult;
import com.baidu.mapapi.MKEvent;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.MKPlanNode;
import com.baidu.mapapi.MKPoiResult;
import com.baidu.mapapi.MKRoute;
import com.baidu.mapapi.MKSearch;
import com.baidu.mapapi.MKSearchListener;
import com.baidu.mapapi.MKStep;
import com.baidu.mapapi.OverlayItem;

import com.baidu.mapapi.MKTransitRouteResult;
import com.baidu.mapapi.MKWalkingRouteResult;
import com.baidu.mapapi.MapActivity;
import com.baidu.mapapi.MapView;
import com.baidu.mapapi.MyLocationOverlay;
import com.baidu.mapapi.RouteOverlay;

import android.graphics.drawable.Drawable;
import android.location.Location;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.*;

@SuppressLint("ParserError")
public class NavigationDemoActivity extends MapActivity {
private String mMapKey = "C9DF0F24E9FFCCEB4AF1DA296E8A694B311A3073";
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.daohang);
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());
mMapManager.getLocationManager().setNoitifyInternal(20, 5);
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) {
// TODO Auto-generated method stub
if (location != null){
//生成GEO类型坐标并在地图上定位到该坐标标示的地点

Log.i("out","onLocationChanged");
pt = new GeoPoint((int)(location.getLatitude()*1e6),
(int)(location.getLongitude()*1e6));
Drawable drawable = getResources().getDrawable(R.drawable.car_green);

mapView.getOverlays().add(new MyOverLayItem(drawable));
//                    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 onGetAddrResult(MKAddrInfo 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);
/*                 mMapManager.getLocationManager().requestLocationUpdates(
// 注册定位事件
new LocationListener(){
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
if (location != null){
Log.i("out","mMapManager_onLocationChanged");
//生成GEO类型坐标并在地图上定位到该坐标标示的地点
pt = new GeoPoint((int)(location.getLatitude()*1e6),
(int)(location.getLongitude()*1e6));
Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher);

mapView.getOverlays().add(new MyOverLayItem(drawable));
//                                        System.out.println("---"+location.getLatitude() +":"+location.getLongitude());
mapView.getController().animateTo(pt);
}
}
})*/
//步行路线
//                searchModel.walkingSearch(city, startNode, city, endNode);
//公交路线
//                searchModel.transitSearch(city, startNode, endNode);
}
});

}
public class MyOverLayItem extends ItemizedOverlay<OverlayItem> {

private List<OverlayItem> list = new ArrayList<OverlayItem>();
// 定义一组坐标,都是一个double类型定义

// 用于在地图上标识坐标,用一个图片标注
public MyOverLayItem(Drawable drawable) {
super(drawable);
// TODO Auto-generated constructor stub
// 第一组数据的在地图上的标注点

list.add(new OverlayItem(pt, "Point1", "Point1"));

populate();//刷新地图的功能
}

// 返回指定的list集合中每一个坐标
@Override
protected OverlayItem createItem(int arg0) {
// TODO Auto-generated method stub
return list.get(arg0);
}

@Override
public int size() {
// TODO Auto-generated method stub
return list.size();
}

@Override
public boolean onTap(int i) {
// TODO Auto-generated method stub
Toast.makeText(NavigationDemoActivity.this, list.get(i).getSnippet(), 1).show();

return true;
}

}
/*
class MyLocationListener implements LocationListener {

@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
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);
}
}
//    tv1.setText("经度:" + jindu + ",纬度:" + weidu);
//AllMession =new String[4];
//            AllMession[0]=jingdu.toString();
//            AllMession[1]=weidu.toString();
//            Bundle mydata=new Bundle();
//        Message msg=new Message();
//               mydata.putString("Longltude",String.valueOf(jingdu));
//               mydata.putString("Latitude",String.valueOf(weidu));
//               mydata.putString("accuracy",Accuray);

//               msg.setData(mydata);
//               msg.what=1;
//Toast.makeText(context, jzdwaddress, Toast.LENGTH_LONG).show();
//               handler.sendMessage(msg);

//            t1=(TextView)(((Activity)context).findViewById(R.id.label_wz));
//            t1.setText("经度:" + jingdu + "\n纬度:" + weidu);
//            System.out.println("jindu:"+jingdu+"  "+"weidu:"+weidu);
//            MKSearch search = new MKSearch();
//            search.init(mapManager, new MyMKSearchListener());
//            search.reverseGeocode(new GeoPoint(jingdu, weidu));
//
//            t2=(TextView)(((Activity)context).findViewById(R.id.label_sj));
//            Calendar cal=Calendar.getInstance();
//            t2.setText(cal.getTime().toString());
//
//            t3=(TextView)(((Activity)context).findViewById(R.id.label_jd));
//            t3.setText("1118");
}
*/
@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 Auto-generated method stub
return false;
}

// 常用事件监听,用来处理通常的网络错误,授权验证错误等
class MyGeneralListener implements MKGeneralListener {
@Override
public void onGetNetworkState(int iError) {
Log.d("MyGeneralListener", "onGetNetworkState error is "+ iError);
Toast.makeText(NavigationDemoActivity.this, "您的网络出错啦!",
Toast.LENGTH_LONG).show();
}

@Override
public void onGetPermissionState(int iError) {
Log.d("MyGeneralListener", "onGetPermissionState error is "+ iError);
if (iError ==  MKEvent.ERROR_PERMISSION_DENIED) {
// 授权Key错误:
Toast.makeText(NavigationDemoActivity.this,
"请在BMapApiDemoApp.java文件输入正确的授权Key!",
Toast.LENGTH_LONG).show();
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐