BaiduMap初体验(五) 使用百度map的POI和云检索

BaiduMap初体验(五) 使用百度地图的POI和云检索

写了几篇百度地图的使用相关的了,总结下心得吧。在百度地图的时使用中,鄙人遇到了几个纠结的问题
1.为什么百度地图的jar 包有冲突,最后在使用统一的BaiduLBS包解决。
2.为什么在不同时间段下载的BaiduLBS包的内容不同。
3.为什么百度API在使用的时候没有了的功能在API文档里面能找到。

总之,百度地图的API维护是个问题,对于初学者有很多问题,这篇也是博主最后一篇关于百度api的文章了,之后的博客开始总结android学到的知识了,一个开始,去系统的学习android md的设计和基础知识。对所学的记录。
闲话不多说,看看效果截图:
BaiduMap初体验(五) 使用百度map的POI和云检索

使用百度POI检索关键的还是看API文档,链接http://wiki.lbsyun.baidu.com/cms/androidsdk/doc/v3_5_0/html/,

涉及到云检索的包有
com.baidu.mapapi.search.busline 公交或者地铁检索,现在貌似不能用了。不知道为什么。

//初始化BusLineSearch 对象,使用完记住销毁,在Activity的几个方法中
        BusLineSearch pBusLineSearch = BusLineSearch.newInstance();
/×搜索配置city为城市,uid为公交路线的UID,但是这里我得到的PoiInfo里面type类型就没有路线的,我也是醉了,不知道到这是百度的问题还是我的问题智商被压制了×/
        BusLineSearchOption pBusLineSearchOption = new BusLineSearchOption().city("北京").uid("UID");
        //初始化搜索配置信息
        pBusLineSearch.searchBusLine(pBusLineSearchOption);
        //设置监听
        pBusLineSearch.setOnGetBusLineSearchResultListener(new OnGetBusLineSearchResultListener() {
            @Override
            public void onGetBusLineResult(BusLineResult busLineResult) {
                     if (busLineResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {

            Snackbar.make(view,"由于百度的问题,POI搜索出来的POIINFO的type只为BUS_STATION, POINT, SUBWAY_STATION,没有BUS_LINE,导致有些功能不能使用,这里还是贴出来代码",Snackbar.LENGTH_SHORT).show();
        } else {
            mBaidumap.clear();
            //结果显示 使用自带的覆盖物
            BusLineOverlay pBusLineOverlay = new BusLineOverlay(mBaidumap);
            pBusLineOverlay.setData(busLineResult);
            //添加到地图中
            pBusLineOverlay.addToMap();
            //自动控制缩放大小
            pBusLineOverlay.zoomToSpan();
        }
            }
        });

com.baidu.mapapi.search.core
包含了搜索结果的一些实体,CityInfo
PoiInfo
RouteLine
RouteNode
RouteStep
SearchResult
TaxiInfo
VehicleInfo

com.baidu.mapapi.search.geocode 地理搜索

与上面的类似,
一.初始化检索
GeoCoder 搜索实体  GeoCoder.newInstance()--初始化操作
二.搜索配置
1.GeoCodeOption 地理编码查询接口
2.ReverseGeoCodeOption 反地理编码请求参数
三.发起搜索
1.GeoCoder.geocode(GeoCodeOption option)
2.GeoCoder.reverseGeoCode(ReverseGeoCodeOption option)
四.设置监听
OnGetGeoCoderResultListener();
回调方法
void    onGetGeoCodeResult(GeoCodeResult result)
地理编码查询结果回调函数
void    onGetReverseGeoCodeResult(ReverseGeoCodeResult result)
反地理编码查询结果回调函数

com.baidu.mapapi.search.poi POI搜索,包含城市检索,附近检索,详情检索,区域检索。

poi检索也是类似的,还是4步
一.初始化检索
PoiSearch 搜索实体  PoiSearch.newInstance()--初始化操作
二.搜索配置
1.PoiBoundSearchOption POI范围内检索参数
2.PoiCitySearchOption poi城市内检索参数
3.PoiDetailSearchOption poi 详情检索参数
4.PoiNearbySearchOption 附近检索参数
例子:
    PoiNearbySearchOption poiNearbySearchOption = new PoiNearbySearchOption();
        poiNearbySearchOption.location(mCenterlLatLng);
        poiNearbySearchOption.keyword("公交");
        poiNearbySearchOption.radius(1000);
三.发起搜索
    PoiSearch.searchInBound(PoiBoundSearchOption option)
范围内检索
PoiSearch.searchInCity(PoiCitySearchOption option)
城市内检索
PoiSearch.searchNearby(PoiNearbySearchOption option)
周边检索
PoiSearch.searchPoiDetail(PoiDetailSearchOption option)
POI 详情检索
四.设置监听
OnGetPoiSearchResultListener poi 检索结果回调
回调方法
void    onGetPoiDetailResult(PoiDetailResult result)
poi 详情查询结果回调
void    onGetPoiResult(PoiResult result)
poi 查询结果回调
在回调结果中可以使用
BusLineOverlay   //公交 地铁
DrivingRouteOverlay //驾驶
OverlayManager    //基类
PoiOverlay   //收拾的poi点显示
TransitRouteOverlay  //换乘
WalkingRouteOverlay //步行
里面的图层方法来进行显示
举例:
           //结果显示 使用自带的覆盖物
            BusLineOverlay pBusLineOverlay = new BusLineOverlay(mBaidumap);
            pBusLineOverlay.setData(busLineResult);
            //添加到地图中
            pBusLineOverlay.addToMap();
            //自动控制缩放大小
            pBusLineOverlay.zoomToSpan();

com.baidu.mapapi.search.route 驾车路线检索,走路路线检索,换乘路线检索
com.baidu.mapapi.search.share 分享
com.baidu.mapapi.search.sug 建议检索
最后三个相似不用举例了

dome:



public class PoiSearchActivity extends AppCompatActivity implements View.OnClickListener, OnGetPoiSearchResultListener, OnGetBusLineSearchResultListener {

    private MapView mMapView = null;

    BaiduMap mBaidumap;
    BusLineSearch mBusLineSearch;
    PoiSearch mPoiSearch;

    LatLng mCenterlLatLng = new LatLng(39.886332, 116.416707);

    Button mPoiSearchbtn;
    Button mBusLinebtn;

    //Poi搜索结果
    PoiResult mPoiResult = null;

    String mBusLineUid = null;

    View view;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        LayoutInflater inflater = getLayoutInflater();
        view = inflater.inflate(R.layout.activity_poi_search, null);
        setContentView(view);
        mMapView = (MapView) findViewById(R.id.bmapView);
        mBaidumap = mMapView.getMap();
        initSearch();
    }

    private void initSearch() {
        mPoiSearchbtn = (Button) findViewById(R.id.poiSearch);
        mBusLinebtn = (Button) findViewById(R.id.bussearch);
        mPoiSearchbtn.setOnClickListener(this);
        mBusLinebtn.setOnClickListener(this);

        mBusLineSearch = BusLineSearch.newInstance();
        mPoiSearch = PoiSearch.newInstance();
    }

    private void initPoiNearbySearchOption() {
        PoiNearbySearchOption poiNearbySearchOption = new PoiNearbySearchOption();
        poiNearbySearchOption.location(mCenterlLatLng);
        poiNearbySearchOption.keyword("公交");
        poiNearbySearchOption.radius(1000);
        mPoiSearch.searchNearby(poiNearbySearchOption);
        mPoiSearch.setOnGetPoiSearchResultListener(this);
    }

    private void initBusLineSearchOption() {
        if (mBusLineUid != null) {
            BusLineSearchOption busLineSearchOption = new BusLineSearchOption();
            busLineSearchOption.city("北京市");
            busLineSearchOption.uid(mBusLineUid);
            mBusLineSearch.searchBusLine(busLineSearchOption);
            mBusLineSearch.setOnGetBusLineSearchResultListener(this);
        }

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.poiSearch:
                initPoiNearbySearchOption();
                break;
            case R.id.bussearch:
                initBusLineSearchOption();
                break;
        }
    }

    @Override
    public void onGetPoiResult(PoiResult poiResult) {

        if (poiResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {
            Log.d("skyfin", "error");
        } else {
            mBaidumap.clear();
            //创建PoiOverlay
            PoiOverlay overlay = new MyPoiOverlay(mBaidumap);
            //设置overlay可以处理标注点击事件
            mBaidumap.setOnMarkerClickListener(overlay);
            overlay.setData(poiResult); //设置PoiOverlay数据
            overlay.addToMap(); //添加PoiOverlay到地图中
            overlay.zoomToSpan();
            this.mPoiResult = poiResult;
        }
        BusLineSearch pBusLineSearch = BusLineSearch.newInstance();
        BusLineSearchOption pBusLineSearchOption = new BusLineSearchOption().city("北京").uid("UID");
        pBusLineSearch.searchBusLine(pBusLineSearchOption);
        pBusLineSearch.setOnGetBusLineSearchResultListener(new OnGetBusLineSearchResultListener() {
            @Override
            public void onGetBusLineResult(BusLineResult busLineResult) {

            }
        });

    }

    @Override
    public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {

    }

    //获得BusLineResults
    @Override
    public void onGetBusLineResult(BusLineResult busLineResult) {

        if (busLineResult.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) {

            Snackbar.make(view, "由于百度的问题,POI搜索出来的POIINFO的type只为BUS_STATION, POINT, SUBWAY_STATION,没有BUS_LINE,导致有些功能不能使用,这里还是贴出来代码", Snackbar.LENGTH_SHORT).show();
        } else {
            mBaidumap.clear();
            //显示在地图上
            BusLineOverlay pBusLineOverlay = new BusLineOverlay(mBaidumap);
            pBusLineOverlay.setData(busLineResult);
            pBusLineOverlay.addToMap();
            pBusLineOverlay.zoomToSpan();
        }
    }

    private class MyPoiOverlay extends PoiOverlay {
        public MyPoiOverlay(BaiduMap baiduMap) {
            super(baiduMap);
        }

        @Override
        public boolean onPoiClick(int index) {
            super.onPoiClick(index);
            if (mPoiResult != null) {
                List<PoiInfo> poiInfoList = mPoiResult.getAllPoi();
                LayoutInflater inflater = getLayoutInflater();
                View view = inflater.inflate(R.layout.poiresult_layout, null);
                ((TextView) view.findViewById(R.id.address)).setText("address: " + poiInfoList.get(index).address);
                ((TextView) view.findViewById(R.id.city)).setText("city: " + poiInfoList.get(index).city);
                ((TextView) view.findViewById(R.id.location)).setText("location: " + poiInfoList.get(index).location);
                ((TextView) view.findViewById(R.id.name)).setText("name: " + poiInfoList.get(index).name);
                ((TextView) view.findViewById(R.id.phoneNum)).setText("phoneNum: " + poiInfoList.get(index).phoneNum);
                ((TextView) view.findViewById(R.id.type)).setText("type: " + poiInfoList.get(index).type);
                ((TextView) view.findViewById(R.id.uid)).setText("uid: " + poiInfoList.get(index).uid);
                Dialog dialog = new AlertDialog.Builder(PoiSearchActivity.this, R.style.Mystyle)
                        .setView(view)
                        .setTitle("title")
                        .create();
                dialog.show();
                if (poiInfoList.get(index).type == PoiInfo.POITYPE.BUS_LINE
                        || poiInfoList.get(index).type == PoiInfo.POITYPE.SUBWAY_LINE) {
                    Log.d("skyfin", "由于百度的问题,POI搜索出来的POIINFO的type只为BUS_STATION, POINT, SUBWAY_STATION,没有BUS_LINE,导致有些功能不能使用,这里还是贴出来代码");
                }
                mBusLineUid = poiInfoList.get(index).uid;
            }
            return true;
        }
    }

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

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

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

最后附上代码下载地址:https://github.com/locojyw/BaiduMapAPI/tree/master

总结下:百度地图的使用还是蛮简单的,但是由于百度地图的问题文章,到此结束了,之后或许有全景地图的分享吧。明天开始android新的征程。|

做一个知识的分享者,Skyfin On the way。 by-2015/10/29

版权声明:本文为博主原创文章,未经博主允许不得转载。