1. 程式人生 > >高德地圖——關鍵字檢索POI

高德地圖——關鍵字檢索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效果圖: