当前位置: 首页 > 工具软件 > baidu yogurt > 使用案例 >

baidu地图API

邓丰
2023-12-01

开发指南:

http://dev.baidu.com/wiki/imap/index.php?title=Android%E5%B9%B3%E5%8F%B0/%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97

 

申请KEY:

http://dev.baidu.com/wiki/static/imap/key/

 

API,文档和例子下载:

http://dev.baidu.com/wiki/imap/index.php?title=Android%E5%B9%B3%E5%8F%B0/%E7%9B%B8%E5%85%B3%E4%B8%8B%E8%BD%BD


目前采用的定位方式有:

GPS定位:与您手机的硬件条件相关,一般在户外时才能生效。定位精度一般在5-10米,不需要通过网络。可以在手机系统的设置中打开或者关闭。
基站定位:和手机信号及网络状况相关,定位精度与GPS相比较差,但在一般的室内仍可生效。
Wi-Fi定位:和手机所处的Wi-Fi网络相关,定位精度与GPS相比较差,大多在室内生效。

不能定位问题:

发现没装SIM卡或是废卡时,定位经常会出现不能定位的问题,onLocationChanged不会回调。

正确的方式需要SIM卡,并且需要网络(wifi | GPRS GPRS偏差较大),而设置-位置里的选项并没有效果,勾不勾都无所谓,可能baidu底层处理了?


接口调用:

接口需要在UI主线程里调用,因为需要用到消息循环,当然你可以在你调用的线程里创建已个消息循环。


GeoPoint为什么是以微度的整数形式存储:

GeoPoint(int latitudeE6, int longitudeE6)

用整形存储,加快运行速度  int的运算要比浮点快很多。


下面的代码是简单的实现了定位和POI的多关键字搜索:需要在UI线程里调用相关方法。

public class BaiduMapManager {


	/** Baidu map开关 */
	public static final boolean isAddBaiduMap = true;


	/** 申请的Key */
	public static final String KEY = "26E61E1DF0E776336AF17E9BF1FC9979EA713CCE";


	private static BMapManager bMapManager;
	
	private static LocationListener mLocationListener;
	
	/** 搜索模块,也可去掉地图模块独立使用	 */
	private static MKSearch mSearch;
	
	private static boolean hasGetLocation;


	private static Location lastLocation;


	private static void debug(String msg) {


		DebugManager.Log_debug("Baidu", msg);
	}


	public static void init() {


		if (!isAddBaiduMap) {
			return;
		}


		bMapManager = new BMapManager(AppConfig.getContext());


		bMapManager.init(KEY, new MKGeneralListener() {


			/**
			 * 返回网络错误
			 */
			@Override
			public void onGetPermissionState(int iError) {
				debug("ERROR id:" + iError);
			}


			/**
			 * 返回授权验证错误
			 * 300 = 验证失败
			 */
			@Override
			public void onGetNetworkState(int iError) {
				debug("ERROR id:" + iError);
			}
		});      
        
		// 设置回调结果容量
        MKSearch.setPoiPageCapacity(10);
		
        // 初始化搜索模块,注册事件监听
        mSearch = new MKSearch();           
        mSearch.init(bMapManager, new MKSearchListener(){


        	@Override
			public void onGetPoiResult(MKPoiResult res, int type, int error) {
				
				// 错误号可参考MKEvent中的定义
				if (error != 0 || res == null) {
					GameConfig.showToast("抱歉,未找到结果");
					return;
				}
				
				ArrayList<MKPoiResult> result = res.getMultiPoiResult();


				if (result == null) {
					GameConfig.showToast("抱歉,未找到结果");
					return;
				} 
				
				GameConfig.showToast("成功找到" + result.size() + "条结果!");
				
				// 用完了马上关上,否则手机一直处于定位状态!!!				
				stop();
			}


			@Override
			public void onGetDrivingRouteResult(MKDrivingRouteResult res,
					int error) {
			}


			@Override
			public void onGetTransitRouteResult(MKTransitRouteResult res,
					int error) {
			}


			@Override
			public void onGetWalkingRouteResult(MKWalkingRouteResult res,
					int error) {
			}


			@Override
			public void onGetAddrResult(MKAddrInfo res, int error) {
			}			
        });
        
        // 注册定位事件
		mLocationListener = new LocationListener(){


			@Override
			public void onLocationChanged(Location location) {
				lastLocation = location;
				seachPOI(lastLocation);
			}	
        };
	}
	
	private static void seachPOI(Location location) {
		
		if(location == null) {
			GameConfig.showToast("抱歉,未找到结果");
			return;
		}
		
		if(!hasGetLocation) {
			
			hasGetLocation = true;
			
			String strLog = String.format("您当前的位置:\r\n" +
					"纬度:%f\r\n" +
					"经度:%f",
					location.getLatitude(),
					location.getLongitude());


			debug(strLog);


			// 关键词(1.10]
			String[] keys = new String[] { "公园", "KTV", "电影院", "景点",
					"餐馆", "麦当劳", "肯德基", "必胜客", "饭店", "医院" };
			
			// 用整形存储,加快运行速度  int的运算要比浮点快很多
			GeoPoint gp = new GeoPoint(
					(int) (location.getLatitude() * 1E6),
					(int) (location.getLongitude() * 1E6));
			
			mSearch.poiMultiSearchNearBy(keys, gp, 5000);
		}		
	}


	/**
	 * 请在程序推出前调用
	 */
	public static void destroy() {


		if (!isAddBaiduMap) {
			return;
		}


		if (bMapManager != null) {
			bMapManager.destroy();
			bMapManager = null;
		}
	}


	/**
	 * 开启百度地图API
	 */
	public static void start() {


		if (!isAddBaiduMap) {
			return;
		}
		
		hasGetLocation = false;
		
		ProgressDialog pd = GameConfig.getProgressDialog();
		pd.setTitle("正在获取地理位置信息!");
		pd.setIcon(0);
		pd.setMessage(AppConfig.getResources().getString(R.string.wait));
		pd.setCancelable(true);
		
		GameConfig.sendMessage(GameConfig.MSG_PROGRESSDIALOG_SHOW);
		
		if (bMapManager != null) {
			
			// 注册Listener
			bMapManager.getLocationManager().requestLocationUpdates(mLocationListener);
			
			bMapManager.start();		
			
			lastLocation = bMapManager.getLocationManager().getLocationInfo();
			
			if(lastLocation != null) {
				seachPOI(lastLocation);
			}
		}
	}
	
	/**
	 * 终止百度地图API,调用此函数后,不会发生回调
	 */
	public static void stop() {


		if (!isAddBaiduMap) {
			return;
		}


		if (bMapManager != null) {
			
			// 移除listener
			bMapManager.getLocationManager().removeUpdates(mLocationListener);
			
			bMapManager.stop();
		}
		
		GameConfig.sendMessage(GameConfig.MSG_PROGRESSDIALOG_HIDE);
	}	
}



 类似资料: