zoukankan      html  css  js  c++  java
  • 百度地图定位SDK 之构想

    百度地图定位

    前提

     从香港旅游回来,心中油然升起一股热血滂湃,激励自己发现市场需求,向创业奋进,朝着梦想前进。

    简介

    百度Android定位SDK支持Android1.5以及以上设备,提供:

    • 定位功能:通过GPS、网络定位(WIFI、基站)混合定位模式,返回当前所处的位置信息
    • 反地理编码功能:解析当前所处的位置坐标,获得详细的地址描述信息。

    定位SDK支持多样化服务与定位策略,用户可通过设置不同的定位时间间隔、选择不同的定位服务模式、定制不同的定位结果信息来满足自身需求。

    支持Android1.5及以上系统

    定位原理

    使用百度Android定位SDK必须注册GPS和网络使用权限。定位SDK采用GPS、基站、Wi-Fi信号进行定位。当应用程序向定位SDK发起定位请求时,定位SDK会根据应用的定位因素(GPS、基站、Wi-Fi信号)的实际情况(如是否开启GPS、是否连接网络、是否有信号等)来生成相应定位依据进行定位。

    用户可以设置满足自身需求的定位依据:

    若用户设置GPS优先,则优先使用GPS进行定位,如果GPS定位未打开或者没有可用位置信息,且网络连接正常,定位SDK则会返回网络定位(即Wi-Fi与基站)的最优结果。为了使获得的网络定位结果更加精确,请打开手机的Wi-Fi开关。

    如图:



    定位SDK 再封装

    SDK分为几个类:

    LocationClient类  定位管理类
    LocationClientOption类  设置定位参数
    BDLocation类     位置信息封装
    BDLocationListener接口类   //定位触发监听
    BDNotifyListener 类   //定位提示 触发

    封装如下:

    public class LocationMananger extends BDNotifyListener implements
    		BDLocationListener {
    	public enum LocationEvent {
    		Receive, Poi
    	}
    
    	public enum LocationCoor {
    		Gcj02, // 返回国测局经纬度坐标系 coor=gcj02
    		Bd09, // 返回百度墨卡托坐标系 coor=bd09
    		Bd0911 // 返回百度经纬度坐标系 coor=bd09ll
    	}
    
    	private Context mContext;
    	private static LocationMananger mThis;
    	private Vibrator mVibrator;
    	private LocationClient mLocationClient;
    	private LocationClientOption mLocationClientOption;
    
    	LinkedList<IXLocationReceiveListener> mIXLocationReceiveListeners = new LinkedList<IXLocationReceiveListener>();
    	LinkedList<IXLocationNotifyListener> mIXLocationNotifyListeners = new LinkedList<IXLocationNotifyListener>();
    
    	public LocationMananger(Context context) {
    		mContext = context;
    		mVibrator = (Vibrator) ((Activity) mContext).getApplication()
    				.getSystemService(Service.VIBRATOR_SERVICE); // 控制震动
    		mLocationClient = new LocationClient(mContext);
    		onInitDefaultClientOption();
    	}
    
    	public static LocationMananger getInstance(Context context) {
    		if (mThis == null) {
    			return new LocationMananger(context);
    		}
    
    		return mThis;
    	}
    
    	public LocationClient getLocationClient() {
    		return mLocationClient;
    	}
    
    	@Override
    	public void onNotify(BDLocation mlocation, float distance) { // 位置监听 位置到达响应
    		// 震动 响铃
    		mVibrator.vibrate(1000);
    
    		onIXLocationNotifyListener(mlocation, distance);
    	}
    
    	@Override
    	public void onReceiveLocation(BDLocation bdLocation) { // 接收位置信息
    		onIXLocationReceiveListener(LocationEvent.Receive, bdLocation);
    	}
    
    	@Override
    	public void onReceivePoi(BDLocation bdLocation) { // 接收位置请求
    		onIXLocationReceiveListener(LocationEvent.Poi, bdLocation);
    	}
    
    	private void onInitDefaultClientOption() {
    		mLocationClientOption = new LocationClientOption();
    		mLocationClientOption.setOpenGps(true); // 打开gps
    		mLocationClientOption.setCoorType(getCoolType(null)); // 设置坐标类型为bd09ll
    
    		mLocationClientOption.setServiceName(mContext.getClass().toString());
    		mLocationClientOption.setProdName(mContext.getClass().toString());
    		mLocationClientOption.setPoiExtraInfo(true);
    		mLocationClientOption.setAddrType("all"); // 默认值为all时,表示返回地址信息。其他值都表示不返回地址信息。
    		mLocationClientOption.setScanSpan(3000); // 设置定位模式,小于1秒则一次定位;大于等于1秒则定时定位
    		mLocationClientOption.setPriority(LocationClientOption.NetWorkFirst); // 设置网络优先
    
    		mLocationClientOption.setPoiNumber(10);
    		mLocationClientOption.disableCache(true); // 设置是否启用缓存设定说明
    		mLocationClientOption.setPoiDistance(50); // 漠然十米
    		mLocationClient.setLocOption(mLocationClientOption);
    	}
    
    	public void openAddr() { // 开启返回地址信息
    		mLocationClientOption.setAddrType("all"); // 默认值为all时,表示返回地址信息。其他值都表示不返回地址信息。
    		mLocationClient.setLocOption(mLocationClientOption);
    	}
    
    	public void closeAddr() {// 关闭返回地址信息
    		mLocationClientOption.setAddrType(""); // 默认值为all时,表示返回地址信息。其他值都表示不返回地址信息。
    		mLocationClient.setLocOption(mLocationClientOption);
    	}
    
    	public void setScanSpan(int second) {
    		mLocationClientOption.setScanSpan(second * 1000); // 设置定位模式,小于1秒则一次定位;大于等于1秒则定时定位
    		mLocationClient.setLocOption(mLocationClientOption);
    	}
    
    	public void setPriority(boolean netPriority) {
    		if (netPriority) {
    			mLocationClientOption
    					.setPriority(LocationClientOption.NetWorkFirst); // 设置网络优先
    		} else {
    			mLocationClientOption.setPriority(LocationClientOption.GpsFirst); //
    		}
    		mLocationClient.setLocOption(mLocationClientOption);
    	}
    
    	public void setPoiDistance(int distance) {
    		mLocationClientOption.setPoiDistance(distance);
    		mLocationClient.setLocOption(mLocationClientOption);
    	}
    
    	public void setPoiNumber(int count) {
    		mLocationClientOption.setPoiNumber(count);
    		mLocationClient.setLocOption(mLocationClientOption);
    	}
    
    	public void openCache() {
    		mLocationClientOption.disableCache(false); // 设置是否启用缓存设定说明
    		mLocationClient.setLocOption(mLocationClientOption);
    	}
    
    	public void closeCache() {
    		mLocationClientOption.disableCache(true); // 设置是否启用缓存设定说明
    		mLocationClient.setLocOption(mLocationClientOption);
    	}
    
    	public void openGPS() {
    		mLocationClientOption.setOpenGps(true); // 打开gps
    		mLocationClient.setLocOption(mLocationClientOption);
    	}
    
    	public void closeGPS() {
    		mLocationClientOption.setOpenGps(false); // 打开gps
    		mLocationClient.setLocOption(mLocationClientOption);
    	}
    
    	public void setCoolType(LocationCoor coor) { // 设置类型
    		mLocationClientOption.setCoorType(getCoolType(coor));
    		mLocationClient.setLocOption(mLocationClientOption);
    	}
    
    	public void openPoiExtraInfo() { // 设置是否需要POI的电话地址等详细信息
    		mLocationClientOption.setPoiExtraInfo(true);
    		mLocationClient.setLocOption(mLocationClientOption);
    	}
    
    	public void closePoiExtraInfo() {
    		mLocationClientOption.setPoiExtraInfo(false);
    		mLocationClient.setLocOption(mLocationClientOption);
    	}
    
    	// IXLocationReceiveListener
    	public boolean addIXLocationReceiveListener(
    			IXLocationReceiveListener listener) {
    		if (hasIXLocationReceiveListener(listener))
    			return false;
    
    		mIXLocationReceiveListeners.add(listener);
    		mLocationClient.registerLocationListener(this);
    		return true;
    	}
    
    	public boolean hasIXLocationReceiveListener(
    			IXLocationReceiveListener listener) {
    		for (int i = 0; i < mIXLocationReceiveListeners.size(); i++) {
    			if (mIXLocationReceiveListeners.get(i) == listener)
    				return true;
    		}
    
    		return false;
    	}
    
    	public boolean removeIXLocationReceiveListener(
    			IXLocationReceiveListener listener) {
    		boolean bResult = false;
    		for (int i = 0; i < mIXLocationReceiveListeners.size(); i++) {
    			if (mIXLocationReceiveListeners.get(i) == listener) {
    				mIXLocationReceiveListeners.remove(i);
    				bResult = true;
    			}
    		}
    
    		if (mIXLocationReceiveListeners.size() == 0) {
    			mLocationClient.unRegisterLocationListener(this);
    		}
    
    		return bResult;
    	}
    
    	public void onIXLocationReceiveListener(LocationEvent event,
    			BDLocation bdLocation) {
    		for (int i = 0; i < mIXLocationReceiveListeners.size(); i++) {
    			mIXLocationReceiveListeners.get(i).onLocationReceive(event,
    					bdLocation);
    		}
    	}
    
    	// IXLocationNotifyListeners
    	public boolean addIXLocationNotifyListener(IXLocationNotifyListener listener) {
    		if (hasIXLocationNotifyListener(listener))
    			return false;
    
    		mIXLocationNotifyListeners.add(listener);
    		return true;
    	}
    
    	public boolean hasIXLocationNotifyListener(IXLocationNotifyListener listener) {
    		for (int i = 0; i < mIXLocationNotifyListeners.size(); i++) {
    			if (mIXLocationNotifyListeners.get(i) == listener)
    				return true;
    		}
    
    		return false;
    	}
    
    	public boolean removeIXLocationNotifyListener(
    			IXLocationNotifyListener listener) {
    		boolean bResult = false;
    		for (int i = 0; i < mIXLocationNotifyListeners.size(); i++) {
    			if (mIXLocationNotifyListeners.get(i) == listener) {
    				mIXLocationNotifyListeners.remove(i);
    				bResult = true;
    			}
    		}
    
    		return bResult;
    	}
    
    	public void onIXLocationNotifyListener(BDLocation bdLocation, float distance) {
    		for (int i = 0; i < mIXLocationNotifyListeners.size(); i++) {
    			mIXLocationNotifyListeners.get(i).onLocationNotify(bdLocation,
    					distance);
    		}
    	}
    
    	public static String getErrorString(int errorCode) { // BDLocation.getLocType()
    		if (errorCode == 61) {
    			return "GPS定位结果";
    		} else if (errorCode == 62) {
    			return "扫描整合定位依据失败。此时定位结果无效。";
    		} else if (errorCode == 63) {
    			return "网络异常,没有成功向服务器发起请求。此时定位结果无效。";
    		} else if (errorCode == 65) {
    			return "定位缓存的结果。";
    		} else if (errorCode == 66) {
    			return "离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果";
    		} else if (errorCode == 67) {
    			return "离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果";
    		} else if (errorCode == 68) {
    			return "网络连接失败时,查找本地离线定位时对应的返回结果";
    		} else if (errorCode == 161) {
    			return "表示网络定位结果";
    		} else if (errorCode >= 162 || errorCode <= 167) {
    			return "服务端定位失败。";
    		}
    		return "其它错误";
    	}
    
    	private String getCoolType(LocationCoor coor) {
    		if (coor == LocationCoor.Bd09) {
    			return "bd09";
    		} else if (coor == LocationCoor.Gcj02) {
    			return "gcj02";
    		} else {
    			return "bd09ll";
    		}
    	}
    
    	public interface IXLocationReceiveListener {
    		public void onLocationReceive(LocationEvent event, BDLocation bdLocation);
    	}
    
    	public interface IXLocationNotifyListener {
    		public void onLocationNotify(BDLocation bdLocation, float distance);
    	}
    }
    感言
    一个类包含了它所有功能,一个程序只构造一个实例,是不是非常方便?
    夜深了,我总是在想一个问题,技术永无止境,我们该如何立足社会?

    下载

  • 相关阅读:
    Dojo初探之5:dojo的request(请求)操作、请求过程事件绑定和隐藏数据data()操作(基于dojo1.11.2版本)
    Dojo初探之4:dojo的event(鼠标/键盘)事件绑定操作(基于dojo1.11.2版本)
    为什么使用dojo?dojo与jquery有什么不同?dojo适合什么开发场景?
    Dojo初探之3:dojo的DOM操作、query操作和domConstruct元素位置操作(基于dojo1.11.2版本)
    nodejs实战:使用原生nodeJs模块实现静态文件及REST请求解析及响应(基于nodejs6.2.0版本,不使用express等webMVC框架 )
    Dojo初探之2:设置dojoConfig详解,dojoConfig参数详解+Dojo中预置自定义AMD模块的四种方式(基于dojo1.11.2)
    Dojo初探之1:AMD规范,编写符合AMD规范(异步模块加载机制)的模块化JS(其中dojo采用1.11.2版本)
    POI使用:用poi接口不区分xls/xlsx格式解析Excel文档(41种日期格式解析方法,5种公式结果类型解析方法,3种常用数值类型精度控制办法)
    Lucene全文搜索之分词器:使用IK Analyzer中文分词器(修改IK Analyzer源码使其支持lucene5.5.x)
    搭建rtmp直播流服务之4:videojs和ckPlayer开源播放器二次开发(播放rtmp、hls直播流及普通视频)
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3217870.html
Copyright © 2011-2022 走看看