百度地图POI+覆盖物+导航 实现



下面只是关键类  其他接口 请到百度地图SDK自行查找

PS: 第一次写博客 不知道格式   有何意见  请留言  望大家多多指教


package com.usian.daohang;


import android.Manifest;

import android.content.Intent;

import android.content.pm.PackageManager;

import android.os.Build;

import android.support.v4.app.ActivityCompat;

import android.support.v7.app.AppCompatActivity;

import android.util.Log;

import android.view.View;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;


import com.baidu.location.BDLocation;

import com.baidu.location.BDLocationListener;

import com.baidu.location.LocationClient;

import com.baidu.location.LocationClientOption;

import com.baidu.mapapi.SDKInitializer;

import com.baidu.mapapi.bikenavi.BikeNavigateHelper;

import com.baidu.mapapi.bikenavi.adapter.IBEngineInitListener;

import com.baidu.mapapi.bikenavi.adapter.IBRoutePlanListener;

import com.baidu.mapapi.bikenavi.model.BikeRoutePlanError;

import com.baidu.mapapi.bikenavi.params.BikeNaviLauchParam;

import com.baidu.mapapi.map.BaiduMap;

import com.baidu.mapapi.map.BitmapDescriptor;

import com.baidu.mapapi.map.BitmapDescriptorFactory;

import com.baidu.mapapi.map.CircleOptions;

import com.baidu.mapapi.map.MapStatusUpdate;

import com.baidu.mapapi.map.MapStatusUpdateFactory;

import com.baidu.mapapi.map.MapView;

import com.baidu.mapapi.map.Marker;

import com.baidu.mapapi.map.MarkerOptions;

import com.baidu.mapapi.map.MyLocationConfiguration;

import com.baidu.mapapi.map.MyLocationData;

import com.baidu.mapapi.map.OverlayOptions;

import com.baidu.mapapi.map.Stroke;

import com.baidu.mapapi.model.LatLng;

import com.baidu.mapapi.overlayutil.PoiOverlay;

import com.baidu.mapapi.search.core.PoiInfo;

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.PoiDetailSearchOption;

import com.baidu.mapapi.search.poi.PoiIndoorResult;

import com.baidu.mapapi.search.poi.PoiResult;

import com.baidu.mapapi.search.poi.PoiSearch;


import java.util.List;


public class MainActivity extends AppCompatActivity {


    private BikeNavigateHelper instance;

    private MapView mMap;

    private Button sousuo;

    private EditText place;


    private BaiduMap mBaiduMap;

    private int isShowOverlay = 1;

    private boolean isFirstLoc = true;

    private LocationClient mLocClient;

    private MyLocationConfiguration.LocationMode mCrrentMode;

    private BitmapDescriptor mCurrentMarker = null;

    private double latitude;

    private double longitude;

    private MyLocationListenner loclistener = new MyLocationListenner();

    Marker marker;

    private PoiSearch poiSearch;




    private static final int BAIDU_READ_PHONE_STATE =100;


    public void showContacts(){

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)

                != PackageManager.PERMISSION_GRANTED

                || ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)

                != PackageManager.PERMISSION_GRANTED

                || ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)

                != PackageManager.PERMISSION_GRANTED) {

            Toast.makeText(getApplicationContext(),"没有权限,请手动开启定位权限",Toast.LENGTH_SHORT).show();

            // 申请一个(或多个)权限,并提供用于回调返回的获取码(用户定义)

            ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.READ_PHONE_STATE}, BAIDU_READ_PHONE_STATE);

        }else{

//            init();

        }

    }




    //Android6.0申请权限的回调方法

    @Override

    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {

        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        switch (requestCode) {

            // requestCode即所声明的权限获取码,在checkSelfPermission时传入

            case BAIDU_READ_PHONE_STATE:

                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    // 获取到权限,作相应处理(调用定位SDK应当确保相关权限均被授权,否则可能引起定位失败)

//                    init();

                } else {

                    // 没有获取到权限,做特殊处理

                    Toast.makeText(getApplicationContext(), "获取位置权限失败,请手动开启", Toast.LENGTH_SHORT).show();

                }

                break;

            default:

                break;

        }

    }






    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);


        SDKInitializer.initialize(getApplicationContext());

        setContentView(R.layout.activity_main);


        //判断是否6.0火或以上版本

        if (Build.VERSION.SDK_INT>=23){

            showContacts();

        }else{

//            init();//init为定位方法

        }








        mMap = (MapView) findViewById(R.id.baidu);

        place = (EditText) findViewById(R.id.place);

        sousuo = (Button) findViewById(R.id.sousuo);


        sousuo.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                String keyword = place.getText().toString().trim();

                //创建检索实例

                poiSearch = PoiSearch.newInstance();

                //设置监听器

                poiSearch.setOnGetPoiSearchResultListener(new MyPoiListener());

                poiSearch.searchInCity((new PoiCitySearchOption())

                        .city("北京")

                        .keyword(keyword)

                        .pageNum(10));


            }

        });


        mBaiduMap = mMap.getMap();


        mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);


        mBaiduMap.setMyLocationEnabled(true);

        mLocClient = new LocationClient(this);

        //注册定位监听

        mLocClient.registerLocationListener(loclistener);


        LocationClientOption option = new LocationClientOption();

        option.setOpenGps(true);

        option.setCoorType("bd0911");

        option.setScanSpan(5000);

option.setIsNeedAddress(true);

option.setLocationNotify(true);

        mLocClient.setLocOption(option);

        mLocClient.start();




        addMyLocation();

        addCircleOverlay();


    }


    //控制导航

    public void kongzhi(final double la, final double lo){

        instance = BikeNavigateHelper.getInstance();


        instance.initNaviEngine(this, new IBEngineInitListener() {

            @Override

            public void engineInitSuccess() {

                Log.e("TAG", "引擎初始化成功");

                routePlanWithParam(la, lo);

            }


            @Override

            public void engineInitFail() {

                Log.e("TAG", "引擎初始化失败");

            }

        });


    }


    //开始导航

    private void routePlanWithParam(double mLa, double mLo) {

        double mLat1 = 39.915291;

        double mLon1 = 116.403857;

        // 百度大厦坐标

        double mLat2 = 40.056858;

        double mLon2 = 116.308194;


//        LatLng pt1 = new LatLng(mLat1, mLon1);

//        LatLng pt2 = new LatLng(mLat2, mLon2);

        LatLng pt1 = new LatLng(latitude, longitude);

        LatLng pt2 = new LatLng(mLa, mLo);




        BikeNaviLauchParam param = new BikeNaviLauchParam().stPt(pt1).endPt(pt2);

//                .InvokeStartName("天安门").InvokeEndName("百度大厦");;

        instance.routePlanWithParams(param, new IBRoutePlanListener() {

            @Override

            public void onRoutePlanStart() {


            }


            @Override

            public void onRoutePlanSuccess() {

                Toast.makeText(MainActivity.this, "开始导航...", Toast.LENGTH_SHORT).show();

                Intent intent = new Intent();

                intent.setClass(MainActivity.this, BNaviGuideActivity.class);

                startActivity(intent);


            }


            @Override

            public void onRoutePlanFail(BikeRoutePlanError bikeRoutePlanError) {


            }

        });


    }




    //添加覆盖物

    private void addMyLocation() {


        mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration(mCrrentMode, true, mCurrentMarker));

        mBaiduMap.clear();


        LatLng point = new LatLng(latitude, longitude);


        BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);


        OverlayOptions option = new MarkerOptions()

                .position(point)

                .icon(bitmap);

        mBaiduMap.addOverlay(option);


    }




    //计算定位

    private void addCircleOverlay() {


        if (isShowOverlay == 1) {

            mBaiduMap.clear();

            isShowOverlay = 0;

            LatLng pt = new LatLng(latitude, longitude);

            CircleOptions circleoptions = new CircleOptions();


            circleoptions.center(pt);

            circleoptions.fillColor(0xAAFFFF00);

            circleoptions.radius(250);

            circleoptions.stroke(new Stroke(5, 0xAA00FF00));

            mBaiduMap.addOverlay(circleoptions);


        } else {

            mBaiduMap.clear();

            isShowOverlay = 1;

        }


    }


    //定位需要的类

    public class MyLocationListenner implements BDLocationListener {


        @Override

        public void onReceiveLocation(BDLocation location) {

            Toast.makeText(MainActivity.this, "正在定位...", Toast.LENGTH_SHORT).show();

            if (location == null || mBaiduMap == null) {

                return;

            }

            MyLocationData locData = new MyLocationData.Builder()

                    .accuracy(location.getRadius())

                    .direction(100)

                    .latitude(location.getLatitude())

                    .longitude(location.getLongitude())

                    .build();

            mBaiduMap.setMyLocationData(locData);

            mCrrentMode = MyLocationConfiguration.LocationMode.NORMAL;

            //获取本身坐标点

            latitude = location.getLatitude();

            longitude = location.getLongitude();




            if (isFirstLoc) {

                isFirstLoc = false;

                LatLng loc = new LatLng(location.getLatitude(), location.getLongitude());

                MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(loc);

                mBaiduMap.animateMapStatus(msu);


                Toast.makeText(getApplicationContext(), location.getAddrStr(),

                        Toast.LENGTH_SHORT).show();

            }

        }


        @Override

        public void onConnectHotSpotMessage(String s, int i) {


        }

    }


    @Override

    protected void onDestroy() {

        super.onDestroy();

        mLocClient.stop();

        mBaiduMap.setMyLocationEnabled(false);

        mMap.onDestroy();

    }


    @Override

    protected void onResume() {

        super.onResume();

        mMap.onResume();

    }


    @Override

    protected void onPause() {

        super.onPause();

        mMap.onPause();

    }




    //POI检索需要的监听

    class MyPoiListener implements OnGetPoiSearchResultListener {


        @Override

        public void onGetPoiResult(PoiResult poiResult) {

            if (poiResult == null

                    || SearchResult.ERRORNO.RESULT_NOT_FOUND == poiResult.error) {

                Toast.makeText(getApplicationContext(), "未查询到结果", Toast.LENGTH_SHORT).show();

                return;

            }


            String text = "共" + poiResult.getTotalPageNum() + "页,共"

                    + poiResult.getTotalPoiNum() + "条,当前第"

                    + poiResult.getCurrentPageNum() + "页,当前页共"

                    + poiResult.getCurrentPageCapacity() + "条";




            Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();

            mBaiduMap.clear();// 清除上一次的数据

            // 创建覆盖物

            PoiOverlay poiOverlay = new MyPoiOverlay(mBaiduMap);

            mBaiduMap.setOnMarkerClickListener(poiOverlay);

            // 设置数据

            poiOverlay.setData(poiResult);// 只是把当前页的数据显示出来

            // 添加到地图上

            poiOverlay.addToMap();

            poiOverlay.zoomToSpan();// 缩放地图,使所有Overlay都在合适的视野内


        }


        @Override

        public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {

            if (poiDetailResult == null

                    || SearchResult.ERRORNO.RESULT_NOT_FOUND == poiDetailResult.error) {


                Toast.makeText(getApplicationContext(), "未查询到结果", Toast.LENGTH_SHORT).show();

                return;

            }


            String text = "当前位置为"+poiDetailResult.getAddress() + ":" + poiDetailResult.getFavoriteNum();


            Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();

        }


        @Override

        public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {


        }

    }




    //POI检索需要的PoiOverlay类

    class MyPoiOverlay extends PoiOverlay {


        /**

         * 构造函数

         *

         * @param baiduMap 该 PoiOverlay 引用的 BaiduMap 对象

         */

        public MyPoiOverlay(BaiduMap baiduMap) {

            super(baiduMap);

        }


        @Override

        public boolean onPoiClick(int i) {

            PoiResult poiResult = getPoiResult();

            List<PoiInfo> allPoi = poiResult.getAllPoi();// 获取返回来的所有POI

            PoiInfo poiInfo = allPoi.get(i);

            String text = poiInfo.city + ":" + poiInfo.address;


            double latitude1 = poiInfo.location.latitude;

            double longitude1 = poiInfo.location.longitude;

            Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();

            PoiDetailSearchOption option = new PoiDetailSearchOption();

            option.poiUid(poiInfo.uid);// 设置poi uid

            poiSearch.searchPoiDetail(option);

            kongzhi(latitude1, longitude1);

            return super.onPoiClick(i);

        }

    }

}

import android.os.Bundle;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值