高德地图——关键字检索POI

如何你想集成高德地图SDK:跳转这儿

如何你想获取定位信息:跳转这儿

下面我们介绍下:根据关键字检索适用于在某个城市搜索某个名称相关的POI

即类似于 朋友圈获取附近位置功能

先看下效果图:

下面介绍怎么实现此功能:

类需要继承 OnPoiSearchListener 监听

public class SearchActivity extends AppCompatActivity implements PoiSearch.OnPoiSearchListener{}

开启权限 :

 //设置定位权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_PERMISSION_LOCATION);

        } else {
            //监听EditText输入
            initListener();
        }

 构造 PoiSearch.Query 对象,通过 PoiSearch.Query(String query, String ctgr, String city) 设置搜索条件,构造 PoiSearch 对象,并设置监听,调用 PoiSearch 的 searchPOIAsyn() 方法发送请求。

注意:

PoiSearch.Query(String query, String ctgr, String city)第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)

1、关键字未设置城市信息(默认为全国搜索)时,如果涉及多个城市数据返回,仅会返回建议城市,请根据APP需求,选取城市进行搜索。

2、不设置POI的类别,默认返回“餐饮服务”、“商务住宅”、“生活服务”这三种类别的POI,下方提供了POI分类码表,请按照列表内容设置希望检索的POI类型。(建议使用POI类型的代码进行检索)

  /**
     * 开始进行poi搜索
     */
    protected void doSearchQuery(String key) {
        currentPage = 0;
        //不输入城市名称有些地方搜索不到
        // 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
        query = new PoiSearch.Query(key, "", "");
        // 设置每页最多返回多少条poiitem
        query.setPageSize(10);
        // 设置查询页码
        query.setPageNum(currentPage);

        //构造 PoiSearch 对象,并设置监听
        poiSearch = new PoiSearch(this, query);
        poiSearch.setOnPoiSearchListener(this);
        //调用 PoiSearch 的 searchPOIAsyn() 方法发送请求。
        poiSearch.searchPOIAsyn();
    }

通过回调接口 onPoiSearched 解析返回的结果

 /**
     * POI信息查询回调方法
     */
    @Override
    public void onPoiSearched(PoiResult result, int rCode) {
        //rCode 为1000 时成功,其他为失败
        if (rCode == AMapException.CODE_AMAP_SUCCESS) {
            // 解析result   获取搜索poi的结果
            if (result != null && result.getQuery() != null) {
                if (result.getQuery().equals(query)) {  // 是否是同一条
                    poiResult = result;
                    ArrayList<LocationAddressInfo> data = new ArrayList<LocationAddressInfo>();//自己创建的数据集合
                    // 取得第一页的poiitem数据,页数从数字0开始
                    //poiResult.getPois()可以获取到PoiItem列表
                    List<PoiItem> poiItems = poiResult.getPois();

                    //若当前城市查询不到所需POI信息,可以通过result.getSearchSuggestionCitys()获取当前Poi搜索的建议城市
                    List<SuggestionCity> suggestionCities = poiResult.getSearchSuggestionCitys();
                    //如果搜索关键字明显为误输入,则可通过result.getSearchSuggestionKeywords()方法得到搜索关键词建议。
                    List<String> suggestionKeywords =  poiResult.getSearchSuggestionKeywords();

                    //解析获取到的PoiItem列表
                    for(PoiItem item : poiItems){
                        //获取经纬度对象
                        LatLonPoint llp = item.getLatLonPoint();
                        double lon = llp.getLongitude();
                        double lat = llp.getLatitude();
                        //返回POI的名称
                        String title = item.getTitle();
                        //返回POI的地址
                        String text = item.getSnippet();
                        data.add(new LocationAddressInfo(String.valueOf(lon), String.valueOf(lat), title, text));
                    }
                    listAdapter = new LocationListAdapter(this, data);
                    listView.setAdapter(listAdapter);
                }
            } else {
                Toast.makeText(SearchActivity.this,"无搜索结果",Toast.LENGTH_SHORT).show();
            }
        } else {
            Toast.makeText(SearchActivity.this,"错误码"+rCode,Toast.LENGTH_SHORT).show();
        }

    }

 下面附上 PoiItem类 方法: 跳转这儿查看详细方法说明

 
限定符和类型 方法和说明
boolean equals(java.lang.Object obj)

比较两个POI 的id 是否相等。

java.lang.String getAdCode()

返回POI 的行政区划代码。

java.lang.String getAdName()

返回POI 的行政区划名称。

java.lang.String getBusinessArea()

返回POI的所在商圈。

java.lang.String getCityCode()

返回POI的城市编码

java.lang.String getCityName()

返回POI的城市名称。

java.lang.String getDirection()

返回逆地理编码查询时POI坐标点相对于地理坐标点的方向。

int getDistance()

获取 POI 距离中心点的距离。

java.lang.String getEmail()

返回POI的电子邮件地址。

LatLonPoint getEnter()

返回POI入口经纬度。

LatLonPoint getExit()

返回POI出口经纬度。

IndoorData getIndoorData()

返回POI的室内信息,如楼层、建筑物。

LatLonPoint getLatLonPoint()

返回POI的经纬度坐标
如果使用该POI进行导航时,可以检查POI是否有PoiItem.getExit() 和 PoiItem.getEnter(),如果有建议使用它们作为导航的起终点。

java.lang.String getParkingType()

返回POI的停车场类型

java.util.List<Photo> getPhotos()

返回POI的图片信息。

PoiItemExtension getPoiExtension()

返回POI的扩展信息。

java.lang.String getPoiId()

返回POI 的id,即其唯一标识。

java.lang.String getPostcode()

返回POI的邮编。

java.lang.String getProvinceCode()

返回 POI 的省/自治区/直辖市/特别行政区编码。

java.lang.String getProvinceName()

返回POI的省/自治区/直辖市/特别行政区名称 。

java.lang.String getSnippet()

返回POI的地址。

java.util.List<SubPoiItem> getSubPois()

子POI信息获取。

java.lang.String getTel()

返回POI的电话号码。

java.lang.String getTitle()

返回POI的名称。

java.lang.String getTypeCode()

返回兴趣点类型编码。

java.lang.String getTypeDes()

返回POI 的类型描述。

java.lang.String getWebsite()

返回POI的网址。

int hashCode()

继承自Object,直接返回POI id 的hashcode。

boolean isIndoorMap()

返回是否支持室内地图 。

java.lang.String toString()

继承自Object,返回POI 的名称(name)。

下面附上完整代码如下:


import android.Manifest;
import android.annotation.TargetApi;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
import android.widget.Toast;

import com.amap.api.services.core.AMapException;
import com.amap.api.services.core.LatLonPoint;
import com.amap.api.services.core.PoiItem;
import com.amap.api.services.core.SuggestionCity;
import com.amap.api.services.poisearch.PoiResult;
import com.amap.api.services.poisearch.PoiSearch;

import java.util.ArrayList;
import java.util.List;

public class SearchActivity extends AppCompatActivity implements PoiSearch.OnPoiSearchListener{
    private EditText mEt_keyword;
    private RecyclerView listView;

    private static final int REQUEST_PERMISSION_LOCATION = 0;
    private String keyWord = "";// 要输入的poi搜索关键字
    private PoiResult poiResult; // poi返回的结果
    private int currentPage = 0;// 当前页面,从0开始计数
    private PoiSearch.Query query;// Poi查询条件类
    private PoiSearch       poiSearch;// POI搜索

    private List<LocationAddressInfo> mData = new ArrayList<>();
    private LocationListAdapter listAdapter;


    @TargetApi(Build.VERSION_CODES.M)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_search);
        mEt_keyword = (EditText) findViewById(R.id.et_keyword);

        listView = (RecyclerView) findViewById(R.id.irc_listview);
        listView.setLayoutManager(new LinearLayoutManager(this));

        //设置定位权限
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_PERMISSION_LOCATION);

        } else {
            //监听EditText输入
            initListener();
        }

    }


    private void initListener() {
        mEt_keyword.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                keyWord = String.valueOf(charSequence);
                if ("".equals(keyWord)) {
                    Toast.makeText(SearchActivity.this,"请输入搜索关键字",Toast.LENGTH_SHORT).show();
                    return;
                } else {
                    doSearchQuery(keyWord);
                }
            }

            @Override
            public void afterTextChanged(Editable editable) {

            }
        });
    }

    /**
     * 开始进行poi搜索
     */
    protected void doSearchQuery(String key) {
        currentPage = 0;
        //不输入城市名称有些地方搜索不到
        // 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
        query = new PoiSearch.Query(key, "", "");
        // 设置每页最多返回多少条poiitem
        query.setPageSize(10);
        // 设置查询页码
        query.setPageNum(currentPage);

        //构造 PoiSearch 对象,并设置监听
        poiSearch = new PoiSearch(this, query);
        poiSearch.setOnPoiSearchListener(this);
        //调用 PoiSearch 的 searchPOIAsyn() 方法发送请求。
        poiSearch.searchPOIAsyn();
    }

    /**
     * POI信息查询回调方法
     */
    @Override
    public void onPoiSearched(PoiResult result, int rCode) {
        //rCode 为1000 时成功,其他为失败
        if (rCode == AMapException.CODE_AMAP_SUCCESS) {
            // 解析result   获取搜索poi的结果
            if (result != null && result.getQuery() != null) {
                if (result.getQuery().equals(query)) {  // 是否是同一条
                    poiResult = result;
                    ArrayList<LocationAddressInfo> data = new ArrayList<LocationAddressInfo>();//自己创建的数据集合
                    // 取得第一页的poiitem数据,页数从数字0开始
                    //poiResult.getPois()可以获取到PoiItem列表
                    List<PoiItem> poiItems = poiResult.getPois();

                    //若当前城市查询不到所需POI信息,可以通过result.getSearchSuggestionCitys()获取当前Poi搜索的建议城市
                    List<SuggestionCity> suggestionCities = poiResult.getSearchSuggestionCitys();
                    //如果搜索关键字明显为误输入,则可通过result.getSearchSuggestionKeywords()方法得到搜索关键词建议。
                    List<String> suggestionKeywords =  poiResult.getSearchSuggestionKeywords();

                    //解析获取到的PoiItem列表
                    for(PoiItem item : poiItems){
                        //获取经纬度对象
                        LatLonPoint llp = item.getLatLonPoint();
                        double lon = llp.getLongitude();
                        double lat = llp.getLatitude();
                        //返回POI的名称
                        String title = item.getTitle();
                        //返回POI的地址
                        String text = item.getSnippet();
                        data.add(new LocationAddressInfo(String.valueOf(lon), String.valueOf(lat), title, text));
                    }
                    listAdapter = new LocationListAdapter(this, data);
                    listView.setAdapter(listAdapter);
                }
            } else {
                Toast.makeText(SearchActivity.this,"无搜索结果",Toast.LENGTH_SHORT).show();
            }
        } else {
            Toast.makeText(SearchActivity.this,"错误码"+rCode,Toast.LENGTH_SHORT).show();
        }

    }
    /**
     * POI信息查询回调方法
     */
    @Override
    public void onPoiItemSearched(PoiItem item, int rCode) {

    }
}

详细 获取POI数据 sdk介绍请看 高德开发指南:https://lbs.amap.com/api/android-sdk/guide/map-data/poi/?sug_index=2

demo下载链接:https://download.csdn.net/download/shanshan_1117/10679670

demo效果图:

猜你喜欢

转载自blog.csdn.net/shanshan_1117/article/details/82791014
今日推荐