百度地图----地图覆盖物

百度地图—-覆盖物

ONE Goal ,ONE Passion !

百度地图SDK为广大开发者提供的基础地图和上面的各种覆盖物元素,具有一定的层级压盖关系,具体如下(从下至上的顺序):
1、基础底图(包括底图、底图道路、卫星图等);
2、瓦片图层(TileOverlay);
3、地形图图层(GroundOverlay);
4、热力图图层(HeatMap);
5、实时路况图图层(BaiduMap.setTrafficEnabled(true););
6、百度城市热力图(BaiduMap.setBaiduHeatMapEnabled(true););
7、底图标注(指的是底图上面自带的那些POI元素);
8、几何图形图层(点、折线、弧线、圆、多边形);
9、标注图层(Marker),文字绘制图层(Text);
10、指南针图层(当地图发生旋转和视角变化时,默认出现在左上角的指南针);
11、定位图层(BaiduMap.setMyLocationEnabled(true););
12、弹出窗图层(InfoWindow);
13、自定义View(MapView.addView(View););

下面介绍几个常用的地图覆盖物

自动定位


  private BDLocation loc;//记录初次定位的位置
 // 开启定位图层
                mBaiduMap.setMyLocationEnabled(true);

 // 定位初始化
                mLocClient = new LocationClient(getApplication());

                LocationClientOption option = new LocationClientOption();
                option.setOpenGps(true);// 打开gps
                option.setCoorType("bd09ll"); // 设置坐标类型
                mLocClient.setLocOption(option);
                mLocClient.start();
                mLocClient.registerLocationListener(new MyLocationListenner());


/** * 自动定位SDK监听函数 */

    public class MyLocationListenner implements BDLocationListener {

        private LatLng ll;

        @Override
        public void onReceiveLocation(BDLocation location) {
            // map view 销毁后不在处理新接收的位置


            if (location == null || mMapView == null)
                return;
            loc = location;
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                            // 此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(100).latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();
            mBaiduMap.setMyLocationData(locData);
            if (isFirstLoc) {
                isFirstLoc = false;
                ll = new LatLng(location.getLatitude(),
                        location.getLongitude());
                MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
                //让地图执行位置移动动画
                mBaiduMap.animateMapStatus(u);

            }


            //发起反地理编码请求----下面有解释
            ReverseGeoCodeOption options = new ReverseGeoCodeOption().location(ll);
            geocode.reverseGeoCode(options);


        }


    }

关于地理地址编码与反编码
http://blog.csdn.net/fengltxx/article/details/50552575

添加弹出窗覆盖物

 /** * 添加弹出窗覆盖物 * * @param address 为address添加覆盖物 * @param ll //添加的坐标 */
    public void addInfoWindow(String address, LatLng ll) {

        //创建InfoWindow展示的view-----弹出窗覆盖物
        final TextView button = new Button(getApplicationContext());
        button.setBackgroundResource(R.drawable.pop);
        button.setTextColor(Color.BLACK);
        button.setText(address);
        //创建InfoWindow , 传入 view, 地理坐标, y 轴偏移量
        InfoWindow mInfoWindow = new InfoWindow(button, ll, -20);
        //显示InfoWindow
        mBaiduMap.showInfoWindow(mInfoWindow);

    }

添加标注

/** * 添加标注的方法 * * @param point */
    public void addMarker(LatLng point) {

        //构建Marker图标
        BitmapDescriptor bitmap = BitmapDescriptorFactory
                .fromResource(R.drawable.icon_marka);
        //构建MarkerOption,用于在地图上添加Marker
        OverlayOptions option_mark = new MarkerOptions()
                .position(point)
                .icon(bitmap);
        //在地图上添加Marker,并显示
        Overlay marker = mBaiduMap.addOverlay(option_mark);


    }

下面是以上几种方法使用的合集,写的比较乱.嘿嘿…代码不是最重要的,重要的是如何去使用百度提供给我们的接口


public class MainActivity extends Activity {

    TextView tv;
    Button btn_myLoc;//定位
    Button btn_mark; //markar覆盖物


    MapView mMapView = null;
    private BaiduMap mBaiduMap;
    private GeoCoder geocode;
    private String address = "";

    /** * 定位相关 */
    LocationClient mLocClient;
    boolean isFirstLoc = true;// 是否首次定位
    private BDLocation loc;//记录初次定位的位置
    public Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);

            tv.setText(msg.obj + "");

        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //在使用SDK各组件之前初始化context信息,传入ApplicationContext
        //注意该方法要再setContentView方法之前实现
        SDKInitializer.initialize(getApplicationContext());

        setContentView(R.layout.activity_main);

        mMapView = (MapView) findViewById(R.id.bmapView);


        tv = (TextView) findViewById(R.id.tv);
        btn_myLoc = (Button) findViewById(R.id.btn_myLoc);
        btn_mark = (Button) findViewById(R.id.btn_mark);

        mBaiduMap = mMapView.getMap();

        //隐藏百度地图自带的按钮
        mMapView.showZoomControls(false);


        /** * 自动定位 */
        btn_myLoc.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                System.out.println("点击了定位");
                // 开启定位图层
                mBaiduMap.setMyLocationEnabled(true);

                // 定位初始化
                mLocClient = new LocationClient(getApplication());

                LocationClientOption option = new LocationClientOption();
                option.setOpenGps(true);// 打开gps
                option.setCoorType("bd09ll"); // 设置坐标类型
                mLocClient.setLocOption(option);
                mLocClient.start();
                mLocClient.registerLocationListener(new MyLocationListenner());


            }
        });

        /** * 添加 markar覆盖物 * 34.7568711 , 113.663221 */
        btn_mark.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //定义Maker坐标点
                LatLng point = new LatLng(34.7568711
                        , 113.663221);
//构建Marker图标
                BitmapDescriptor bitmap = BitmapDescriptorFactory
                        .fromResource(R.drawable.icon_marka);
//构建MarkerOption,用于在地图上添加Marker
                OverlayOptions option_mark = new MarkerOptions()
                        .position(point)
                        .icon(bitmap);
//在地图上添加Marker,并显示
                Overlay marker = mBaiduMap.addOverlay(option_mark);

            }
        });


        /** * 地图点击监听 */
        mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {

            /** * 点击地图上没有自动标注的地方触发 * 在此处理点击事件 * @param point */
            public void onMapClick(LatLng point) {



                System.out.println("point-----" + point);

            }

            /** * 在此处理底图标注点击事件 * @param poi * @return */
            public boolean onMapPoiClick(MapPoi poi) {


                System.out.println("poi-------" + poi);
                return false;
            }
        });


        /** * mark点击物的监听 */
        mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {


                System.out.println("-----markar被点击" + marker);
                return false;
            }
        });

        /** * 地图中心点的位置改变监听 */
        mBaiduMap.setOnMapStatusChangeListener(new BaiduMap.OnMapStatusChangeListener() {
            @Override
            public void onMapStatusChangeStart(MapStatus mapStatus) {

            }

            @Override
            public void onMapStatusChange(MapStatus mapStatus) {

            }

            @Override
            public void onMapStatusChangeFinish(MapStatus mapStatus) {

                //获得中心点坐标
                LatLng lat = mapStatus.target;
                getButtonAddress(lat);

                //发起反地理编码请求
                ReverseGeoCodeOption options = new ReverseGeoCodeOption().location(lat);
                geocode.reverseGeoCode(options);
            }
        });


    }


    @Override
    protected void onDestroy() {
        super.onDestroy();
        //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
        mMapView.onDestroy();
    }

    @Override
    protected void onResume() {
        super.onResume();
        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
        mMapView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
        mMapView.onPause();
    }


    /** * 通过反地址编码获得地址信息 * @param ll 中心点坐标 */
    public void getButtonAddress(final LatLng ll) {
        //通过反地址编码获得地址信息
        geocode = GeoCoder.newInstance();
        //设置查询结果监听者
        geocode.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {

            @Override
            public void onGetReverseGeoCodeResult(ReverseGeoCodeResult result) {
                if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) {
                    return;
                }
                if (result != null && result.error == SearchResult.ERRORNO.NO_ERROR) {

                    //得到位置
                    address = result.getAddress();



                    //创建InfoWindow展示的view
                    final TextView button = new Button(getApplicationContext());
                    button.setBackgroundResource(R.drawable.pop);
                    button.setTextColor(Color.BLACK);
                    button.setText(address);
                    //创建InfoWindow , 传入 view, 地理坐标, y 轴偏移量
                    InfoWindow mInfoWindow = new InfoWindow(button, ll, -20);
                    //显示InfoWindow
                    mBaiduMap.showInfoWindow(mInfoWindow);


                    //显示地址 ---- 通过handler显示位置
                    Message msg = Message.obtain();
                    msg.obj = address;
                    handler.sendMessage(msg);


                }
            }

            @Override
            public void onGetGeoCodeResult(GeoCodeResult arg0) {
            }
        });
    }


    /** * 自动定位SDK监听函数 */

    public class MyLocationListenner implements BDLocationListener {

        private LatLng ll;

        @Override
        public void onReceiveLocation(BDLocation location) {
            // map view 销毁后不在处理新接收的位置


            if (location == null || mMapView == null)
                return;
            loc = location;
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                            // 此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(100).latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();
            mBaiduMap.setMyLocationData(locData);
            if (isFirstLoc) {
                isFirstLoc = false;
                ll = new LatLng(location.getLatitude(),
                        location.getLongitude());
                MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll);
                mBaiduMap.animateMapStatus(u);

            }

            getButtonAddress(ll);
            //发起反地理编码请求
            ReverseGeoCodeOption options = new ReverseGeoCodeOption().location(ll);


        }

        public void onReceivePoi(BDLocation poiLocation) {
        }
    }

}

简单的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity">

    <LinearLayout  android:layout_width="wrap_content" android:layout_height="match_parent" android:orientation="vertical">

        <TextView  android:id="@+id/tv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" />

        <Button  android:id="@+id/btn_myLoc" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="定位" />

        <Button  android:id="@+id/btn_mark" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="显示marker" />


    </LinearLayout>


    <com.baidu.mapapi.map.MapView  android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" />


</LinearLayout>

后续的地图功能慢慢完善

你可能感兴趣的:(百度地图,地图覆盖物)