三 Android 程序开发——百度地图的使用 地图定位(定位+跟随+距离测量( 四 )


2.关闭方向传感器
//orientationListener.stop();//关闭方向传感器
3.方向传感器的调用
//定位结合方向传感器,从而可以实时监测到X轴坐标的变化,从而就可以检测到//private void useLocationOrientationListener() {//orientationListener = new MapOrientationListener(this);//orientationListener.setMapOrientationListener(new MapOrientationListener.onOrientationListener() {//@Override//public void onOrientationChanged(float x) {//监听方向的改变,方向改变时,需要得到地图上方向图标的位置//mCurrentX = x;//}//});//}
4.继承传感器类,重写的方向传感器辅助类
public class MapOrientationListener implements SensorEventListener {private SensorManager mySensorManager;private Sensor mySensor;private Context myContext;private float lastX;private onOrientationListener myOrientationListener;public MapOrientationListener(Context myContext) {//方向传感器的一个构造器super();this.myContext = myContext;}/*** 开启方向传感器*/public void start() {//先通过系统服务来得到传感器管理对象mySensorManagermySensorManager = (SensorManager) myContext.getSystemService(Context.SENSOR_SERVICE);if (mySensorManager != null) {//如果传感器管理对象不为空,则可以通过传感器管理对象来获得方向传感器对象//获得方向传感器对象mySensor = mySensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION);}if (mySensor != null) {//如果方向传感器不为空,则给该方向传感器注册监听事件mySensorManager.registerListener(this, mySensor, SensorManager.SENSOR_DELAY_UI);}}/*** 解除注册方向传感器监听事件*/public void stop() {mySensorManager.unregisterListener(this);}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {// TODO Auto-generated method stub}/*** 监听方向发生变化*/@Overridepublic void onSensorChanged(SensorEvent event) {//精度发生改变的时候if (event.sensor.getType() == Sensor.TYPE_ORIENTATION) {//如果是方向传感器float x = event.values[SensorManager.DATA_X];//获得传感器的X轴的坐标,可以返回3个值,即X轴的坐标,Y轴坐标,Z轴坐标,我们只需要X轴坐标if (Math.abs(x - lastX) > 1.0) {//对比本次的X坐标的变化比上一次的变化差大于1.0就说明方向发生改变if (myOrientationListener != null) {//说明主界面已经注册了事件,即不为空,然后产生一个回调将实时变化X轴的坐标传入//通过一个回调方法,通知主界面去更新UImyOrientationListener.onOrientationChanged(lastX);//就需要把上一次的X轴坐标传入,在MainActivity中的回调方法中去获取即可}}lastX = x;}}public void setMapOrientationListener(onOrientationListener myOrientationListener) {this.myOrientationListener = myOrientationListener;}//写一个接口实现方向改变的监听产生的回调public interface onOrientationListener {void onOrientationChanged(float x);//回调的方法}}
@3距离的测量
百度上提供了很多种,我目前在项目中使用了一种,分享一下
private final static double DEF_PI = 3.14159265359; // PIprivate final static double DEF_2PI = 6.28318530712; // 2*PIprivate final static double DEF_PI180 = 0.01745329252; // PI/180.0private final static double DEF_R = 6370693.5; // 地球半径,m
//根据球面距离计算两点直接的距离public String getLongDistance(double lat1, double lon1, double lat2, double lon2) {double ew1, ns1, ew2, ns2;double distance;// 角度转换为弧度ew1 = lon1 * DEF_PI180;ns1 = lat1 * DEF_PI180;ew2 = lon2 * DEF_PI180;ns2 = lat2 * DEF_PI180;// 求大圆劣弧与球心所夹的角(弧度)distance = Math.sin(ns1) * Math.sin(ns2) + Math.cos(ns1) * Math.cos(ns2) * Math.cos(ew1 - ew2);// 调整到[-1..1]范围内,避免溢出if (distance > 1.0) {distance = 1.0;} else if (distance