百度地圖進階【POI資料檢索】,地圖進階poi檢索
前面學習百度地圖的一些基本的用法,這次我們一起來看一看百度地圖的檢索功能吧
poi檢索api的基本用法
百度地圖的POI類中共有如下幾個方法
| PoiBoundSearchOption |
POI範圍內檢索參數 |
| PoiCitySearchOption |
poi城市內檢索參數 |
| PoiDetailResult |
詳情檢索結果 |
| PoiDetailSearchOption |
poi 詳情檢索參數 |
| PoiNearbySearchOption |
附近檢索參數 |
| PoiResult |
poi搜尋結果。 |
| PoiSearch |
POI檢索介面 |
我們現在先看下PoiSearch中的內容
void |
destroy()釋放檢索對象 |
static PoiSearch |
newInstance()建立PoiSearch執行個體 |
boolean |
searchInBound(PoiBoundSearchOption option)範圍內檢索 |
boolean |
searchInCity(PoiCitySearchOption option)城市內檢索 |
boolean |
searchNearby(PoiNearbySearchOption option)周邊檢索 |
boolean |
searchPoiDetail(PoiDetailSearchOption option)POI 詳情檢索 |
void |
setOnGetPoiSearchResultListener(OnGetPoiSearchResultListener listener)設定poi檢索監聽者 |
從api中我們不難看出,百度的poi檢索主要有範圍檢索(指定座標範圍)、城市檢索(指定某一城市)周邊檢索(根據自身位置周邊)和poi詳情檢索
2.指定座標範圍搜尋無論是什麼搜尋基本步驟都是不變的
<span style="color:#ff6666;"> // 第一步,建立POI檢索執行個體</span> poiSearch = PoiSearch.newInstance();
<span style="color:#ff6666;"> // 第二步,建立POI檢索監聽者;</span> OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener() { public void onGetPoiResult(PoiResult result) { // 擷取POI檢索結果 if (result == null || result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) { Toast.makeText(POISearchMapActivity.this, "未找到結果", Toast.LENGTH_LONG).show(); return; } if (result.error == SearchResult.ERRORNO.NO_ERROR) { List<PoiInfo> allPoi = result.getAllPoi(); totalpages = result.getTotalPageNum(); String[] datas = new String[10]; for (int i = 0; i < 10; i++) { datas[i] = allPoi.get(i).name; } adapter = new ArrayAdapter<String>(POISearchMapActivity.this, android.R.layout.simple_list_item_1, datas); listView.setAdapter(adapter); return; } if (result.error == SearchResult.ERRORNO.AMBIGUOUS_KEYWORD) { // 當輸入關鍵字在本市沒有找到,但在其他城市找到時,返回包含該關鍵字資訊的城市列表 String strInfo = "在"; for (CityInfo cityInfo : result.getSuggestCityList()) { strInfo += cityInfo.city; strInfo += ","; } strInfo += "找到結果"; Toast.makeText(POISearchMapActivity.this, strInfo, Toast.LENGTH_LONG).show(); } } public void onGetPoiDetailResult(PoiDetailResult result) { // 擷取Place詳情頁檢索結果 } };
<span style="color:#ff6666;">// 第三步,設定POI檢索監聽者;</span> poiSearch.setOnGetPoiSearchResultListener(poiListener);
// 這是範圍 LatLngBounds.Builder b = new LatLngBounds.Builder(); b.include(new LatLng(39.976446, 116.320331)); b.include(new LatLng(39.900766, 116.32838)); b.include(new LatLng(39.910065, 116.491081)); b.include(new LatLng(39.976004, 116.475558)); LatLngBounds build = b.build();<pre name="code" class="java">獲得LatLngBounds
// 第四步,發起檢索請求; poiSearch.searchInBound(new PoiBoundSearchOption().bound(build).keyword("美食").pageNum(currentPage));
下面使用一個簡單的例子來進行說明xml檔案裡面只有一個簡單的listview
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".IndexActivity" > <ListView android:id="@+id/mylistView" android:layout_width="wrap_content" android:layout_height="wrap_content" /></RelativeLayout>
在activity中實現對資料的擷取和展示工作,在例子中為了方便示範,監聽了onKeyDown方法,修改了meun按鍵的相應操作,修改為按下menu鍵顯示資料再次點擊顯示下頁資料。這裡僅展示“美食”搜尋結果僅展示“美食名”。
package com.flyou.hellomap;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.view.KeyEvent;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.Toast;import com.baidu.mapapi.SDKInitializer;import com.baidu.mapapi.model.LatLng;import com.baidu.mapapi.model.LatLngBounds;import com.baidu.mapapi.search.core.CityInfo;import com.baidu.mapapi.search.core.PoiInfo;import com.baidu.mapapi.search.core.SearchResult;import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;import com.baidu.mapapi.search.poi.PoiBoundSearchOption;import com.baidu.mapapi.search.poi.PoiDetailResult;import com.baidu.mapapi.search.poi.PoiResult;import com.baidu.mapapi.search.poi.PoiSearch;public class POISearchMapActivity extends Activity { private int totalpages = 0; private ListView listView = null; private PoiSearch poiSearch; private int currentPage = 0; ArrayAdapter<String> adapter = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 在使用SDK各組件之前初始化context資訊,傳入ApplicationContext // 注意該方法要再setContentView方法之前實現 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_index); listView = (ListView) findViewById(R.id.mylistView); // 第一步,建立POI檢索執行個體 poiSearch = PoiSearch.newInstance(); // 第三步,設定POI檢索監聽者; poiSearch.setOnGetPoiSearchResultListener(poiListener); } // 第二步,建立POI檢索監聽者; OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener() { public void onGetPoiResult(PoiResult result) { // 擷取POI檢索結果 if (result == null || result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) { Toast.makeText(POISearchMapActivity.this, "未找到結果", Toast.LENGTH_LONG).show(); return; } if (result.error == SearchResult.ERRORNO.NO_ERROR) { List<PoiInfo> allPoi = result.getAllPoi(); totalpages = result.getTotalPageNum(); String[] datas = new String[10]; for (int i = 0; i < 10; i++) { datas[i] = allPoi.get(i).name; } Toast.makeText(POISearchMapActivity.this, "當前第"+currentPage+"頁,共"+result.getTotalPageNum()+"頁", 0).show(); adapter = new ArrayAdapter<String>(POISearchMapActivity.this, android.R.layout.simple_list_item_1, datas); listView.setAdapter(adapter); return; } if (result.error == SearchResult.ERRORNO.AMBIGUOUS_KEYWORD) { // 當輸入關鍵字在本市沒有找到,但在其他城市找到時,返回包含該關鍵字資訊的城市列表 String strInfo = "在"; for (CityInfo cityInfo : result.getSuggestCityList()) { strInfo += cityInfo.city; strInfo += ","; } strInfo += "找到結果"; Toast.makeText(POISearchMapActivity.this, strInfo, Toast.LENGTH_LONG).show(); } } public void onGetPoiDetailResult(PoiDetailResult result) { // 擷取Place詳情頁檢索結果 } }; @Override protected void onDestroy() { super.onDestroy(); // 在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理 poiSearch.destroy(); } @Override protected void onResume() { super.onResume(); // 在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理 } @Override protected void onPause() { super.onPause(); // 在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理 } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_MENU: // 這是範圍 LatLngBounds.Builder b = new LatLngBounds.Builder(); b.include(new LatLng(39.976446, 116.320331)); b.include(new LatLng(39.900766, 116.32838)); b.include(new LatLng(39.910065, 116.491081)); b.include(new LatLng(39.976004, 116.475558)); LatLngBounds build = b.build(); // 第四步,發起檢索請求; poiSearch.searchInBound(new PoiBoundSearchOption().bound(build).keyword("美食").pageNum(currentPage)); // poiSearch.searchInCity((new // PoiCitySearchOption()).city("開封").keyword("美食").pageNum(currentPage)); currentPage++; if (currentPage == totalpages) { currentPage = 0; } break; } return super.onKeyDown(keyCode, event); }}
3.城市搜尋核心代碼
poiSearch.searchInCity((new PoiCitySearchOption()).city("開封").keyword("美食").pageNum(currentPage));
4.周邊搜尋
PoiNearbySearchOption |
keyword(java.lang.String key)檢索關鍵字 |
PoiNearbySearchOption |
location(LatLng location)檢索位置 |
PoiNearbySearchOption |
pageCapacity(int pageCapacity)設定每頁容量,預設為每頁10條 |
PoiNearbySearchOption |
pageNum(int pageNum)分頁編號 |
PoiNearbySearchOption |
radius(int radius)設定檢索的半徑範圍----------單位為米 |
poiSearch.searchNearby(new PoiNearbySearchOption() .keyword("大學") .location(new LatLng(34.82336,114.31496)) .radius(3000) );//可以為定位的座標也可自己制定