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

来源:互联网 发布:阿里云邮服务器地址 编辑:程序博客网 时间:2024/04/29 13:22

搜索周边的核心类是PoiSearch,核心回调接口是OnGetPoiSearchResultListener,
在其回调方法onGetPoiDetailResult(PoiDetailResult poiDetailResult)的参数
poiDetailResult中包含百度服务器端返回的搜索结果.

详细代码如下:

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**

0 0
原创粉丝点击