本文主要讲解如何通过百度地图API搜索得到一个城市里的所有POI。这里有必要对“所有”这个词进行强调一下
,以便引起重视
,之所以这样说
,是因为
在搜索POI时,默认仅返回一页的搜索结果10条,那么如何才能得到所有的搜索结果呢?其实baidu map api是提供了相关的方法
,但我发现有相当多的网友都在问这个问题
,所以有必要讲解演示一下。
先讲一下什么称之为“城市POI搜索”
?它与我们在上一篇文章
(
[011] 百度地图API之POI搜索-发现你身边的兴趣点
,如超市、餐厅、ATM...(Android)
)中了解到的POI搜索有什么区别呢
?
上一篇文章中所调用的是地图API的“周边POI搜索”服务,即检索周围多少米以内的POI;而本章所要调用的是地图API的“城市POI搜索”服务,即检索某个城市中所有的POI。如果你看完这两篇文章后,你会发现仅仅是调用的方法不同而以,搜索结果的处理方法是同一个方法,搜索结果的处理代码也是完全一样的。
下面将给出城市POI搜索的一个完整示例
,并且会讲解如何才能获取到所有的搜索结果。
1)布局文件res/layout/poi_city_search.xml
2)继承了com.baidu.mapapi.MapActivity的Activity类
3)AndroidManifest.xml中的配置
4)运行结果
程序运行起来后
,我们输入关键词“ktv”进行搜索
,而在代码中我们设置了搜索城市为“贵阳”
,即我们要搜索贵阳市所有的KTV。搜索完成后
,首先会弹出一个对话框
,如上图所示
,显示了搜索到了POI总数及每一个POI名称
,点击“关闭”按钮后
,可以看到搜索到的ktv所在位置也在地图上进行了标注。
到目前为止,一切看起来很正常。然而,真的是这样吗?请仔细看上面第一张图中显示的搜索结果数为60
,即在贵阳市总共个60家ktv
,但是下面却只显示了10家ktv名称
,并且第二张图中地图中也只标注了10家ktv
,这到底是为什么呢
?其它50家ktv结果去哪了
?原因是这样的
:
一次搜索所得到的POI数有时候可能有成千上万个,比如你搜索“餐厅”试试,试想如果一次性从百度地图服务器上返回上万条搜索结果数据到客户的手机上将会是一种什么样的情况?所以百度地图API对一次性返回的搜索结果进行了限制--一次性最多只能返回50条搜索结果,默认情况下一次性返回10条搜索结果。我们可以通过下面的方法去改变一次性返回的搜索结果数
:
// 设置每页返回的POI数,默认为10,取值范围1-50 MKSearch.setPoiPageCapacity(10);
但最大也只能设置为50。那么怎么才能一次性得到所有的搜索结果呢
?怎么才能得到上面示例中的60家ktv的信息呢
?让我们来改一下上面Activity中处理搜索结果的方法onGetPoiResult
,其实所有代码都保持不变。将onGetPoiResult方法内的处理代码修改为
:
再来看一下运行结果
:
怎么样
?搜索到的60家ktv信息一次性全部显示出来了吧。关键在于下面这3行代码
:
if(result.getPageIndex() < result.getNumPages()-1) { mMKSearch.goToPoiPage(result.getPageIndex() + 1); }
服务器是以分页的形式分多次向我们返回搜索结果的
,result.getPageIndex()得到的是当前页码
(从0开始
)。这3行代码的含义是
:如果当前页不是最后一页
,那么就转到下一页
(goToPoiPage方法是作用是跳转到搜索结果的第几页
)
,
每次调用goToPoiPage方法,都会再次触发搜索请求,也就会再次回调执行onGetPoiResult方法;这和网页中的服务器端分页是一个道理,即每次点击“上一页”、“下一页”都会再一次提交查询请求。这也就是为什么我们要采用static类型的StringBuilder对象来保存搜索结果而不是在onGetPoiResult方法中定义一个局部变量
,并且还要在每次点击“搜索”按钮后
,重新创建一个新的StringBuilder对象来存储搜索结果。
完
!