您的位置:首页 > 其它

百度地图最新版本sdk使用系列(六)-搜索周边美食,加油站等,并使用infoWindow展示

2015-05-12 15:04 501 查看
搜索周边的核心类是PoiSearch,核心回调接口是OnGetPoiSearchResultListener,

在其回调方法onGetPoiDetailResult(PoiDetailResult poiDetailResult)的参数

poiDetailResult中包含百度服务器端返回的搜索结果.

详细代码如下:

[code]public class MainActivity extends Activity {    
    private static final String TAG = "MainActivity";

    private MapView mMapView;// 地图视图
    private BaiduMap mBaiduMap;// 地图控制器 setMapStatus(mMapStatusUpdate);
    private MapStatus mMapStatus;// 地图当前状态
    private MapStatusUpdate mMapStatusUpdate;// 地图将要变化成的状态
    private Button btn_location;// 定位button
    private Button btn_search;// 搜索button

    public LocationClient mLocationClient = null;// 定位的核心类:LocationClient
    public BDLocationListener myLocationListener = new MyLocationListener();// 定位的回调接口
    private LatLng mCurrentLatLng;// 当前经纬度坐标

    private PoiSearch mPoiSearch;// poi检索核心类
    private MySearchResultListener mySearchResultListener;// poi检索核心接口

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 在使用SDK各组件之前初始化context信息,传入ApplicationContext
        // 该方法要在setContentView方法之前实现
        SDKInitializer.initialize(getApplicationContext());
        setContentView(R.layout.activity_main);
        init();
        // 设置是否允许定位图层,只有先允许定位图层后设置定位数据才会生效
        mBaiduMap.setMyLocationEnabled(true);

        btn_search.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                search();

            }
        });

        btn_location.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                location();
                mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);// 开启卫星图
                // 获得地图的当前状态的信息
                mMapStatus = new MapStatus.Builder().zoom(15)
                        .target(mCurrentLatLng).build();
                // 设置地图将要变成的状态
                mMapStatusUpdate = MapStatusUpdateFactory
                        .newMapStatus(mMapStatus);
                mBaiduMap.setMapStatus(mMapStatusUpdate);// 设置地图的变化
            }
        });
    }

    private void init() {
        // 获得地图控件引用
        mMapView = (MapView) findViewById(R.id.bmapView);
        // 获得地图控制器
        mBaiduMap = mMapView.getMap();// MapView与BaiduMap一一对应
        // 定位核心类
        mLocationClient = new LocationClient(getApplicationContext());
        // 定位回调接口
        myLocationListener = new MyLocationListener();
        // 定位按钮
        btn_location = (Button) findViewById(R.id.location);

        //poi搜索核心类
        mPoiSearch = PoiSearch.newInstance();
        //poi搜索回调接口
        mySearchResultListener = new MySearchResultListener();      
        // 搜索按钮
        btn_search = (Button) findViewById(R.id.search);
    }

    /**
     * 定位
     */
    private void location() {
        // 设置mLocationClient数据,如是否打开GPS,使用LocationClientOption类.
        LocationClientOption option = new LocationClientOption();
        option.setLocationMode(LocationMode.Hight_Accuracy);// 设置定位模式
        option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02
        option.setScanSpan(3000);// 设置发起定位请求的间隔时间为5000ms
        option.setIsNeedAddress(true);// 返回的定位结果包含地址信息
        option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向
        option.setOpenGps(true);// 打开GPS
        mLocationClient.setLocOption(option);
        mLocationClient.registerLocationListener(myLocationListener);
    }

    public class MyLocationListener implements BDLocationListener {
        @Override
        public void onReceiveLocation(BDLocation location) {
            // mapView 销毁后不在处理新接收的位置
            if (location == null || mMapView == null)
                return;
            // 获取服务器回传的当前经纬度
            mCurrentLatLng = new LatLng(location.getLatitude(),
                    location.getLongitude());
            // 构造定位数据
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())// 获取定位精度
                    .latitude(location.getLatitude())// 获取纬度坐标
                    .longitude(location.getLongitude())// 获取精度坐标
                    .build();
            mBaiduMap.setMyLocationData(locData);// 设置定位数据      

        }
    }

    /**
     * poi检索(圆形)
     */
    private void search() {
        mPoiSearch.setOnGetPoiSearchResultListener(mySearchResultListener);
        // PoiSearch需要设置相关参数,比如关键字,距离等
        PoiNearbySearchOption pnso = new PoiNearbySearchOption();
        pnso.keyword("美食");
        pnso.location(mCurrentLatLng);
        pnso.radius(1000);
        mPoiSearch.searchNearby(pnso);
    }   

    public class MySearchResultListener implements OnGetPoiSearchResultListener {

        @Override
        public void onGetPoiDetailResult(final PoiDetailResult poiDetailResult) {
            if (poiDetailResult.error != SearchResult.ERRORNO.NO_ERROR) {
                // 检索失败
            } else {
                // 点击marker showInfoWindow
                mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener() {
                    private BitmapDescriptor descriptor;

                    @Override
                    public boolean onMarkerClick(Marker arg0) {
                        // 设置弹窗 (View arg0, LatLng arg1, int arg2) y 偏移量 ,
                        Button btn = new Button(getApplicationContext());
                        btn.setBackgroundColor(0xAA00FF00);
                        btn.setText(poiDetailResult.getName());
                        // btn 变成 View 图片                       
                        descriptor = BitmapDescriptorFactory.fromView(btn);

                        InfoWindow mInfoWindow = new InfoWindow(descriptor,
                                poiDetailResult.getLocation(), -60,
                                new OnInfoWindowClickListener() {

                                    public void onInfoWindowClick() {
                                        // 点击infoWindow可以触发二次检索,跳转界面
                                        // 隐藏弹窗!
                                        mBaiduMap.hideInfoWindow();
                                    }
                                });
                        mBaiduMap.showInfoWindow(mInfoWindow);
                        return false;
                    }
                }); 

            }
        }

        @Override
        public void onGetPoiResult(PoiResult poiResult) {
            // 首先判断检索结果是否有错,在判断检索结果是否为空
            if (poiResult.error == SearchResult.ERRORNO.NO_ERROR) {
                if (poiResult != null) {
                    mBaiduMap.clear();
                    // 绑定Overlay
                    MyPoiOverlay poiOverlay = new MyPoiOverlay(mBaiduMap);
                    mBaiduMap.setOnMarkerClickListener(poiOverlay);
                    // 设置数据到overlay
                    poiOverlay.setData(poiResult);
                    poiOverlay.addToMap();
                    // 缩放地图,使所有Overlay都在合适的视野内 注: 该方法只对Marker类型的overlay有效
                    poiOverlay.zoomToSpan();
                }

            } else {
                Toast.makeText(getApplicationContext(), "无结果",
                        Toast.LENGTH_SHORT).show();
            }
        }
    }

    // 自定义PoiOverlay
    class MyPoiOverlay extends PoiOverlay {

        public MyPoiOverlay(BaiduMap baiduMap) {
            super(baiduMap);
        }

        @Override
        public boolean onPoiClick(int index) {
            super.onPoiClick(index);
            PoiInfo poi = getPoiResult().getAllPoi().get(index);
            mPoiSearch.searchPoiDetail((new PoiDetailSearchOption())
                    .poiUid(poi.uid));
            return super.onPoiClick(index);
        }

    }

    @Override
    protected void onStart() {
        location();
        mLocationClient.start();// 开启定位请求
        super.onStart();
    }

    @Override
    protected void onResume() {
        mMapView.onResume();
        super.onResume();
    }

    @Override
    protected void onPause() {
        mLocationClient.stop();// 停止定位
        mMapView.onPause();
        super.onPause();
    }

    @Override
    protected void onDestroy() {
        mMapView.onDestroy();
        super.onDestroy();
    }
}


**此demo已上传csdn,下载地址为:

http://download.csdn.net/detail/csdn1027719307/8700107**
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐