实现类似手机高德地图的poi搜索功能

使用高德地图手机公版sdk也有很长一段时间了,大多数地图或者导航的功能看看api文档和官网的demo都能实现。这里我们来看看能否使用这个公版sdk来实现手机高德地图的搜索功能。手机高德地图poi搜索有两种方式:1、关键字自动提示。2、输入关键字后点击搜索,显示出poi以距离排序的列表展示。

首先,我们来看第一种方式。但凡你多浏览了开发文档,不难找到有介绍实现该功能的方法——输入内容自动提示https://lbs.amap.com/api/android-sdk/guide/map-data/poi#keywords
找到官网下载的demo介绍该部分的代码,复制粘贴,运行工程。结果是有了,但与高德地图搜索出的结果差别很大。
高德地图输入“加油”的结果列表
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();

在这里插入图片描述![在这里插入图片描述](https://img-blog.csdnimg.cn/2019012809232877.gif
在这里插入图片描述
这样就基本满足产品经理的需求了

猜你喜欢

转载自blog.csdn.net/tangpunang5844/article/details/86623334