POI检索, 根据地址输入提示检索 Sug
参考百度地图官方文档:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/search/suggestion
地点检索输入提示服务(也被称为POI热词建议检索、在线建议检索、Suggestion POI search),简称Sug检索,是指根据关键词查询在线建议词。为了帮助开发者实现检索出来的关键词快速定位到地图上,SDK开放了检索结果的经纬度信息及对应POI点的UID信息。
Sug检索与POI检索的区别
使用场景的不同
- Sug检索是根据部分关键字检索出可能的完整关键字名称,即关键字匹配。
- POI检索是根据关键字检索符合的POI具体信息。
Sug检索结果的第一条可能存在没有经纬度信息的情况,该条结果为文字联想出来的关键词结果,并不对应任何确切POI点。
例如输入“肯”,第一条结果为“肯德基”,这条结果是一个泛指的名称,不会带有经纬度等信息。
建议Sug检索与POI检索配合使用,如:在用户输入关键字时触发Sug检索获取热词,以符合期望的热词为关键字发起POI检索。
Sug检索步骤
关键关键点,Activity要implements View.OnClickListener, OnGetSuggestionResultListener 就是要继承这两个接口
步骤一 创建Sug检索实例
这句代码必不可少
mSuggestionSearch = SuggestionSearch.newInstance();
建议在一个函数中写,然后在onCreate中调用。 以保持代码的整洁,方便后期维护。
首先添加如下变量,在onCreate之前定义
//POI搜索
private SuggestionSearch mSuggestionSearch = null;
// 搜索关键字输入窗口
private EditText mEditCity = null;
private AutoCompleteTextView mKeyWordsView = null;
private ListView mSugListView;
在定义一个方法来创建Sug检索实例
//开始POI搜索,此下位POI搜索方法
//POI
private void PoiSugSearch(){
// 初始化建议搜索模块,注册建议搜索事件监听
mSuggestionSearch = SuggestionSearch.newInstance();
mSuggestionSearch.setOnGetSuggestionResultListener(this);
}
步骤二 创建Sug检索监听器
核心代码为:
OnGetSuggestionResultListener listener = new OnGetSuggestionResultListener() {
@Override
public void onGetSuggestionResult(SuggestionResult suggestionResult) {
//处理sug检索结果
}
};
参考百度地图官方Demo,添加以下代码,作为一个方法引入:
/**
* 获取在线建议搜索结果,得到requestSuggestion返回的搜索结果
*
* @param suggestionResult Sug检索结果
*/
@Override
public void onGetSuggestionResult(SuggestionResult suggestionResult) {
if (suggestionResult == null || suggestionResult.getAllSuggestions() == null) {
return;
}
List<HashMap<String, String>> suggest = new ArrayList<>();
for (SuggestionResult.SuggestionInfo info : suggestionResult.getAllSuggestions()) {
if (info.getKey() != null && info.getDistrict() != null && info.getCity() != null) {
HashMap<String, String> map = new HashMap<>();
map.put("key",info.getKey());
map.put("city",info.getCity());
map.put("dis",info.getDistrict());
suggest.add(map);
}
}
SimpleAdapter simpleAdapter = new SimpleAdapter(getApplicationContext(),
suggest,
R.layout.item_layout,
new String[]{"key", "city","dis"},
new int[]{R.id.sug_key, R.id.sug_city, R.id.sug_dis});
mSugListView.setAdapter(simpleAdapter);
simpleAdapter.notifyDataSetChanged();
}
此时会有item_layout报错。需要手动引入。如果有下载官方Demo可以直接在Demo中查找。也可以通过我分享的百度云链接直接下载。
链接:https://pan.baidu.com/s/1k4jV-LnixLQ7OhQ3HRkdAA
提取码:yjpj
下载完后打开
将item_layout复制到项目的layout目录下
可见加入后还有几个dimen报错,这是因为在dimen中还没更新,此时打开之前下载的资源包,打开values文件夹,将里面的dimens.xml复制到项目的values目录下,会自动把新的添加。
也可以直接复制下面的粘贴。
<resources>
<dimen name="activity_horizontal_margin">16dp</dimen>
<dimen name="activity_vertical_margin">16dp</dimen>
<dimen name="custom_profile_image">50dp</dimen>
<dimen name="custom_profile_padding">2dp</dimen>
<dimen name="margin">8dp</dimen>
<dimen name="poi_title_size">14sp</dimen>
<dimen name="ui_size">12sp</dimen>
<dimen name="actionbar_size">35sp</dimen>
</resources>
步骤三 设置SuggestionSearchOption对象,发起检索
直接添加以下代码,以一个方法的形式引入
private void request(){
// 当输入关键字变化时,动态更新建议列表
mKeyWordsView.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable arg0) {
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
if (cs.length() <= 0) {
return;
}
// 使用建议搜索服务获取建议列表,结果在onSuggestionResult()中更新
mSuggestionSearch.requestSuggestion((new SuggestionSearchOption())
.keyword(cs.toString()) // 关键字
.city(mEditCity.getText().toString())); // 城市
}
});
}
记得在onCreate中调用request()方法
步骤四 初始化View,以及修改布局文件
初始化View,代码如下,直接复制粘贴,然后在onCreate中调用方法。
private void initView(){
// 初始化view
//mEditCity = (EditText) findViewById(R.id.city);
mSugListView = (ListView) findViewById(R.id.sug_list);
mKeyWordsView = (AutoCompleteTextView) findViewById(R.id.editText);
mKeyWordsView.setThreshold(1);
}
此处的id city sug_list editText 分别是城市,用于展示关键词搜索到的listView展示页面,地址输入框的id,可以根据自己的实际需求修改。
修改布局文件,添加以下布局
<ListView
android:id="@+id/sug_list"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<AutoCompleteTextView
android:id="@+id/editText"
android:layout_width="@dimen/activity_main_editext_width"
android:layout_height="wrap_content"
android:layout_weight="6"
android:ems="10"
android:inputType="textPersonName"
android:text="@string/main_editext_name"
android:layout_marginLeft="@dimen/activity_main_editext__marleft"/>
到这里基本就完成了,个别有错误的自己修改,仔细检查后一般没有问题,可以根据自己需要修改一些地方。运行调试。输入时结果如下:
最后附上onCreate中的方法。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
SDKInitializer.setCoordType(CoordType.BD09LL);
//没有这个HTTP申请无法实现路线规划
SDKInitializer.setHttpsEnable(true);
/* 设置定位代码 */
this.context = this;
//获取百度地图控件
mMapView = (MapView) findViewById(R.id.bmapView);
//获取地图控件对象
mBaiduMap = mMapView.getMap();
initMyLocation(); //定位方法
/* 设置定位代码 */
//设置地图默认定位位置,地图中心位target的经纬度
MapStatusUpdate mapStatusUpdate= MapStatusUpdateFactory.newLatLng(target);
mBaiduMap.setMapStatus(mapStatusUpdate);
//设置地图缩放比例为15
mapStatusUpdate = MapStatusUpdateFactory.zoomTo(18);
mBaiduMap.setMapStatus(mapStatusUpdate);
//路线规划方法
initRoutePlan();
//POI关键词检索的方法调用
PoiSugSearch();
initView();
request();
button();
}
一些可以自定义的点
- item_layout.xml
这个布局文件可以根据的需要修改,调试发现这个item布局文件就是前面listView中调用来展示关键词检索地点的,所以可以自己修改设计