搜索的核心类:
MKSearch和MKSearchListener
MKSearch:用于位置检索、周边检索、范围检索、公交检索、驾乘检索、
MKSearchListener:查出的结果由MKSearchListener处理
***使用百度地图必须进行的准备工作:
1、初始化:
1)、到百度的服务器端检验KEY
创建initManager()方法进行检验的操作:
①、创建百度地图的管理器对象:
②、对管理器对象进行初始化,调用init方法
init(String strKey, MKGeneralListener listener)
参数:
strKey:申请的授权验证码
listener:注册回调事件——需要在监听中校验key(300)和网络状态(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:指的是poi的id,是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对象,传入的参数为当前的Activity和mapView
*将服务器回复的结果与覆盖物关联在一起;只有这样做了,才能将其展示在地图上
*将覆盖物添加到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:
当获取到结果时,且请求成功(iError为0),进行位置的显示:
@创建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();
②、创建覆盖物,进行显示位置:
当获取到结果时,且请求成功(iError为0),进行位置的显示:
@创建PoiOverlay覆盖物对象:指定参数——上下文,地图控件mapView
@设置参数:将服务器返回数据添加到poi覆盖物中
@添加覆盖物到MapView:注意,在添加覆盖物之前,需要先清除上一页显示的内容
mapView.getOverlays().clear();//清除上一页的显示内容
mapView.getOverlays().add(overlay);
@刷新MapView
4、测试:
通过重写按键按下的动作,进行测试:
通过搜索对象search,获取下一页的信息:search.goToPoiPage(currentPage);//获取下一页信息
Tips:
1、在初始化布局之前,一定要初始化引擎,校验key
2、POI检索结果每页容量默认情况下为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);
}
}