百度地图开发之poi检索,线路规划

 

官方文档 http://lbsyun.baidu.com/index.php?title=androidsdk/guide/key

先去官方文档申请秘钥下载压缩文件等操作,参考

百度地图的秘钥申请与sdk下载,显示地图(1)

公交,步行,驾车路线查询,附近POI查询

参考文档导入所需jar包和so文件

标注点,覆盖物的实现见官方文档

 poi检索:
1.首先获取地图,创建poi检索实例:

   private void initView() {
        //输入框
        etPoi = (EditText) inflate.findViewById(R.id.fragment_detailpage_search_et_poi);
        //检索图标
        ivSearch = (ImageView) inflate.findViewById(R.id.fragment_detailpage_search_iv_search);
        //设置点击监听
        ivSearch.setOnClickListener(this);
        //获取地图控件引用
        mMapView = (MapView)inflate.findViewById(R.id.bmapView);
        mBaiduMap = mMapView.getMap();
        //普通地图
        mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
        //创建POI检索实例
        mPoiSearch = PoiSearch.newInstance();     //详细信息布局
        mMarkerInfoLayout = (RelativeLayout)inflate. findViewById(R.id.layout_map_rl_layout);

    }

2.为poi检索设置监听,监听回调了两个方法,第一个是poi检索结果的监听,当用户进行poi检索后,会回调该方法,第二个方法,是对检索后显示的标注点(marker)进行点击后回调的方法,会传入该点的详情结果对象,我们可以通过该对象得到名字,地址,url地址等

      //设置监听
        mPoiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {

        /*    1.获得poi检索结果的监听*/

            @Override
            public void onGetPoiResult(PoiResult poiResult) {         //创建覆盖物对象
                myPoiOverlay = new MyPoiOverlay(mBaiduMap);
                myPoiOverlay.setData(poiResult);
                myPoiOverlay.addToMap();
                myPoiOverlay.zoomToSpan();
                //给poi的结果设置点击事件,点击marker后弹出详情页
                mBaiduMap.setOnMarkerClickListener(myPoiOverlay);
                Log.i("tag", "获得poi检索结果的监听 ");
            }
            /* 3. poi的详情页结果*/
            @Override
            public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
                if (poiDetailResult.error != SearchResult.ERRORNO.NO_ERROR) {
                    Toast.makeText(getActivity(), "抱歉,未找到结果",
                            Toast.LENGTH_SHORT).show();
                    etPoi.setText("");
                } else {// 正常返回结果的时候,此处可以获得很多相关信息
                    //获取详情页的请求结果
                    String detailUrl = poiDetailResult.getDetailUrl();
                    //得到当前经纬度
                    Log.i("tag", "获取详情页的请求结果: detailUrl -" +  poiDetailResult.getName() + ": "
                            + poiDetailResult.getAddress());
                    Toast.makeText(getActivity(), detailUrl, Toast.LENGTH_SHORT).show();
                    //弹出窗体
                    // 设置详细信息布局为可见
                    mMarkerInfoLayout.setVisibility(View.VISIBLE);
                    //根据商家信息为详细信息布局设置信息
                    popupInfo(mMarkerInfoLayout, poiDetailResult);
                }}

            @Override
            public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {

            }
        });

上面创建的MyPoiOverlay是继承了PoiOverLay的,需要重写onPoiClick,当poi检索的结果被点击的时候回调该方法,然后通过获得该标注点的uid得到详情结果然后将详情结果,传入检索监听中的onGetPoiDetailResult(PoiDetailResult poiDetailResult),

注意:需要为marker设置点击监听,

 mBaiduMap.setOnMarkerClickListener(myPoiOverlay);
   class MyPoiOverlay extends PoiOverlay {

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

        /*2.当poi的结果点被点击的时候调用*/
        @Override
        public boolean onPoiClick(int i) {

            //获取i对应的点的uid
            String uid = getPoiResult().getAllPoi().get(i).uid;
            Log.i("tag", "当poi的结果点被点击的时候调用: "+uid);
            //uid是POI检索中获取的POI ID信息
            mPoiSearch.searchPoiDetail((new PoiDetailSearchOption()).poiUid(uid));
            return super.onPoiClick(i);
        }
    }

popInfo:使用viewHolder复用布局

 private void popupInfo(RelativeLayout mMarkerInfoLayout,final PoiDetailResult poiDetailResult) {
        ViewHolder viewHolder = null;
        if(mMarkerInfoLayout.getTag() == null){
            viewHolder = new ViewHolder();
            viewHolder.poiName = (TextView) inflate.findViewById(R.id.layout_map_poiname);
            viewHolder.poiAddress = (TextView)inflate.findViewById(R.id.layout_map_poiaddress);
            viewHolder.poiSearch = (TextView) inflate.findViewById(R.id.layout_map_button);
            mMarkerInfoLayout.setTag(viewHolder);
        }else{
            viewHolder = (ViewHolder) mMarkerInfoLayout.getTag();
            viewHolder.poiName.setText(poiDetailResult.getName());
            viewHolder.poiAddress.setText(poiDetailResult.getAddress());
            viewHolder.poiSearch.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                       //弹出新的页面展示poi详情
                Intent intent = new Intent(getActivity(), PoiDetailActivity.class);
                intent.putExtra("POI_DETAIL_URL",poiDetailResult.getDetailUrl());
                startActivity(intent);
                }
            });
        }
    }
    class ViewHolder{
        TextView poiName;
        TextView poiSearch;
        TextView poiAddress;

    }

为地图设置点击事件,点击隐藏布局

        mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener()
        {
            @Override
            public boolean onMapPoiClick(MapPoi arg0)
            {
                return false;
            }

            @Override
            public void onMapClick(LatLng arg0)
            {
                mMarkerInfoLayout.setVisibility(View.GONE);
                mBaiduMap.hideInfoWindow();
            }
        });

开始搜索poi:按城市内搜索

    public void onStartSearch(View view){
       // String keyword = etKeyword.getText().toString().trim();
    /*    if (TextUtils.isEmpty(keyword)){
            return;
        }*/
        Log.i("tag", "onStartSearch: ");
        mPoiSearch.searchInCity(new PoiCitySearchOption().city("杭州").keyword("美食").pageNum(10));
        /**
         * 附近检索
         */
/*
        PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption();
        nearbySearchOption.location(new LatLng(latitude, longitude));
        nearbySearchOption.keyword(editSearchKeyEt.getText().toString());
        nearbySearchOption.radius(1000);// 检索半径,单位是米
        nearbySearchOption.pageNum(10);
        mPoiSearch.searchNearby(nearbySearchOption);// 发起附近检索请求*/

    }

DetailPoiActivity

public class PoiDetailActivity extends Activity {

    private WebView wbPoiDetail;

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

        wbPoiDetail = (WebView) findViewById(R.id.wv_poidetail);
        Intent intent = getIntent();
        String url = intent.getStringExtra("POI_DETAIL_URL");
        Log.i("MainActivity", "url-" + url);
        //webview加载数据
        wbPoiDetail.loadUrl(url);

        wbPoiDetail.setWebViewClient(new WebViewClient(){//解决办法
                         public boolean shouldOverrideUrlLoading(WebView view, String url) {
                                //返回true的时候网页在webView中去打开,如果为false则是调用系统浏览器打开
                               view.loadUrl(url);
                                return true;
                            }
        });

    }
}

效果如下:

线路规划基本步骤:

分析:    1.创建路规划检索实例      设置点击事件    2.准备检索起、终点信息    3.发起线路规划的检索      1.公交检索      2.驾车检索      3.步行      4.设置检索结果监听器      5.实现监听器    根据不同的结果展示不同的路线      1.公交检索      2.驾车检索      3.步行
public class RoutePlanActivity extends Activity {
    private MapView mMapView;
    private RoutePlanSearch mSearch;
    private EditText etStartName;
    private EditText etEndName;
    private BaiduMap mBaiduMap;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_routeplan);
        etStartName = (EditText) findViewById(R.id.et_startname);
        etEndName = (EditText) findViewById(R.id.et_endname);

        //获取地图控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
        mBaiduMap = mMapView.getMap();

//            1.创建路规划检索实例;
        mSearch = RoutePlanSearch.newInstance();

        //设置检索结果监听器
        mSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() {

            /*步行结果监听*/
            @Override
            public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {
                if(walkingRouteResult == null || walkingRouteResult.error != SearchResult.ERRORNO.NO_ERROR){
                    Toast.makeText(RoutePlanActivity.this, "请求结果有误", Toast.LENGTH_SHORT).show();
                }
                if (walkingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {
                    //构造公交线路的图层对象
                    WalkingRouteOverlay walkingRouteOverlay = new WalkingRouteOverlay(mBaiduMap);

                    //给覆盖物设置数据
                    walkingRouteOverlay.setData(walkingRouteResult.getRouteLines().get(0));
                    //添加到map
                    walkingRouteOverlay.addToMap();
                    //设置自适应缩放
                    walkingRouteOverlay.zoomToSpan();

                }
            }

            /*公交线路监听*/
            @Override
            public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {
                if(transitRouteResult == null || transitRouteResult.error != SearchResult.ERRORNO.NO_ERROR){
                    Toast.makeText(RoutePlanActivity.this, "请求结果有误", Toast.LENGTH_SHORT).show();
                }
                if (transitRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {
                    //构造公交线路的图层对象
                    TransitRouteOverlay transitRouteOverlay = new TransitRouteOverlay(mBaiduMap);

                    //给覆盖物设置数据
                    transitRouteOverlay.setData(transitRouteResult.getRouteLines().get(0));
                    //添加到map
                    transitRouteOverlay.addToMap();
                    //设置自适应缩放
                    transitRouteOverlay.zoomToSpan();

                }

                }

            /*驾车线路监听*/
            @Override
            public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {
                if(drivingRouteResult == null || drivingRouteResult.error != SearchResult.ERRORNO.NO_ERROR){
                    Toast.makeText(RoutePlanActivity.this, "请求结果有误", Toast.LENGTH_SHORT).show();
                }
                if (drivingRouteResult.error == SearchResult.ERRORNO.NO_ERROR) {
                    //构造公交线路的图层对象
                    DrivingRouteOverlay drivingRouteOverlay = new DrivingRouteOverlay(mBaiduMap);

                    //给覆盖物设置数据
                    drivingRouteOverlay.setData(drivingRouteResult.getRouteLines().get(0));
                    //添加到map
                    drivingRouteOverlay.addToMap();
                    //设置自适应缩放
                    drivingRouteOverlay.zoomToSpan();

                }
            }

            @Override
            public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {

            }
        });
    }

    public void onSearchRuote(View view) {
        //检查数据是否合法
        String startName = etStartName.getText().toString().trim();
        String endName = etEndName.getText().toString().trim();
        if (TextUtils.isEmpty(startName) || TextUtils.isEmpty(endName)) {
            return;
        }

        PlanNode stNode = PlanNode.withCityNameAndPlaceName("北京", startName);
        PlanNode enNode = PlanNode.withCityNameAndPlaceName("北京", endName);

        switch (view.getId()) {
            case R.id.btn_transit:
                mSearch.transitSearch(new TransitRoutePlanOption().from(stNode).to(enNode).city("北京"));
                break;
            case R.id.btn_driving:
                mSearch.drivingSearch(new DrivingRoutePlanOption().from(stNode).to(enNode));
                break;
            case R.id.btn_walking:
                mSearch.walkingSearch(new WalkingRoutePlanOption().from(stNode).to(enNode));
                break;
            default:
                break;
        }

    }

    @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();
    }
}

公交线路规划:

public class BusLineSearchActivity extends Activity {
    private MapView mMapView;
    private BaiduMap mBaiduMap;
    private EditText etKeyword;
    private PoiSearch mPoiSearch;
    private BusLineSearch mBusLineSearch;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_buslinesearch);
        //获取地图控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
        mBaiduMap = mMapView.getMap();

        etKeyword = (EditText) findViewById(R.id.et_keyword);
//       创建POI检索实例
        mPoiSearch = PoiSearch.newInstance();
        //创建buslineserarch的实例
        mBusLineSearch = BusLineSearch.newInstance();

        //设置监听
        mBusLineSearch.setOnGetBusLineSearchResultListener(new OnGetBusLineSearchResultListener() {
            @Override
            public void onGetBusLineResult(BusLineResult busLineResult) {
                    //展示公交线路信息
                BusLineOverlay busLineOverlay = new BusLineOverlay(mBaiduMap);
                busLineOverlay.setData(busLineResult);
                busLineOverlay.addToMap();
                busLineOverlay.zoomToSpan();
            }
        });

        mPoiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
            @Override
            public void onGetPoiResult(PoiResult poiResult) {
                    //获得公交信息的poi检索结果
                if (poiResult == null || poiResult.error != SearchResult.ERRORNO.NO_ERROR) {
                    return;
                }
                //只展示第一条公交信息
                PoiInfo poiInfo = poiResult.getAllPoi().get(0);

               //重新请求
                //如下代码为发起检索代码,定义监听者和设置监听器的方法与POI中的类似
                mBusLineSearch.searchBusLine((new BusLineSearchOption()
                        .city("北京")
                        .uid(poiInfo.uid)));
            }

            @Override
            public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {

            }

            @Override
            public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {

            }
        });
    }

    public void onStartSearch(View view){
        String keyword = etKeyword.getText().toString().trim();
        if (TextUtils.isEmpty(keyword)){
            return;
        }
        mPoiSearch.searchInCity(new PoiCitySearchOption().city("北京").keyword(keyword));

    }

    @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();
    }
}
时间: 2024-10-07 07:46:12

百度地图开发之poi检索,线路规划的相关文章

百度地图开发之POI数据检索

前面学习百度地图的一些基本的用法,这次我们一起来看一看百度地图的检索功能吧 poi检索api的基本用法 百度地图的POI类中共有如下几个方法 PoiBoundSearchOption POI范围内检索参数 PoiCitySearchOption poi城市内检索参数 PoiDetailResult 详情检索结果 PoiDetailSearchOption poi 详情检索参数 PoiNearbySearchOption 附近检索参数 PoiResult poi搜索结果. PoiSearch PO

[Android]百度地图开发之SDK开发环境搭建

本篇文章我们将探讨如果在Android应用当中集成百度地图的SDK,以及新建一个很简单的示例工程. 一.百度地图Android SDK集成 1.进入百度地图开发者网站:http://lbsyun.baidu.com/index.php?title=androidsdk 2.点击左侧的"获取密钥"菜单,为应用申请一个key.我这边申请的key是:vf4KXBWl1mEvOyCFsML4YRLGpYZ99XYf 3.申请完后回到上面提到的网站,点击左侧:"相关下载"菜单

顾维灏谈百度地图数据采集:POI自动处理率达90%

顾维灏谈百度地图数据采集:POI自动处理率达90% 发布时间:2015-12-21 22:37        来源:cnsoftnews.com        作者: 百度地图还创新研发高精地图,并成为国内唯一掌握这一无人驾驶汽车的核心技术的地图厂商.基于强大的自采能力和不断开拓的技术创新,百度地图正在变革人们对于地图的定义. 12月21日,百度地图十周年生态大会在798艺术区尤伦斯当代艺术中心举行,百度地图事业部副总经理顾维灏出席大会并发表主题演讲.顾维灏表示,百度地图已经拥有超过4000万的

Android应用中使用百度地图API之POI(三)

先看执行后的图吧: POI(Point of Interest).中文能够翻译为"兴趣点".在地理信息系统中.一个POI能够是一栋房子.一个商铺.一个邮筒.一个公交站等  具体:http://developer.baidu.com/map/sdkandev-4.htm 主要应用 MKSearch 类: com.baidu.mapapi.search 类 MKSearch java.lang.Object com.baidu.mapapi.search.MKSearch public c

百度地图集成 - 2.48 - 检索周围信息

官方文档 --- http://developer.baidu.com/map/index.php?title=iossdk/guide/key 百度地图在2.5之前, 不支持64位手机端. [注意] 首先成为百度开发者, 然后创建应用,设置bundleID-- http://developer.baidu.com/console; error : 1. "_SCNetworkReachabilityCreateWithAddress", referenced from  ---- 系

百度地图进阶【POI数据检索】

前面学习百度地图的一些基本的用法,这次我们一起来看一看百度地图的检索功能吧 poi检索api的基本用法 百度地图的POI类中共有如下几个方法 PoiBoundSearchOption POI范围内检索参数 PoiCitySearchOption poi城市内检索参数 PoiDetailResult 详情检索结果 PoiDetailSearchOption poi 详情检索参数 PoiNearbySearchOption 附近检索参数 PoiResult poi搜索结果. PoiSearch PO

零基础掌握百度地图兴趣点获取POI爬虫(python语言爬取)(基础篇)

实现目的:爬取昆明市范围内的全部中学数据,包括名称.坐标. 先进入基础篇,本篇主要讲原理方面,并实现步骤分解,为python代码编写打基础. 因为是0基础开始,所以讲得会比较详细. 如实现目的所讲,爬取昆明市全部中学数据,就是获取百度地图上昆明市范围内所有关键字带中学的地理信息数据(兴趣点). 怎么把百度地图上的数据抓取下来呢? 以下是教程: 本篇目录如下: 1. 百度地图开放平台注册,AK获取 2.关于ak的说明 3.请求URL说明 4.百度地图坐标拾取器 5.以坐标范围获取兴趣点POI 6.

从POI到O2O 看百度地图如何走出未来之路

近期O2O的烧钱融资大战如火如荼,有人已经把O2O大战,用乌合之众的群体心理失控来形容.其实厂商都不傻,O2O烧钱大家都知道,但是大家还知道O2O背后这块大蛋糕价值"万亿级". 有意思的是,在中国O2O如火如荼的当口,移动地图一直被当做是O2O的重要入口之一,一谈及O2O服务,必逃不出移动地图的触及范围.2014年高德宣布自己三年内不再做O2O,退出市场,腾讯地图虽然觊觎O2O多时,却始终形不成规模:但在百度近期转型O2O业务的过程中,地图却作为O2O的关键支撑,让这一入口对于O2O的

ios之苹果和百度地图的使用

iOS中使用较多的3款地图,google地图.百度地图.苹果自带地图(高德).其中苹果自带地图在中国使用的是高德的数据.苹果在iOS 6之后放弃了使用谷歌地图,而改用自家的地图.在国内使用的较多的就是百度.苹果自带地图(高德),以下总结下这两个. 一.苹果地图的使用 因为苹果使用的是高德的地图,加上苹果做的一些封装,使用起来也非常方便.不需要引入第三方框架,相比较之下,使用百度地图SDK会使源码与程序都 大10M多,这点很蛋疼.同时由于苹果使用的是高德,不会像谷歌地图一样在国内乌龟一样的访问速度