百度地图搜索(2)

搜索的核心类:

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);

}

}

时间: 2024-10-02 00:11:19

百度地图搜索(2)的相关文章

【百度地图API】交你如何用百度地图搜索自己的数据!不需数据库!

原文:[百度地图API]交你如何用百度地图搜索自己的数据!不需数据库! 摘要: 我有一定的房产数据,还有银行数据.我想在百度地图上标注出来,并且能搜索到我这些数据. 可是百度的数据库上并没有我的数据.我应该怎么办呢? ------------------------------------------------------------------------------------------ 一.无需数据库,如何建立自己的地理信息表. 如果让初学者去建立数据库,那么意味着大家还要学习数据库,

js调用百度地图搜索功能

引用百度jsApi <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=xxxxxxxxxxxx"></script> 创建地址解析器: var localSearch = null; //查询参数 var options = { //智能搜索 onSearchComplete: function (results) { //查询结果状态码

百度地图搜索地点导航

<html><head>    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />    <style type="text/cs

Axure RP 7.0移动APP原型设计实战精讲视频课程

经过了漫长的教案设计+录课的过程,与初次开通在线教育课程的诸多需要尝试的点,我在51CTO学院的第一门课程终于在6月下旬与各位小伙伴们见面啦:)      欢迎小伙伴们捧场,想要深入学习的可以作为付费用户,暂时不想学习Axure RP的小伙伴们去拍砖增加点人气,不胜感激!      付费特权:24小时讲师答疑   所有课时永久观看   专属资料下载    购买课程返学分 本套课程由阿蜜果倾力为您打造,不忽视理论,但更重实战!!! 通过简明扼要的语言,讲解Axure RP 7.0的理论知识. 通过

汽车票O2O战役打响,谁最有可能成为大赢家?

从打车.专车.拼车到代驾,出行O2O早已成为了巨头们争夺的焦点.国庆长假前夕,手机百度参战到在线汽车票市场并推出了“百度快行”,再次引发了一场新的出行O2O大战.来自交通运输部的统计数据显示,2013年我国公路出行人次占到了总出行人次的86.37%,2014年公路出行人次占总出行人次比例为87.32%,而长途客运作为公路出行非常重要的一部分,将会成为出行O2O平台竞争的战略要点.纵观当前国内的汽车票市场,着实让广大客运朋友不太满意,刘旷认为主要是以下原因造成: 1.首先第一个让客运朋友不满意的地

Alfred的配置和使用

http://www.jianshu.com/p/f77ad047f7b0 Alfred:mac上的神兵利器,提升工作效率*n,快捷键:option + 空格.鉴于是看了池老师的<人生元编程>才全面使用Alfred,所以先标出池老师的博客:http://macshuo.com/ ,这个更精彩; 下面开始是我的使用心得 代替spotlight 程序的快速启动入口 强大的workflow 文件检索 find *** : 定位文件open *** : 定位并且打开文件in *** : 在文件中检索.

百度地图商家数据(联系方式、具体位置)采集方法

随着营销和商业化的需要,尤其是O2O领域,寻找电销的目标客户都是需要准备的工作,那么如何能快速找到联系方式?百度地图可能是目前已知数据最全,最大的数据中心.这里几乎包含了各行各业的数据商家数据,如医院.银行.KTV.美发等等各种数据. 百度数据采集攻略: 第一步:在百度地图搜索一下看看能不能搜出来.[改部分可略] 第二步:通过goodsbye,提供采集服务.goodsbye可以根据关键词,城市,为用户免费采集.goodsbye的官网:http://www.goodsbye.com     goo

移动平台化进程加速 网秦如何实现战略转型?

在互联网产业,平台化是一个非常重要的话题,因为平台化有助于企业规模的迅速扩大,实现用户体验和用户粘度的提升,因此,实施这种战略的企业一般都能获得比竞争对手更好的发展.从过去的案例来看,依靠平台化战略获胜的企业有很多,BAT就是典型,而在BAT的影响下,未来也必然会有更多的企业推行平台化战略. BAT平台化战略的启示 BAT的平台化战略表现在不同的层面,比如百度的平台化战略主要依靠网络搜索而开展,腾讯的平台化战略主要依靠即时通讯而开展,阿里的平台化战略主要依靠电子商务而开展.虽然业务不同,但基本思

Arcgis for Javascript API下类似于百度搜索A、B、C、D marker的实现方式

原文:Arcgis for Javascript API下类似于百度搜索A.B.C.D marker的实现方式 多说无益,首先贴两张图让大家看看具体的效果: 图1.百度地图搜索结果 图2.Arcgis for JavaScript实现的效果 看到了效果,是不是各位有点小鸡动,是不是也宠宠欲动,有木有?但是具体是怎么实现的呢?下面我来详细的给各位说说我的实现思路吧. 第一,数据. 其实搜索的对象从类型上来说,应该是点.线.面都支持的,但是在实际的操作过程中,不论是百度还是我自己做的时候,都会将所有