26 百度地图的使用

案例一 显示百度地图

package com.qf.sxy.day27_baidumap;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.MapView;

public class MainActivity extends AppCompatActivity {

    MapView mMapView = null;
    @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);
    }

    /**
     * 管理百度地图的生命周期
     */
    @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();
    }
}

  • 当然初始化代码可以写application
SDKInitializer.initialize(getApplicationContext());
  • 例子
package com.qf.sxy.day27_baidumap;

import android.app.Application;

import com.baidu.mapapi.SDKInitializer;

/**
 * Created by sxy on 2016/9/27.
 *
 * 使用Application做全局初始化
 * note:必须在清单文件进行注册    android:name=".MyApplication"
 * 否则 写没写这个Application是没有作用
 */
public class MyApplication extends Application {

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

    }
}
  • 注意需要在清单文件注册
 <application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

案例二 覆盖物

说明:在地图上某个点显示个图标或者View等

package com.qf.sxy.day27_baidumap;

import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Button;

import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.LogoPosition;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;

/**
 * 添加覆盖物
 * 步骤:
 * 1,获取Baidumap对象
 * 2,给Baidumap添加覆盖物  addOverlay
 * 3,给覆盖物添加点击监听
 */
public class OverlayActivity extends AppCompatActivity {


    private MapView mapView;
    private BaiduMap baiduMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_overlay);
        mapView = ((MapView) findViewById(R.id.bmapView));

        mapView.setLogoPosition(LogoPosition.logoPostionRightBottom);
        //获取百度地图对象
        baiduMap = mapView.getMap();
//        //地图类型   卫星
//        baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
//        //MAP_TYPE_NONE 空白的
//        baiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);
        //普通的
//        baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
//
//        //开启交通图
//        baiduMap.setTrafficEnabled(true);
//
//        //开启交通图
//        baiduMap.setBaiduHeatMapEnabled(true);

        //获取图标
        BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);

        //获取当前坐标
        final LatLng latLng = new LatLng(40.089597, 116.419385);

        //获取OverlayOptions 对象   设置图标
        OverlayOptions options= new MarkerOptions().icon(bitmapDescriptor).position(latLng).title("天通苑");
        //添加覆盖物
        baiduMap.addOverlay(options);

        //覆盖物的点击监听
        baiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
            @Override
            public boolean onMarkerClick(Marker marker) {

                Button btn = new Button(OverlayActivity.this);
                btn.setBackgroundColor(Color.WHITE);
                btn.setText(marker.getTitle());

                BitmapDescriptor descriptor = BitmapDescriptorFactory.fromView(btn);
                /**
                 * 参数1:图片 当然这也可以放View等
                 * 参数2:坐标点
                 * 参数3:y轴的偏移量
                 * 参数4:提示的监听
                 */
                InfoWindow infoWindow = new InfoWindow(descriptor, latLng, -50, new InfoWindow.OnInfoWindowClickListener() {
                    @Override
                    public void onInfoWindowClick() {
                        //隐藏
                        baiduMap.hideInfoWindow();
                    }
                });
                //设置提示
                baiduMap.showInfoWindow(infoWindow);
                return false;
            }
        });

    }
}

案例三 路线规划

说明:制定两个点的的路线图

package com.qf.sxy.day27_baidumap;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.search.route.BikingRouteResult;
import com.baidu.mapapi.search.route.DrivingRouteLine;
import com.baidu.mapapi.search.route.DrivingRoutePlanOption;
import com.baidu.mapapi.search.route.DrivingRouteResult;
import com.baidu.mapapi.search.route.OnGetRoutePlanResultListener;
import com.baidu.mapapi.search.route.PlanNode;
import com.baidu.mapapi.search.route.RoutePlanSearch;
import com.baidu.mapapi.search.route.TransitRouteResult;
import com.baidu.mapapi.search.route.WalkingRouteResult;
import com.qf.sxy.day27_baidumap.utils.DrivingRouteOverlay;

import java.util.List;

/**
 * 路线规划步骤:
 * 1,获取路线规划对象RoutePlanSearch
 * 2,对路线规划对象进行监听
 * 3,开启路线查询(有四种)
 * 4,在监听中 进行处理  获取路线覆盖物 将其添加到地图  可以进行点击监听节点
 */
public class RouteActivity extends AppCompatActivity {

    private MapView mMapView;
    private BaiduMap mBaiduMap;
    //路线规划的对象
    private RoutePlanSearch mRoutePlanSearch;

    private DrivingRouteLine drivingRouteLine;//这个路线展示到Map

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_route);

        mMapView = ((MapView) findViewById(R.id.bmapView));
        //获取百度地图对象
        mBaiduMap = mMapView.getMap();
        //获取路线规划对象
        mRoutePlanSearch = RoutePlanSearch.newInstance();

        //对路线规划进行监听
        mRoutePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() {
            @Override
            public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {
                //走路的规划
            }

            @Override
            public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {
                //公交的规划
            }

            @Override
            public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {
                //自己开车
                //获取所有的路线
                List<DrivingRouteLine> lines = drivingRouteResult.getRouteLines();
                if(lines!=null&&lines.size()>0){//说明有路线
                    Log.e("AAA","==="+lines.size());
                    drivingRouteLine = lines.get(0);//这里我们只获取其中一条路径
                }else{
                    Log.e("AAA","==没有路==");
                }

                //将路线展示到地图  以覆盖物---这类给sample类帮我们画出 开头和结尾还有中间的路
                MyOverlay myOverlay = new MyOverlay(mBaiduMap);
                //将开车的路线  给覆盖物
                myOverlay.setData(drivingRouteLine);
                //对路线覆盖物监听 myOverlay内部实现了new BaiduMap.OnMarkerClickListener()方法
                //监听地图上的箭头图片 (图片每次有转向路口都会有个箭头图片 点击图片显示相应的转向提示)
                mBaiduMap.setOnMarkerClickListener(myOverlay);
                //将覆盖物添加到地图
                myOverlay.addToMap();


            }

            @Override
            public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {
                //骑自行车行
            }
        });

        //开启路线查询
        mRoutePlanSearch.drivingSearch(new DrivingRoutePlanOption().
                from(PlanNode.withCityNameAndPlaceName("北京","北京科技职业学院")).
                to(PlanNode.withCityNameAndPlaceName("北京","北京西站")));
    }

    //开车的覆盖物 此类继承是百度sample中的类
    public class MyOverlay extends DrivingRouteOverlay{

        /**
         * 构造函数
         *
         * @param baiduMap 该DrivingRouteOvelray引用的 BaiduMap
         */
        public MyOverlay(BaiduMap baiduMap) {
            super(baiduMap);
        }
        //路线节点的 点击监听
        @Override
        public boolean onRouteNodeClick(int i) {
            //监听地图上的箭头图片 (图片每次有转向路口都会有个箭头图片 点击图片显示相应的转向提示)
            //获取所有的节点
            List<DrivingRouteLine.DrivingStep> lists = drivingRouteLine.getAllStep();
            DrivingRouteLine.DrivingStep step =   lists.get(i);
            Log.e("AAAA","==>"+step.getInstructions());
            return super.onRouteNodeClick(i);
        }
    }
}


  • 示例图:

说明:图中箭头就是监听事件
这里写图片描述

案例四 POI搜索 商铺

  • POI是“Point of Interest”的缩写,中文可以翻译为“兴趣点”。在地理信息系统中,一个POI可以是一栋房子、一个商铺、一个邮筒、一个公交站等。
package com.qf.sxy.day27_baidumap;

import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiCitySearchOption;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiDetailSearchOption;
import com.baidu.mapapi.search.poi.PoiIndoorResult;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;
import com.qf.sxy.day27_baidumap.utils.PoiOverlay;

import java.util.List;

/**
 * 1,获取对象
 * 2,设置监听
 * 3,开启搜索
 */
public class PoiSearchActivity extends AppCompatActivity {


    private MapView mMapView;
    private EditText mEtKey;

    private BaiduMap mBaiduMap ;

    private PoiSearch mPoiSearch;//Poi检索的对象

    private PoiInfo poiInfo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_poi_search);
        mMapView = ((MapView) findViewById(R.id.bmapView));
        mEtKey = ((EditText) findViewById(R.id.et_key));
        mBaiduMap = mMapView.getMap();
    }

    //点击按钮开始搜索
    public void findClick(View view) {
        String keyStr = mEtKey.getText().toString().trim();
        if(TextUtils.isEmpty(keyStr)){
            Log.e("AAA","当前搜索的关键字为null");
           return;
        }
        //实例化检索对象
        mPoiSearch = PoiSearch.newInstance();

        //Poi搜索的监听
        mPoiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
            @Override
            public void onGetPoiResult(PoiResult poiResult) {
                //Poi搜索的结果
                //清除之前的数据
                mBaiduMap.clear();
                MyPoiOverlay myPoiOverlay = new MyPoiOverlay(mBaiduMap);
                myPoiOverlay.setData(poiResult);
                mBaiduMap.setOnMarkerClickListener(myPoiOverlay);
                myPoiOverlay.addToMap();

            }

            @Override
            public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
                //得到结果的详情
                Intent intent = new Intent(PoiSearchActivity.this,PoidetailActivity.class);
                intent.putExtra("url",poiDetailResult.getDetailUrl());
                startActivity(intent);

            }

            @Override
            public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
                //获取室内的结果

            }
        });
        //开启搜索    搜索所在的城市    关键字
        mPoiSearch.searchInCity(new PoiCitySearchOption().city("北京").keyword(keyStr));


//        LatLng llC = new LatLng(39.639723, 118.425541);
//        LatLng llD = new LatLng(39.906965, 118.401394);
        //坐标点的附近
//        mPoiSearch.searchNearby(new PoiNearbySearchOption().location(llC).keyword())
        //区域  设置俩个坐标点  左上 右下
//        LatLngBounds latLngBounds = new LatLngBounds.Builder().include(llC).include(llD).build();
//        mPoiSearch.searchInBound(new PoiBoundSearchOption().bound(latLngBounds))
    }


    //Poi搜索的覆盖物 此类事sample
    class MyPoiOverlay extends PoiOverlay{

        /**
         * 构造函数
         *
         * @param baiduMap 该 PoiOverlay 引用的 BaiduMap 对象
         */
        public MyPoiOverlay(BaiduMap baiduMap) {
            super(baiduMap);
        }

        //点击覆盖物的监听
        @Override
        public boolean onPoiClick(int i) {
            //获取Poi所有节点
            List<PoiInfo> list = getPoiResult().getAllPoi();
            //获取点击的节点
            poiInfo = list.get(i);

            Button button = new Button(getApplicationContext());
            button.setBackgroundColor(Color.GREEN);
            button.setText(poiInfo.name);
            BitmapDescriptor descriptor = BitmapDescriptorFactory.fromView(button);

            InfoWindow infoWindow = new InfoWindow(descriptor, poiInfo.location, -100, new InfoWindow.OnInfoWindowClickListener() {
                @Override
                public void onInfoWindowClick() {
                    //根据Uid搜索详情 此时回调mPoiSearch的onGetPoiDetailResult方法
                    mPoiSearch.searchPoiDetail(new PoiDetailSearchOption().poiUid(poiInfo.uid));
                    mBaiduMap.hideInfoWindow();
                }
            });
            mBaiduMap.showInfoWindow(infoWindow);

            return super.onPoiClick(i);
        }
    }
}
package com.qf.sxy.day27_baidumap;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class PoidetailActivity extends AppCompatActivity {

    private WebView mWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_poidetail);
        mWebView = ((WebView) findViewById(R.id.webView));
        mWebView.getSettings().setJavaScriptEnabled(true);
        String url = getIntent().getStringExtra("url");
        mWebView.setWebViewClient(new WebViewClient() {
            //重写了 shouldOverrideUrlLoading()方法。这就表明当需要从一个网页跳转到另一个网页时,我们希望目标网页仍然在当前 WebView 中显示,而不是打开系统浏览器
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url); // 根据传入的参数再去加载新的网页
                return true; // 表示当前WebView可以处理打开新网页的请求,不用借助系统浏览器
            }
        });
        mWebView.loadUrl(url);
    }

}

案例五 POI 查找公交路线

package com.qf.sxy.day27_baidumap;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;

import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.search.busline.BusLineResult;
import com.baidu.mapapi.search.busline.BusLineSearch;
import com.baidu.mapapi.search.busline.BusLineSearchOption;
import com.baidu.mapapi.search.busline.OnGetBusLineSearchResultListener;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiCitySearchOption;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiIndoorResult;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;
import com.qf.sxy.day27_baidumap.utils.BusLineOverlay;

public class BusLineSearchActivity extends AppCompatActivity {

    private MapView mapView;
    private BaiduMap baiduMap;
    private EditText etBus;


    private PoiSearch poiSearch;
    private BusLineSearch busLineSearch;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bus_line_search);
        mapView = ((MapView) findViewById(R.id.bmapView));
        baiduMap = mapView.getMap();
        etBus = ((EditText) findViewById(R.id.et_bus));

        busLineSearch= BusLineSearch.newInstance();
        busLineSearch.setOnGetBusLineSearchResultListener(new OnGetBusLineSearchResultListener() {
            @Override
            public void onGetBusLineResult(BusLineResult busLineResult) {
                if(busLineResult!=null&&busLineResult.error == SearchResult.ERRORNO.NO_ERROR){
                    //删除原来的覆盖物
                    baiduMap.clear();
                    //一个显示公交站点类
                    BusLineOverlay overlay = new BusLineOverlay(baiduMap);
                    overlay.setData(busLineResult);
                    overlay.addToMap();

                }
            }
        });

        //poi
        poiSearch = PoiSearch.newInstance();
        poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
            @Override
            public void onGetPoiResult(PoiResult poiResult) {
                if(poiResult!=null&&poiResult.error== SearchResult.ERRORNO.NO_ERROR){
                    //可能查到多个 这里我们只取第一个
                    String uid = poiResult.getAllPoi().get(0).uid;
                    busLineSearch.searchBusLine(new BusLineSearchOption().city("北京").uid(uid));
                }

            }

            @Override
            public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {

            }

            @Override
            public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {

            }
        });
    }

    public void searchClick(View view) {

        //开启搜索   城市   关键字  公交号 476
        poiSearch.searchInCity(new PoiCitySearchOption().city("北京").keyword(etBus.getText().toString().trim()));
    }
}

案例六 定位

环境搭建

注意安卓6.0的运行时权限
安卓6.0运行时权限

所需:
liblocSDK6a.so
locSDK_6.13.jar

package com.qf.sxy.day27_baidumap;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;

public class LocationActivity extends AppCompatActivity {

    private MapView mapView;
    private BaiduMap baiduMap;

    //定位对象
    private LocationClient locationClient;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_location);
        mapView = ((MapView) findViewById(R.id.bmapView));
        baiduMap = mapView.getMap();

        locationClient = new LocationClient(LocationActivity.this);
        //对定位的设置
        LocationClientOption option = new LocationClientOption();
        /**
         * LocationClientOption.LocationMode.Battery_Saving:低功耗定位  不用GPS  (wifi  基站)
         *
         * LocationClientOption.LocationMode.Hight_Accuracy:高精度定位  全开GPS  wifi  基站
         *
         * LocationClientOption.LocationMode.Device_Sensors  仅仅使用设备 GPS    不支持室内
         */
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
        /**
         * bd09ll:百度经纬度坐标
         * bd09:墨卡托坐标
         * gcjo2:国家测量局坐标
         */
        option.setCoorType("bd09ll");
        //设置定位间隔时间 每隔两秒记录一次位置
        option.setScanSpan(1000*2);
        //设置定位超出时间
        option.setTimeOut(1000*10);
        //是否需要得到地址
        option.setIsNeedAddress(true);
        //是否设置手机 机头方向
        option.setNeedDeviceDirect(true);
        //2给定位对象进行设置
        locationClient.setLocOption(option);


        //3监听
        locationClient.registerLocationListener(new BDLocationListener() {
            @Override
            public void onReceiveLocation(BDLocation bdLocation) {
                //获取坐标 bdLocation.getLatitude()纬度 bdLocation.getLongitude()经度
                LatLng latLng = new LatLng(bdLocation.getLatitude(),bdLocation.getLongitude());
                BitmapDescriptor descriptor = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
                OverlayOptions options = new MarkerOptions().position(latLng).icon(descriptor).title("当前位置");
                baiduMap.addOverlay(options);
                Log.e("fmy","位置"+bdLocation.getLatitude());
            }
        });

        //4启动
        locationClient.start();//开启
        locationClient.requestLocation();//发起请求

    }
}

posted on 2016-09-27 21:07  木鱼哥  阅读(458)  评论(0编辑  收藏  举报

导航