MyException - 我的异常网
当前位置:我的异常网» 移动开发 » 百度map的手动定位和自动定位

百度map的手动定位和自动定位

www.MyException.Cn  网友分享于:2013-06-29  浏览:58次
百度地图的手动定位和自动定位

 

       最近由于项目需要,研究了下百度地图定位,他们提供的实例基本都是用监听器实现自动定位的。我想实现一种效果:当用户进入UI时,不定位,用户需要定位的时候,自己手动点击按钮,再去定位当前位置。  经过2天研究和咨询,找到了解决方案,在此备忘一下。

 

   注意:定位使用真机才能够真正定位;模拟器的话,在DDMS中的Emulator Control中,选择Manual,下面单选按钮选择Decimal,然后填写经纬度,send后,再点击定位我的位置按钮,就能定位了(这应该算是固定定位,哈哈。。。)、

 

         1、第一步当然是获取一个针对自己项目的key值。http://dev.baidu.com/wiki/static/imap/key/

2、使用百度API是有前提的,摘自百度:首先将API包括的两个文件baidumapapi.jar和libBMapApiEngine.so拷贝到工程根目录及libs\armeabi目录下,并在工程属性->Java Build Path->Libraries中选择“Add JARs”,选定baidumapapi.jar,确定后返回,这样您就可以在您的程序中使用API了。(这两个文件见附件)。

3、按照自己的需求写一个layout,我的如下:

      <?xml version="1.0" encoding="utf-8"?>

<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"
  >
  
  <TextView 
  	android:id="@+id/myLocation_id" 
  	android:layout_width="fill_parent" 
  	android:layout_height="wrap_content"
  	android:textSize="15dp"
  	android:gravity="center_horizontal"
  	android:textColor="@drawable/black"
  	android:background="@drawable/gary"
  	/>
  	
  <com.baidu.mapapi.MapView android:id="@+id/bmapsView"
	android:layout_width="fill_parent" android:layout_height="fill_parent" 
	android:clickable="true"  android:layout_weight="1"   
   />
  
  <Button 
	  android:layout_width="wrap_content" 
	  android:layout_height="wrap_content" 
	  android:id="@+id/location_button_id" 
	  android:text="@string/location_button_text"
   />
    
</LinearLayout>

 需要特别注意的是:<com.baidu.mapapi.MapView  /> 这玩意。

 

 4、写一个MapApplication实现application,提供全局的BMapManager,以及其初始化。

 

 public BMapManager mapManager = null;
	static MapApplication app;
	public String mStrKey = "你申请的key值";
	
	@Override
	public void onCreate() {
		mapManager = new BMapManager(this);
		mapManager.init(mStrKey, new MyGeneralListener());
	}
	@Override
	//建议在您app的退出之前调用mapadpi的destroy()函数,避免重复初始化带来的时间消耗
	public void onTerminate() {
		// TODO Auto-generated method stub
		if(mapManager != null)
		{
			mapManager.destroy();
			mapManager = null;
		}
		super.onTerminate();
	}

	 static class MyGeneralListener implements MKGeneralListener{

		@Override
		public void onGetNetworkState(int arg0) {
			Toast.makeText(MapApplication.app.getApplicationContext(), "您的网络出错啦!",
					Toast.LENGTH_LONG).show();
		}
		@Override
		public void onGetPermissionState(int iError) {
			if (iError ==  MKEvent.ERROR_PERMISSION_DENIED) {
				// 授权Key错误:
				Toast.makeText(MapApplication.app.getApplicationContext(),"您的授权Key不正确!",
						Toast.LENGTH_LONG).show();
			}
		}
	}
	5、接下来就是按照百度api写定位代码了,使用handler机制去添加定位图层,需要说明的都在注释上了。

        private BMapManager mBMapMan = null;
	private MapView mMapView = null;
	private MapController bMapController;
	private MKLocationManager mkLocationManager;
	private MKSearch mkSearch;
	
	private TextView address_view;   //定位到的位置信息
	
	private ProgressDialog dialog;
	private List<HotelInfo> hotelList;
	
	private int distance = 1000;  //查询的范围(单位:m)
	
    Handler handler = new Handler(){
	   	@Override
	   	public void handleMessage(Message msg) {
	   		
	   		double lat = msg.getData().getDouble("lat");
	   		double lon = msg.getData().getDouble("lon");
	   		if(lat!=0&&lon!=0){
	   			GeoPoint point = new GeoPoint(
	   					(int) (lat * 1E6),
						(int) (lon * 1E6));
	   		    bMapController.animateTo(point);  //设置地图中心点
	   		    bMapController.setZoom(15);
	   		    
	   		    mkSearch.reverseGeocode(point);   //解析地址(异步方法)
	   		    
	   			MyLocationOverlay myLoc = new MyLocationOverlayFromMap(ShowMapAct.this,mMapView);
		        myLoc.enableMyLocation(); 	// 启用定位
		        myLoc.enableCompass();    	// 启用指南针
		        mMapView.getOverlays().add(myLoc);
	   		}else{
	   			Toast.makeText(ShowMapAct.this, "没有加载到您的位置", Toast.LENGTH_LONG).show();
	   		}
	   		
	        if(hotelList!=null){
	    		Drawable marker = getResources().getDrawable(R.drawable.iconmarka);  //设置marker
	 	        marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight());   //为maker定义位置和边界
	    		mMapView.getOverlays().add(new OverItemList(marker,hotelList,ShowMapAct.this,bMapController));
	    	}else if(hotelList==null&&lat!=0&&lon!=0){
	    		Toast.makeText(ShowMapAct.this, "网络异常,没有获取到酒店信息。", Toast.LENGTH_LONG).show();
	    	}
			if(dialog!=null)  dialog.dismiss();
	   	}
   };
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		
		distance = getIntent().getExtras().getInt("distance");   //获取查询范围
		
		super.onCreate(savedInstanceState);
		setContentView(R.layout.location);
		
		mMapView = (MapView)findViewById(R.id.bmapsView);   //初始化一个mapView  存放Map
		init();  //初始化地图管理器
		super.initMapActivity(mBMapMan);
		
		
		address_view = (TextView)findViewById(R.id.myLocation_id);
		SpannableStringBuilder style = new SpannableStringBuilder(String.format(getResources().getString(R.string.location_text),"位置不详"));
		style.setSpan(new ForegroundColorSpan(Color.RED), 5, style.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
		address_view.setText(style);
		
		Button location_button = (Button)findViewById(R.id.location_button_id);
		location_button.setOnClickListener(new View.OnClickListener(){
			@Override
			public void onClick(View v) {
				 dialog = ProgressDialog.show(ShowMapAct.this, "", "数据加载中,请稍后.....");
				 new Thread(new MyThread()).start();
			}
		});
		
		mkSearch = new MKSearch();   //初始化一个MKSearch,根据location解析详细地址
		mkSearch.init(mBMapMan, this);
        mMapView.setBuiltInZoomControls(true);   //启用内置的缩放控件
        bMapController = mMapView.getController();
        GeoPoint defaultPoint = new GeoPoint((int) (39.920934 * 1E6),(int) (116.412817 * 1E6));  //用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)
        bMapController.setCenter(defaultPoint);  //设置地图中心点
        bMapController.setZoom(12);  //设置地图zoom级别
        
        mkLocationManager = mBMapMan.getLocationManager();
	}
	/**
	 * 初始化地图管理器BMapManager
	 */
	public void init(){
		MapApplication app = (MapApplication)getApplication();
        if (app.mapManager == null) {
        	app.mapManager = new BMapManager(getApplication());
        	app.mapManager.init(app.mStrKey, new MapApplication.MyGeneralListener());
        }
        mBMapMan = app.mapManager;
	}
	
	@Override
	protected void onDestroy() {
		MapApplication app = (MapApplication)getApplication();
		if (mBMapMan != null) {
			mBMapMan.destroy();
			app.mapManager.destroy();
			app.mapManager = null;
			mBMapMan = null;
		}
		super.onDestroy();
	}
	
  
    @Override  
    protected void onPause() {  
        if (mBMapMan != null) {  
            // 终止百度地图API  
        	mBMapMan.stop();  
        }  
        super.onPause();  
    }
  
    @Override  
    protected void onResume() {
        if (mBMapMan != null) {  
            // 开启百度地图API  
        	mBMapMan.start();  
        }  
        super.onResume();  
    }
	
	@Override
	protected boolean isRouteDisplayed() {
		return false;
	}
	
	@Override
	public void onGetAddrResult(MKAddrInfo result, int iError) {
		if(result==null) return;
		SpannableStringBuilder style = new SpannableStringBuilder(String.format(getResources().getString(R.string.location_text),result.strAddr));
		style.setSpan(new ForegroundColorSpan(Color.RED), 5, style.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
		address_view.setText(style);
		if(dialog!=null) dialog.dismiss();
	}
	
	@Override
	public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) {}
	@Override
	public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) {}
	@Override
	public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {}
	@Override
	public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) {}
	
	/**
	 * 重新定位,加载数据
	 * @author Administrator
	 *
	 */
	class MyThread implements Runnable{
		@Override
		public void run() {
			/**
			  * 最重要的就是这个玩意
			  * 由于LocationListener获取第一个位置修正的时间会很长,为了避免用户等待,
			  * 在LocationListener获取第一个更精确的位置之前,应当使用getLocationInfo() 获取一个缓存的位置
			  */
		    Location location = mkLocationManager.getLocationInfo();
		    double lat = 0d,lon = 0d;
			if(location!=null){   //定位到位置
				String coordinate = location.getLatitude()+","+location.getLongitude();
				HotelRemoteData hotelData = new HotelRemoteData();
				/**
				 * 远程获取酒店列表数据
				 */
		    	hotelList = hotelData.getHotelToMap(coordinate,distance);
	        	lat = location.getLatitude();
	        	lon = location.getLongitude();
			}
			
        	Message msg = new Message();
        	Bundle data = new Bundle();
        	data.putDouble("lat", lat);
        	data.putDouble("lon", lon);
        	msg.setData(data);
        	handler.sendMessage(msg);
		}
	}
 

  6、还有一种就是百度示例相当推荐的,也是加载定位位置速度比较快的,那就是通过定位监听器来定位信息。没啥难的,照着百度的示例写,都能搞定。

 

LocationListener listener = new LocationListener() {
    @Override
	/** 位置变化,百度地图即会调用该方法去获取位置信息。
	  * (我测试发现就算手机不动,它也会偶尔重新去加载位置;只要你通过重力感应,他就一定会重新加载)
	  */
    public void onLocationChanged(Location location) {
      GeoPoint gp =  new GeoPoint((int) (location.getLatitude() * 1E6), (int) (location.getLongitude() * 1E6));   //通过地图上的经纬度转换为地图上的坐标点
	  bMapController.animateTo(gp);  //动画般的移动到定位的位置
	}
};
 

1 楼 csluqiang 2012-03-23  
不错,看看,需要

文章评论

为什么程序员都是夜猫子
为什么程序员都是夜猫子
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
总结2014中国互联网十大段子
总结2014中国互联网十大段子
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序员的鄙视链
程序员的鄙视链
编程语言是女人
编程语言是女人
程序员都该阅读的书
程序员都该阅读的书
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
一个程序员的时间管理
一个程序员的时间管理
如何成为一名黑客
如何成为一名黑客
程序员必看的十大电影
程序员必看的十大电影
 程序员的样子
程序员的样子
每天工作4小时的程序员
每天工作4小时的程序员
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
漫画:程序员的工作
漫画:程序员的工作
那些争议最大的编程观点
那些争议最大的编程观点
Java程序员必看电影
Java程序员必看电影
鲜为人知的编程真相
鲜为人知的编程真相
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
代码女神横空出世
代码女神横空出世
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
我的丈夫是个程序员
我的丈夫是个程序员
老程序员的下场
老程序员的下场
中美印日四国程序员比较
中美印日四国程序员比较
程序员应该关注的一些事儿
程序员应该关注的一些事儿
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
我是如何打败拖延症的
我是如何打败拖延症的
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有