百度地图学习总结(3)—定位

来源:互联网 发布:linux下怎么编程 编辑:程序博客网 时间:2024/06/08 16:48

上一篇讲了基本的地图接入

1.承上启下

上节说了helloMap,那么这节就来讨论下定位吧。

先上效果图:

然后不想听我叨叨的朋友可以直接去看代码:
http://download.csdn.net/download/user11223344abc/10039742

2.好了,来大概讲讲代码的逻辑吧

  • 初始化定死位置到成都

setMapCorePoint(30.663791, 104.07281);//成都

  • 这里我写了一个方法,地图中心点设置
    /**     * 地图中心点设置     */    private LatLng setMapCorePoint(double vd, double jd) {//        //设定中心点坐标   latlng(经度,纬度)        LatLng cenpt = new LatLng(vd, jd);        //定义地图状态        MapStatus mMapStatus = new MapStatus.Builder()                .target(cenpt)                .zoom(14)                .build();        //定义MapStatusUpdate对象,以便描述地图状态将要发生的变化        final MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);        //改变地图状态位置//        mBaiduMap.setMapStatus(mMapStatusUpdate);        mBaiduMap.animateMapStatus(mMapStatusUpdate);        return cenpt;    }
  • 设置了中心点之后呢,我再ui上画了一个按钮,一点,便对我目前位置进行定位,具体逻辑如下:
 /***         * 初始化定位sdk,         */        mLocationService = new LocationService(getApplicationContext());        //获取mLocationService实例,建议应用中只初始化1个location实例,然后使用,可以参考其他示例的activity,都是通过此种方式获取mLocationService实例的        mLocationService.registerListener(mListener = new BDLocationListener() {            @Override            public void onReceiveLocation(BDLocation bdLocation) {                Log.e("shitmap", "定位成功");                if (mMapMoveFlag) {                    final double longitude = bdLocation.getLongitude();//精度                    final double latitude = bdLocation.getLatitude();//纬度                    Log.e("shitmap", "    longitude 精度 == " + longitude + "   latitude  纬度  == " + latitude);                    LatLng pointer = setMapCorePoint(latitude, longitude);                    addPointerMarker(pointer);                    mMapMoveFlag = false;                }            }        });
  • 从上面代码可以看到,mLocationService,这个Service是sdk内的,需要在清单文件中声明:
    <application>        <!--定位服务-->        <service            android:name="com.baidu.location.f"            android:enabled="true"            android:process=":remote" >            <intent-filter>                <action android:name="com.baidu.location.service_v2.2" >                </action>            </intent-filter>        </service>    </application>
  • 从上面代码可以看到,这个定位说白了,就是在回调内进行操作,BDLocationListener

BDLocation拿到经纬度,这个经纬度就是定位到我的位置的经纬度,然后再去调用我上面写的设置地图中心点的方法,这样,定位就成了。

  • 定位完事儿之后,发现地图上并没有变出一个icon来表示我们目前的位置,于是就出现了这么一个方法。添加一个marker来对我们定位到的位置进行一个标识,传入的经纬度,就是marker的经纬度,这里我们传入的是我当前定位到经纬度,所以理所当然的在我定位的位置上会覆盖一个marker。
    private void addPointerMarker(LatLng pointer){//        定位完成最后,盖上一个icon,标识出定位的点        //定义Maker坐标点        //构建Marker图标        BitmapDescriptor bitmap = BitmapDescriptorFactory                .fromResource(R.mipmap.ic_launcher);        //构建MarkerOption,用于在地图上添加Marker        OverlayOptions option = new MarkerOptions()                .position(pointer)                .icon(bitmap);        //在地图上添加Marker,并显示        mBaiduMap.addOverlay(option);    }
  • 一点补充:关于标识,mMapMoveFlag
    因为定位回调会一直自嗨,所以在界面没有onStop时的时候,需要一个标识位来防止定位内的业务逻辑多次的重复执行。
    /***     * Stop location service     */    @Override    protected void onStop() {        // TODO Auto-generated method stub        mLocationService.unregisterListener(mListener); //注销掉监听        mLocationService.stop(); //停止定位服务        super.onStop();    }

接下来我们会讨论如何添加覆盖物

原创粉丝点击