百度地图---获取当前的位置返回的是汉字显示而不是经纬度

这是当前项目的第二个需求,返回当前的位置 

这个需求在百度地图里面实现很简单,但是出了一大堆的乱起八糟的错误,错误等到后面的文章再说,先说要获取当前位置怎么做

原理很简单:

第一个需要是的通过  GPS返回geocode   

第二步就是反geo转码得到地址输出来就可以了

实现的时候就三个东西:

1.定位器  百度里面称为  LocationClient

2.返回结果的监听器 百度里面是 一个接口类  BDLocationListener  我们需要去实现他就可以了

3.结果的反编译  因为返回的结果是经纬度 百度里面是  GeoCoder  

只需要用到这三个东西就可以实现获取当前的位置,首先我们看看怎么使用百度提供的demo来搞定  我把多余的代码全部去掉了

/**  * 此demo用来展示如何结合定位SDK实现定位,并使用MyLocationOverlay绘制定位位置 同时展示如何使用自定义图标绘制并点击时弹出泡泡  *   */ public class LocationDemo extends Activity implements OnGetGeoCoderResultListener { // 定位相关 LocationClient mLocClient; public MyLocationListenner myListener = new MyLocationListenner(); GeoCoder mSearch = null;//反编译地理位置 private String locationStrAddress;//这个变量就是存储  汉字地址 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_location); // 定位初始化 mLocClient = new LocationClient(this);//在百度里面  这里的参数是this   他在全局变量application里面已经初始化地图了,

//但是我觉得还是需要改成getapplicationContext()为好 mLocClient.registerLocationListener(myListener); LocationClientOption option = new LocationClientOption(); option.setOpenGps(true);// 打开gps option.setCoorType("bd09ll"); // 设置坐标类型  这个好像是百度的经纬度类型,还有国测局加密经纬度gcj02  还有bd09 是百度加密墨卡托坐标 option.setScanSpan(1000); mLocClient.setLocOption(option); mLocClient.start(); // 初始化搜索模块,注册事件监听 mSearch = GeoCoder.newInstance(); mSearch.setOnGetGeoCodeResultListener(this); } /** * 定位SDK监听函数 */ public class MyLocationListenner implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { // map view 销毁后不在处理新接收的位置 if (location == null) return; LatLng ll = new LatLng(location.getLatitude(),location.getLongitude()); mSearch.reverseGeoCode(new ReverseGeoCodeOption().location(ll));//这个位置就是反编译处理 } public void onReceivePoi(BDLocation poiLocation) { } } @Override protected void onPause() { super.onPause(); } @Override protected void onResume() { super.onResume(); } @Override protected void onDestroy() { // 退出时销毁定位 mLocClient.stop(); super.onDestroy(); } @Override public void onGetGeoCodeResult(GeoCodeResult result) { //这个是通过汉字转换为经纬度的 } @Override public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) { // TODO Auto-generated method stub if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { Toast.makeText(LocationDemo.this, "抱歉,未能找到结果", Toast.LENGTH_LONG).show(); locationStrAddress = "抱歉,未能找到结果"; return; } locationStrAddress = result.getAddress().toString(); Toast.makeText(LocationDemo.this, result.getAddress(),Toast.LENGTH_LONG).show(); } }

整个实现就只有上面的那些东西,然后那个类里面要用,直接copy到onCreate里面,重载函数贴进去就ok了,

这个是百度提供的demo方法

接下来看看,在需要调用定位的时候更简单的操作呢,那就是把定位的操作放在application里面,在自己定义的application里面加上下面的代码就可以:

这是变量:

    public LocationClient mLocationClient;//定位客户端     public MyLocationListener mMyLocationListener;//监听器

    public TextView mLocationResult,logMsg;//这是返回的结果,当前你也可以用String 来存储了

onCreate()里面加上这些代码:

        mLocationClient = new LocationClient(this.getApplicationContext());         mMyLocationListener = new MyLocationListener();         mLocationClient.registerLocationListener(mMyLocationListener);

下面是自定义的监听器:

    /**      * 实现实时位置回调监听      */     public class MyLocationListener implements BDLocationListener {         @Override         public void onReceiveLocation(BDLocation location) {             //Receive Location             StringBuffer sb = new StringBuffer(256);             sb.append("time : ");             sb.append(location.getTime());             sb.append("\nerror code : ");             sb.append(location.getLocType());             sb.append("\nlatitude : ");             sb.append(location.getLatitude());             sb.append("\nlontitude : ");             sb.append(location.getLongitude());             sb.append("\nradius : ");             sb.append(location.getRadius());             if (location.getLocType() == BDLocation.TypeGpsLocation){// GPS定位结果                 sb.append("\nspeed : ");                 sb.append(location.getSpeed());// 单位:公里每小时                 sb.append("\nsatellite : ");                 sb.append(location.getSatelliteNumber());                 sb.append("\nheight : ");                 sb.append(location.getAltitude());// 单位:米                 sb.append("\ndirection : ");                 sb.append(location.getDirection());                 sb.append("\naddr : ");                 sb.append(location.getAddrStr());                 sb.append("\ndescribe : ");                 sb.append("gps定位成功");             } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){// 网络定位结果                 sb.append("\naddr : ");                 sb.append(location.getCity());                 //运营商信息                 sb.append("\noperationers : ");                 sb.append(location.getOperators());                 sb.append("\ndescribe : ");                 sb.append("网络定位成功");             } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果                 sb.append("\ndescribe : ");                 sb.append("离线定位成功,离线定位结果也是有效的");             } else if (location.getLocType() == BDLocation.TypeServerError) {                 sb.append("\ndescribe : ");                 sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");             } else if (location.getLocType() == BDLocation.TypeNetWorkException) {                 sb.append("\ndescribe : ");                 sb.append("网络不同导致定位失败,请检查网络是否通畅");             } else if (location.getLocType() == BDLocation.TypeCriteriaException) {                 sb.append("\ndescribe : ");                 sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");             }             logMsg(sb.toString());             Log.i("BaiduLocationApiDem", sb.toString());            // mLocationClient.setEnableGpsRealTimeTransfer(true);         }     }     /**      * 显示请求字符串      * @param str      */     public void logMsg(String str) {         try {             if (mLocationResult != null)                 mLocationResult.setText(str);         } catch (Exception e) {             e.printStackTrace();         }     }

在application里面完成上面的操作之后,每次需要调用定位的时候就这样做,比如在一个activity里面:

变量定义:

    private LocationClient mLocationClient;     private TextView LocationResult;

onCreate()里面初始化:

    mLocationClient = ((LocationApplication)getApplication()).mLocationClient;

   ((LocationApplication)getApplication()).mLocationResult = LocationResult;//这个时候他的结果是没有值的,因为还没有启动定位

接下来就是启动定位了:

    private void initLocation(){         LocationClientOption option = new LocationClientOption();         option.setLocationMode(tempMode);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备         option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系,         int span=1000;         try {             span = Integer.valueOf(frequence.getText().toString());         } catch (Exception e) {             // TODO: handle exception         }         option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的         option.setIsNeedAddress(checkGeoLocation.isChecked());//可选,设置是否需要地址信息,默认不需要         option.setOpenGps(true);//可选,默认false,设置是否使用gps         option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果         option.setIgnoreKillProcess(true);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死         mLocationClient.setLocOption(option);     }

那么使用的时候你只需要调用上面的启动函数就行了,不管你是在onCreate里面启动,还是按钮触发事件启动  下面三行代码就可以:

initLocation();//这行代码有时候是多余的,看你在哪里用

mLocationClient.start();//定位SDK start之后会默认发起一次定位请求,开发者无须判断isstart并主动调用request mLocationClient.requestLocation();

这样写有一个好处就是我的  定位客户端初始化再也不关心  context的问题了

但是  使用百度地图定位还是出现很多乱起八糟的问题,很考验人的,接下来看看出现的那些位置吧

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券