Android studio百度地图SDK开发 2020最新超详细的Android 百度地图开发讲解(6) POI检索, 根据地址输入提示检索 Sug

POI检索, 根据地址输入提示检索 Sug

参考百度地图官方文档:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/search/suggestion
地点检索输入提示服务(也被称为POI热词建议检索、在线建议检索、Suggestion POI search),简称Sug检索,是指根据关键词查询在线建议词。为了帮助开发者实现检索出来的关键词快速定位到地图上,SDK开放了检索结果的经纬度信息及对应POI点的UID信息。

Sug检索与POI检索的区别

使用场景的不同

  1. Sug检索是根据部分关键字检索出可能的完整关键字名称,即关键字匹配。
  2. 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

下载完后打开
POI资源包
将item_layout复制到项目的layout目录下
加入布局文件
可见加入后还有几个dimen报错,这是因为在dimen中还没更新,此时打开之前下载的资源包,打开values文件夹,将里面的dimens.xml复制到项目的values目录下,会自动把新的添加。
dimens
s
也可以直接复制下面的粘贴。

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

一些可以自定义的点

  1. item_layout.xml
    布局文件
    这个布局文件可以根据的需要修改,调试发现这个item布局文件就是前面listView中调用来展示关键词检索地点的,所以可以自己修改设计
发布了128 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Ace_bb/article/details/104476469