搜索的核心类:

MKSearchMKSearchListener

MKSearch:用于位置检索、周边检索、范围检索、公交检索、驾乘检索、

MKSearchListener:查出的结果由MKSearchListener处理

 

***使用百度地图必须进行的准备工作:

1、初始化:

1)、到百度的服务器端检验KEY

创建initManager()方法进行检验的操作:

①、创建百度地图的管理器对象:

②、对管理器对象进行初始化,调用init方法

init(String strKey, MKGeneralListener listener)

参数:

strKey:申请的授权验证码

listener:注册回调事件——需要在监听中校验key300)和网络状态(2

关于状态码信息我们可以在MKEvent查询

创建监听,实现其中的方法:

@onGetNetworkState:网络的判断——判断iError是否为2,是则无网络(此处可以提示用户)

@onGetPermissionState:授权验证的状态——判断iError是否为300,是则验证失败(此处可以提示用户)

2)加载布局文件:用于显示地图【mapView

【调用父类的onCreate方法,进行初始化】

创建布局,调用setContentView方法进行解析加载:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context=".MainActivity" >

 

    <com.baidu.mapapi.map.MapView

        android:id="@+id/mapview"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        />

</RelativeLayout>

 

3)初始化控件

①、初始化地图控件mapView

mapView = (MapView) findViewById(R.id.mapview);

②、添加缩放按钮:

mapView.setBuiltInZoomControls(true);// 显示放大和缩小的控件

③、注册监听:

mapView.regMapViewListener(manager, new MKMapViewListener()

onClickMapPoi(MapPoi poi)方法中可以设置点击某个兴趣点时显示的名称

 

4)实现生命周期的方法:

实现Activity中的onResume()onPause()onDestroy()三个方法,并在其中调用

@Override

protected void onResume() {

mapView.onResume();

super.onResume();

}

 

@Override

protected void onPause() {

mapView.onPause();

super.onPause();

}

 

@Override

protected void onDestroy() {

mapView.destroy();

super.onDestroy();

}

 

一、范围内的检索

需要结合PoiOverlay【本地搜索覆盖物】进行显示

【在poi的信息类中的字段中:uid:指的是poiid,是poi的唯一标识】

一)在矩形范围内检索[poiSearchInbounds]-----à PoiSearchInboundsDemo

1、创建类继承BaseActivity

相关的初始化方法都在上面的准备工作中

定义相关的变量:

private MKSearch search;

private MKSearchListener listener;

2、在初始化onCreate方法中定义search方法,对搜索相关类进行初始化

search方法中:

①、创建MKSearch,并进行初始化

listener = new MyListener();

search = new MKSearch();

search.init(manager, listener);

需要在之前创建好监听器

②、在矩形范围内搜索:

@需要先设置搜索的两个点的坐标:左下角和右上角的坐标

GeoPoint ptLB = new GeoPoint((int) (40.035 * 1E6), (int) (116.296 * 1E6));

GeoPoint ptRT = new GeoPoint((int) (40.051 * 1E6), (int) (116.303 * 1E6));

@调用poiSearchInbounds方法,在矩形范围内搜索:

search.poiSearchInbounds("加油站", ptLB, ptRT);

 

3、自定义监听器:

Tips

由于MKSearchListener中的方法较多,需要自定义适配器,对监听器进行改造

使得自定义的监听器继承自定义的适配器即可

①、在BaseActivity中自定义MKSearchListener的适配器,实现相应的方法

②、实现onGetPoiResult方法:

@判断返回的结果不为空,且错误码等于0【请求成功】

*创建PoiOverlay对象,传入的参数为当前的ActivitymapView

*将服务器回复的结果与覆盖物关联在一起;只有这样做了,才能将其展示在地图上

*将覆盖物添加到mapView

*刷新mapView,展示在地图上

@否则,进行提示用户

 

 

二)周边检索:[poiSearchNearBy] -----à PoiSearchNearByDemo

使用周边检索的覆盖物poiSearchNearBy可以进行圆形区域内进行检索

相关的初始化方法都在准备工作中:

初始化引擎,初始化管理器,初始化控件mapView

1、定义搜索的变量:

private MKSearch search;

private MKSearchListener listener;

2、初始化:

创建search方法,初始化搜索的相关对象和参数:

Search方法中:

①、创建MKSearch对象,并进行初始化:

@创建监听器listener

@进行初始化:指定管理对象,并设置监听

@进行周边范围的搜索,调用指定的方法:

周边检索:poiSearchNearBy(String key, GeoPoint pt, int radius)

参数:

key:搜索的名称,如“加油站”

pt:搜索的位置坐标,此对象包含指定位置的经纬度,如黑马坐标:GeoPoint hmPos=new GeoPoint(latitude, longitude);//黑马坐标

int latitude = (int) (40.051 * 1E6);// 纬度

int longitude = (int) (116.303 * 1E6);// 经度

radius:搜索的圆形区域的范围,即半径

 

private void search() {

listener=new MyListener();

search=new MKSearch();

search.init(manager, listener);

search.poiSearchNearBy("加油站", hmPos, 1000);

}

3、自定义监听器:

Tips

由于MKSearchListener中的方法较多,需要自定义适配器,对监听器进行改造

使得自定义的监听器继承自定义的适配器即可

1)实现监听中检索对应的方法

①、对周边范围内检索,实现onGetPoiResult

当获取到结果时,且请求成功(iError0),进行位置的显示:

@创建PoiOverlay覆盖物对象:指定参数——上下文,地图控件mapView

@设置参数:将服务器返回数据添加到poi覆盖物中

@添加覆盖物到MapView

@刷新MapView

PoiOverlay overlay=new PoiOverlay(PoiSearchNearByDemo.this, mapView);

overlay.setData(result.getAllPoi());

 

mapView.getOverlays().add(overlay);

mapView.refresh();

 

二)全程内范围检索:[poiSearchInCity] -----à PoiSearchInCityDemo

使用全程内范围检索的覆盖物poiSearchInCity

相关的初始化方法都在准备工作中:

初始化引擎,初始化管理器,初始化控件mapView

1、定义搜索的变量:

private MKSearch search;

private MKSearchListener listener;

2、初始化:

创建search方法,初始化搜索的相关对象和参数:

Search方法中:

①、创建MKSearch对象,并进行初始化:

@创建监听器listener

@进行初始化:指定管理对象,并设置监听

@进行全程内范围的搜索,调用指定的方法:

全程内范围的搜索:poiSearchInCity(String city, String key)

参数:

city:指定搜索的城市,如:“背景”

key:搜索的名称,如“加油站”、

3、自定义监听器:

Tips

由于MKSearchListener中的方法较多,需要自定义适配器,对监听器进行改造

使得自定义的监听器继承自定义的适配器即可

1)实现监听中检索对应的方法

对周边范围内检索,实现onGetPoiResult

①、在result中获得分页信息

*获取“第几页”:result.getPageIndex()

*获取“总页数”:result.getNumPages()

*获取本次poi搜索的总结果数:result.getNumPois()

测试:可以通过打印吐司,查看显示的页数:

String info=""+pageIndex+"页共"+numPages+"页总记录数:"+numPois;

Toast.makeText(getApplicationContext(), info, 1).show();

②、创建覆盖物,进行显示位置:

当获取到结果时,且请求成功(iError0),进行位置的显示:

@创建PoiOverlay覆盖物对象:指定参数——上下文,地图控件mapView

@设置参数:将服务器返回数据添加到poi覆盖物中

@添加覆盖物到MapView:注意,在添加覆盖物之前,需要先清除上一页显示的内容

mapView.getOverlays().clear();//清除上一页的显示内容

mapView.getOverlays().add(overlay);

@刷新MapView

 

4、测试:

通过重写按键按下的动作,进行测试:

通过搜索对象search,获取下一页的信息:search.goToPoiPage(currentPage);//获取下一页信息

 

Tips

1、在初始化布局之前,一定要初始化引擎,校验key

2POI检索结果每页容量默认情况下为10,可以通过setPoiPageCapacity设置,支持1-50(10)

3、翻页功能通过MKSearch类的goToPoiPage实现,该方法是异步函数,搜索成功后会调用注册的事件处理函数onGetPoiResult 返回查询页的结果。

4、本地搜索支持分类搜索,例如mSearch.poiSearchInCity("北京", "娱乐")

 

 

 

/**

 * 在矩形范围内搜索

 * @author Administrator

 */

public class PoiSearchInboundsDemo extends BaseActivity {

private MKSearch search;

private MKSearchListener listener;

 

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

search();

}

 

private void search() {

listener = new MyListener();

search = new MKSearch();

search.init(manager, listener);

 

GeoPoint ptLB = new GeoPoint((int) (40.035 * 1E6), (int) (116.296 * 1E6));

GeoPoint ptRT = new GeoPoint((int) (40.051 * 1E6), (int) (116.303 * 1E6));

 

// 在矩形范围内搜索

search.poiSearchInbounds("加油站", ptLB, ptRT);

}

 

private class MyListener extends BaseSearchListener {

@Override

public void onGetPoiResult(MKPoiResult result, int type, int iError) {

if (result != null && iError == 0) {

PoiOverlay overlay=new PoiOverlay(PoiSearchInboundsDemo.this, mapView);

overlay.setData(result.getAllPoi());//将服务器回复的结果与覆盖物关联在一起


mapView.getOverlays().add(overlay);

mapView.refresh();


} else {

Toast.makeText(getApplicationContext(), "未查询到结果", 0).show();

}

}

}

}

 

 

/**

 * 圆形区域内进行检索

 * @author Administrator

 *

 */

public class PoiSearchNearByDemo extends BaseActivity {

private MKSearch search;

private MKSearchListener listener;


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

search();

}

 

private void search() {

listener=new MyListener();

search=new MKSearch();

search.init(manager, listener);


search.poiSearchNearBy("加油站", hmPos, 1000);

}


private class MyListener extends BaseSearchListener{

@Override

public void onGetPoiResult(MKPoiResult result, int type, int iError) {

if (result != null && iError == 0) {

PoiOverlay overlay=new PoiOverlay(PoiSearchNearByDemo.this, mapView);

overlay.setData(result.getAllPoi());


mapView.getOverlays().add(overlay);

mapView.refresh();


} else {

Toast.makeText(getApplicationContext(), "未查询到结果", 0).show();

}

}

}

}

 

 

/**

 * 全城搜索

 * @author Administrator

 */

public class PoiSearchInCityDemo extends BaseActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

searchInCity();

}

 

private void searchInCity() {

listener = new MyListener();

search.init(manager, listener);

search.poiSearchInCity("北京", "加油站");

}

 

private class MyListener extends BaseSearchListener {

@Override

public void onGetPoiResult(MKPoiResult result, int type, int iError) {

if (result != null && iError == 0) {

// int getNumPages()

// 获取本次poi搜索的总页数

// int getNumPois()

// 获取本次poi搜索的总结果数

// int getPageIndex()

// 返回当前页的索引

int pageIndex = result.getPageIndex();

int numPages = result.getNumPages();

int numPois = result.getNumPois();

String info=""+pageIndex+"页共"+numPages+"页总记录数:"+numPois;

Toast.makeText(getApplicationContext(), info, 1).show();

 

PoiOverlay overlay = new PoiOverlay(PoiSearchInCityDemo.this, mapView);

overlay.setData(result.getAllPoi());

 

mapView.getOverlays().clear();//清除上一页的显示内容

mapView.getOverlays().add(overlay);

mapView.refresh();

} else {

Toast.makeText(getApplicationContext(), "未查询到结果", 0).show();

}

}

}


private int currentPage=0;

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

// 下一页显示

if(keyCode==KeyEvent.KEYCODE_1){

currentPage++;

search.goToPoiPage(currentPage);//获取下一页信息

}

return super.onKeyDown(keyCode, event);

}

}