[baidu] 06_百度地图加强_搜索_PoiSearchInbounds(矩形区域内检索信息)

Android 4.0

百度地图加强_搜索_PoiSearchInbounds(矩形区域内检索信息)


搜索步骤:
1、MKSearch对象创建,并调用init进行初始化,设置好监听MKSearchListener 
2、调用MKSearch对应的搜索方法,然后在MKSearchListener中相应的方法中,实现逻辑
搜索的两个核心类
1、MKSearch   搜索服务.

用于位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索

public boolean init(BMapManager bmapMan, MKSearchListener listener)  初使化

②搜索:

public int poiSearchInbounds(java.lang.String key, GeoPoint ptLB, GeoPoint ptRT)  根据范围和检索词发起范围检索.(矩形区域搜索)

public int poiSearchNearBy(java.lang.String key, GeoPoint pt, int radius)  根据中心点、半径与检索词发起周边检索. 自1.1版本之后支持  (圆形搜索,以一个中心点)
public int poiSearchInCity(java.lang.String city, java.lang.String key)   城市poi检索.

2、MKSearchListener  搜索结果通知接口。

该接口返回poi搜索,公交搜索,驾乘路线,步行路线结果

一、PoiSearchInbounds()


1、public class MKSearch
① 矩形区域类搜索:public int poiSearchInbounds(java.lang.String key , GeoPoint ptLB, GeoPoint ptRT)  
根据范围和检索词发起范围检索.
异步函数,返回结果在MKSearchListener里的onGetPoiResult方法通知
key - 关键词 
ptLB - 地理坐标,范围的左下角
ptRT - 地理坐标,范围的右上角

2、public interface MKSearchListener  
①void onGetPoiResult(MKPoiResult result, int type, int iError)    返回poi搜索结果
result - 搜索结果
type - 返回结果类型: 当预设城市有搜索结果时,type为 MKSearch.TYPE_POI_LIST,在预设城市没有搜索结果,但在其他城市找到时返回其他城市列表, type为 MKSearch.TYPE_CITY_LIST
iError - 错误号,0表示正确返回

3、public class MKPoiResult
poi搜索结果类。
由MKSearchResultNotifier的onGetPoiResult方法获得
public java.util.ArrayList<MKPoiInfo> getAllPoi()

4、public class PoiOverlay  poi内置overlay .
public void setData(java.util.ArrayList<MKPoiInfo> data)  设置poi 数据
data - : poi 信息集合
核心代码:
①PoiSearchInboundsDemo.java
package cn.zengfansheng.mybaidumap.search;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.widget.Toast;
import cn.zengfansheng.mybaidumap.BaseActivity;
import cn.zengfansheng.mybaidumap.BaseMKMapViewListener;
import cn.zengfansheng.mybaidumap.BaseMkSearchListener;
import com.baidu.mapapi.map.MapPoi;
import com.baidu.mapapi.map.Overlay;
import com.baidu.mapapi.map.PoiOverlay;
import com.baidu.mapapi.search.MKPoiInfo;
import com.baidu.mapapi.search.MKPoiResult;
import com.baidu.mapapi.search.MKSearch;
import com.baidu.mapapi.search.MKSearchListener;
import com.baidu.platform.comapi.basestruct.GeoPoint;
/**
 * 在矩形区域内检索信息
 */
public class PoiSearchInboundsDemo extends BaseActivity {

    private MKSearch mkSearch;// 搜索服务类
    private MKSearchListener mkSearchListener;// 搜索结果通知类

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        searchInBounds();
    }
    // NOTES===========================1、步骤===========================
    // 1、利用MKSearch类搜索,MKSearchListener接口返回搜索的结果
    // 2、然后用一个Overlay子类来展示

    // NOTES===========================2、 在矩形区域内检索信息======================
    /**
     * 在矩形区域内检索信息
     */
    private void searchInBounds() {
        mkSearch = new MKSearch();
        // 1、初始化
        mkSearchListener = new MyMkSearchListener();
        mkSearch.init(mBMapManmkSearchListener);

        // 2、矩形区域内按照key搜索兴趣点
        GeoPoint ptLB = new GeoPoint((int) (40.035 * 1E6), (int) (116.296 * 1E6));
        GeoPoint ptRT = new GeoPoint((int) (40.051 * 1E6), (int) (116.303 * 1E6));
        mkSearch.poiSearchInbounds("加油站", ptLB, ptRT);
    }
    // NOTES===========================3、搜索服务类===========================
    /**
     * 搜索服务类,保存搜索结果的类(不实现接口,利用适配器模式,提供默认实现)
     */
    private class MyMkSearchListener extends BaseMkSearchListener {
        @Override
        public void onGetPoiResult(MKPoiResult result, int type, int iError) {
            if (iError == 0 && result != null) {// 错误号,0表示正确返回

                //搜索结果由PoiOverlay来展示
                // 1、获取MapView的Overlay集合
                List<Overlay> overlays = mMapView.getOverlays();

                // 2、添加到集合中
                PoiOverlay poiOverlay = new PoiOverlay(
                        PoiSearchInboundsDemo.thismMapView);
                overlays.add(poiOverlay);

                // 2-1、设置数据,result中封装的数据设置给Overlay的子类
                ArrayList<MKPoiInfo> data = result.getAllPoi();
                poiOverlay.setData(data);
                
                mapController.enableClick(true);
                MyMKMapViewListener myMKMapViewListener = new MyMKMapViewListener();
                mMapView.regMapViewListener(mBMapMan, myMKMapViewListener);
                
                // 3、刷新界面
                mMapView.refresh();
            } else {
                Toast.makeText(getApplicationContext(), "无结果", 0).show();
            }
        }
    }
    // NOTES===========================4、MapView监听类===========================
    /**
     * MapView监听类,监听兴趣点点击事件
     */
    private class MyMKMapViewListener extends BaseMKMapViewListener {
        @Override
        public void onClickMapPoi(MapPoi mapPoiInfo) {
            super.onClickMapPoi(mapPoiInfo);
            Toast.makeText(getApplicationContext(), mapPoiInfo.strText, 0)
                    .show();
        }
    }
}
 适配器模式:搜索完毕后,调用的接口  MkSearchListener
BaseMkSearchListener.java

package cn.zengfansheng.mybaidumap;
 
import com.baidu.mapapi.search.MKAddrInfo;
import com.baidu.mapapi.search.MKBusLineResult;
import com.baidu.mapapi.search.MKDrivingRouteResult;
import com.baidu.mapapi.search.MKPoiResult;
import com.baidu.mapapi.search.MKSearchListener;
import com.baidu.mapapi.search.MKShareUrlResult;
import com.baidu.mapapi.search.MKSuggestionResult;
import com.baidu.mapapi.search.MKTransitRouteResult;
import com.baidu.mapapi.search.MKWalkingRouteResult;
 
/**
* 基本的mkSearchListener实现类(适配器模式)
*/

public abstract class BaseMkSearchListener implements MKSearchListener {
 
    @Override
    public void onGetAddrResult(MKAddrInfo arg0, int arg1) {
    }
 
    @Override
    public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {
    }
 
    @Override
    public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) {
    }
 
    @Override
    public void onGetPoiDetailSearchResult(int arg0, int arg1) {
    }
 
    /**
     * 返回poi搜索结果
     */

    @Override
    public void onGetPoiResult(MKPoiResult result, int type, int iError) {
    }
 
    @Override
    public void onGetShareUrlResult(MKShareUrlResult arg0, int arg1, int arg2) {
    }
 
    @Override
    public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {
    }
 
    @Override
    public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {
    }
 
    @Override
    public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) {
    }
 
}
③  MapView的接口   MKMapViewListener
BaseMKMapViewListener.java

package cn.zengfansheng.mybaidumap;
 
import android.graphics.Bitmap;
 
import com.baidu.mapapi.map.MKMapViewListener;
import com.baidu.mapapi.map.MapPoi;
 
/**
* 基本的地图显示事件监听器类。 该类空实现MKMapViewListener接口监听地图显示事件,用户需要实现该接口以处理相应事件。(适配器模式)
*/

public abstract class BaseMKMapViewListener implements MKMapViewListener {
    // 地图显示事件监听器。 该接口监听地图显示事件,用户需要实现该接口以处理相应事件。
 
    /**
     * 点击到地图可点标注时会回调此接口
     */

    @Override
    public void onClickMapPoi(MapPoi mapPoiInfo) {
    }
 
    /**
     * 截图成功后会回调此接口
     */

    @Override
    public void onGetCurrentMap(Bitmap bitmap) {
    }
 
    /**
     * 动画结束时会回调此消息
     */

    @Override
    public void onMapAnimationFinish() {
    }
 
    /**
     * 在图加载完成回调
     */

    @Override
    public void onMapLoadFinish() {
    }
 
    /**
     * 地图移动完成时会回调此接口
     */

    @Override
    public void onMapMoveFinish() {
    }
 
}
结果: