使用高德地图手机公版sdk也有很长一段时间了,大多数地图或者导航的功能看看api文档和官网的demo都能实现。这里我们来看看能否使用这个公版sdk来实现手机高德地图的搜索功能。手机高德地图poi搜索有两种方式:1、关键字自动提示。2、输入关键字后点击搜索,显示出poi以距离排序的列表展示。
一
首先,我们来看第一种方式。但凡你多浏览了开发文档,不难找到有介绍实现该功能的方法——输入内容自动提示https://lbs.amap.com/api/android-sdk/guide/map-data/poi#keywords
找到官网下载的demo介绍该部分的代码,复制粘贴,运行工程。结果是有了,但与高德地图搜索出的结果差别很大。
下面来看看代码,官网下载的demo,在 AutoCompleteTextView控件TextWatcher监听的onTextChanged方法中完成了实现输入提示步骤的操作
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String newText = s.toString().trim();
InputtipsQuery inputquery = new InputtipsQuery(newText, city);
inputquery.setCityLimit(true);
Inputtips inputTips = new Inputtips(InputtipsActivity.this, inputquery);
inputTips.setInputtipsListener(this);
inputTips.requestInputtipsAsyn();
}
其中很关键的是构造 InputtipsQuery 对象,通过 InputtipsQuery(java.lang.String keyword, java.lang.String city) 设置搜索条件。InputtipsQuery.setCity() 这个方法对获取结果进行严格城市限制,true,城市限制;false,输入文字是权重词汇时,全国搜索。默认为false。什么意思呢,先看看 InputtipsQuery inputquery = new InputtipsQuery(newText, city);第二个参数传入null或者“”代表在全国进行检索,否则按照传入的city进行检索。我们把city传入所定位的城市,此时InputtipsQuery.setCity(true),回调的结果列表就是你所设置的城市里的poi。比如:
InputtipsQuery inputquery = new InputtipsQuery(“北京”, “重庆市”);
InputtipsQuery.setCity(false),
回调结果里得到的poi点位置将限制在重庆市;
但如果:
InputtipsQuery inputquery = new InputtipsQuery(“北京”, “重庆市”);
InputtipsQuery.setCity(false);
虽然InputtipsQuery(newtext,city)里的第二个参数已经设置为重庆市,但此时“北京”算一个权重词汇,就会进行全国搜索,回调结果里得到poi点位置不局限于重庆。
然而这一点并不能满足需求,再浏览一遍api文档,我们会发现InputtipsQuery这个类有个很重要的方法:setLocation(LatLonPoint location),该方法对对获取结果进行经纬度位置限制。加入这行代码,参数传入定位得到的经纬度。此时得到的搜索结果就与高德地图搜索的结果十分相近了。
二
下面介绍第二种搜索方式。我们查看几种poi搜索方式后,很自然的想到用“关键字检索poi”。关键代码如下:
PoiSearch.Query query;// Poi查询条件类
query = new PoiSearch.Query(keyWord, "", "");// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
query.setCityLimit(false);
query.setPageSize(10);// 设置每页最多返回多少条poiitem
query.setPageNum(currentPage);// 设置查第一页
PoiSearch poiSearch; //POI搜索
poiSearch = new PoiSearch(this, query);
poiSearch.setOnPoiSearchListener(this);
poiSearch.searchPOIAsyn();
但用这种检索方式有个问题,当搜索“川菜”、“网吧”这类词汇时,在回调接口 onPoiSearched(PoiResult result, int rCode) 解析返回的结果中,result.getpois()—返回当前页所有POI结果,这个值为0。针对这一种情况,我们加一层判断,当result.getpois()为0时,我们再进行“周边检索poi”:
mQuery = new PoiSearch.Query(searchText, "", mLocationBean.getCity());// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
mQuery.setDistanceSort(true);//设置是否按距离排序
mQuery.setCityLimit(true);
mQuery.setPageSize(30);// 设置每页最多返回多少条poiitem
mQuery.setPageNum(currentPage);// 设置查第一页
mPoiSearch = new PoiSearch(App.getContext(), mQuery);
mPoiSearch.setOnPoiSearchListener(listener);
mPoiSearch.setBound(new PoiSearch.SearchBound(new LatLonPoint(mLocationBean.getLatitude(),mLocationBean.getLongitude()), 5000, true));
mPoiSearch.searchPOIAsyn();
这样就基本满足产品经理的需求了