Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android系統教程 >> Android開發教程 >> Android中使用百度地圖API:城市POI搜索-獲取所有結果

Android中使用百度地圖API:城市POI搜索-獲取所有結果

編輯:Android開發教程

本文主要講解如何通過百度地圖API搜索得到一個城市裡的所有POI。這裡有必要對“所有”這個詞進行強 調一下,以便引起重視,之所以這樣說,是因為在搜索POI時,默認僅返回一頁的搜索結果10條,那麼如何才 能得到所有的搜索結果呢?其實baidu map api是提供了相關的方法,但我發現有相當多的網友都在問這個問 題,所以有必要講解演示一下。

先講一下什麼稱之為“城市POI搜索”?它與我們在上一篇文章([011] 百 度地圖API之POI搜索-發現你身邊的興趣點,如超市、餐廳、ATM...(Android))中了解到的POI搜索有什麼區 別呢?

上一篇文章中所調用的是地圖API的“周邊POI搜索”服務,即檢索周圍多少米以內的POI;而本章所 要調用的是地圖API的“城市POI搜索”服務,即檢索某個城市中所有的POI。如果你看完這兩篇文章後,你會 發現僅僅是調用的方法不同而以,搜索結果的處理方法是同一個方法,搜索結果的處理代碼也是完全一樣的。

下面將給出城市POI搜索的一個完整示例,並且會講解如何才能獲取到所有的搜索結果。

1)布局文件 res/layout/poi_city_search.xml

<?xml version="1.0" encoding="utf-8"?>  
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >  
    <com.baidu.mapapi.MapView android:id="@+id/map_View"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true"
    />  
    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignTop="@id/map_View"
        android:layout_alignLeft="@id/map_View"
        android:layout_alignRight="@id/map_View"
        android:background="@null"
        android:padding="0dip"
        >  
        <EditText android:id="@+id/keyword_edittext"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_weight="20" />  
        <Button android:id="@+id/query_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_weight="1"
            android:text="搜索" />  
    </LinearLayout>  
</RelativeLayout>

2)繼承了com.baidu.mapapi.MapActivity的Activity類

package com.liufeng.baidumap;  
      
import android.app.AlertDialog;  
import android.content.DialogInterface;  
import android.os.Bundle;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.widget.Button;  
import android.widget.EditText;  
      
import com.baidu.mapapi.BMapManager;  
import com.baidu.mapapi.MKAddrInfo;  
import com.baidu.mapapi.MKDrivingRouteResult;  
import com.baidu.mapapi.MKPoiInfo;  
import com.baidu.mapapi.MKPoiResult;  
import com.baidu.mapapi.MKSearch;  
import com.baidu.mapapi.MKSearchListener;  
import com.baidu.mapapi.MKTransitRouteResult;  
import com.baidu.mapapi.MKWalkingRouteResult;  
import com.baidu.mapapi.MapActivity;  
import com.baidu.mapapi.MapController;  
import com.baidu.mapapi.MapView;  
import com.baidu.mapapi.PoiOverlay;  
      
public class PoiSearchInCityActivity extends MapActivity {  
    // 定義地圖引擎管理類  
    private BMapManager mapManager;  
    // 定義搜索服務類  
    private MKSearch mMKSearch;  
      
    private MapView mapView;  
    private MapController mapController;  
    private EditText keyWordEditText;  
    private Button queryButton;  
    private static StringBuilder sb;  
          
    @Override
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.poi_city_search);  
      
        // 初始化MapActivity  
        mapManager = new BMapManager(getApplication());  
        // init方法的第一個參數需填入申請的API Key  
        mapManager.init("285B415EBAB2A92293E85502150ADA7F03C777C4", null);  
        super.initMapActivity(mapManager);  
      
        mapView = (MapView) findViewById(R.id.map_View);  
        // 設置地圖模式為交通地圖  
        mapView.setTraffic(true);  
        // 設置啟用內置的縮放控件  
        mapView.setBuiltInZoomControls(true);  
      
        // 取得地圖控制器對象,用於控制MapView  
        mapController = mapView.getController();  
        // 設置地圖默認的縮放級別  
        mapController.setZoom(10);  
      
        // 設置每頁返回的POI數,默認為10,取值范圍1-50  
        MKSearch.setPoiPageCapacity(10);  
        // 初始化MKSearch  
        mMKSearch = new MKSearch();  
        mMKSearch.init(mapManager, new MySearchListener());  
              
        keyWordEditText = (EditText) findViewById(R.id.keyword_edittext);  
        queryButton = (Button) findViewById(R.id.query_button);  
        queryButton.setOnClickListener(new OnClickListener() {  
            @Override
            public void onClick(View v) {  
                //每次搜索前先前sb中的內容清空  
                sb = new StringBuilder();  
      
                String keyWord = keyWordEditText.getText().toString().trim();  
                // 搜索貴陽地區的沃爾瑪  
                mMKSearch.poiSearchInCity("貴陽", keyWord);  
            }  
        });  
    }  
      
    @Override
    protected boolean isRouteDisplayed() {  
        return false;  
    }  
      
    @Override
    protected void onDestroy() {  
        if (mapManager != null) {  
            // 程序退出前需調用此方法  
            mapManager.destroy();  
            mapManager = null;  
        }  
        super.onDestroy();  
    }  
      
    @Override
    protected void onPause() {  
        if (mapManager != null) {  
            // 終止百度地圖API  
            mapManager.stop();  
        }  
        super.onPause();  
    }  
      
    @Override
    protected void onResume() {  
        if (mapManager != null) {  
            // 開啟百度地圖API  
            mapManager.start();  
        }  
        super.onResume();  
    }  
      
    /** 
     * 實現MKSearchListener接口,用於實現異步搜索服務 
     *  
     * @author liufeng 
     */
    public class MySearchListener implements MKSearchListener {  
        /** 
         * 根據經緯度搜索地址信息結果 
         *  
         * @param result 搜索結果 
         * @param iError 錯誤號(0表示正確返回) 
         */
        @Override
        public void onGetAddrResult(MKAddrInfo result, int iError) {  
        }  
      
        /** 
         * 駕車路線搜索結果 
         *  
         * @param result 搜索結果 
         * @param iError 錯誤號(0表示正確返回) 
         */
        @Override
        public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {  
        }  
      
        /** 
         * POI搜索結果(范圍檢索、城市POI檢索、周邊檢索) 
         *  
         * @param result 搜索結果 
         * @param type 返回結果類型(11,12,21:poi列表 7:城市列表) 
         * @param iError 錯誤號(0表示正確返回) 
         */
        @Override
        public void onGetPoiResult(MKPoiResult result, int type, int iError) {  
            if (result == null) {  
                return;  
            }  
            // 清除地圖上已有的所有覆蓋物  
            mapView.getOverlays().clear();  
            // PoiOverlay是baidu map api提供的用於顯示POI的Overlay  
            PoiOverlay poioverlay = new PoiOverlay(PoiSearchInCityActivity.this, mapView);  
            // 設置搜索到的POI數據  
            poioverlay.setData(result.getAllPoi());  
            // 在地圖上顯示PoiOverlay(將搜索到的興趣點標注在地圖上)  
            mapView.getOverlays().add(poioverlay);  
      
            if(result.getNumPois() > 0) {  
                // 設置其中一個搜索結果所在地理坐標為地圖的中心  
                MKPoiInfo poiInfo = result.getPoi(0);  
                mapController.setCenter(poiInfo.pt);  
            }  
                  
            sb.append("共搜索到").append(result.getNumPois()).append("個POI/n");  
            // 遍歷當前頁返回的POI(默認只返回10個)  
            for (MKPoiInfo poiInfo : result.getAllPoi()) {  
                sb.append("名稱:").append(poiInfo.name).append("/n");  
                //sb.append("地址:").append(poiInfo.address).append("/n");  
                //sb.append("經度:").append(poiInfo.pt.getLongitudeE6() / 1000000.0f).append("/n");  
                //sb.append("緯度:").append(poiInfo.pt.getLatitudeE6() / 1000000.0f).append("/n");  
            }  
      
            // 通過AlertDialog顯示當前頁搜索到的POI  
            new AlertDialog.Builder(PoiSearchInCityActivity.this)  
            .setTitle("搜索到的POI信息")  
            .setMessage(sb.toString())  
            .setPositiveButton("關閉", new DialogInterface.OnClickListener() {  
                public void onClick(DialogInterface dialog, int whichButton) {  
                    dialog.dismiss();  
                }  
            }).create().show();  
        }  
      
        /** 
         * 公交換乘路線搜索結果 
         *  
         * @param result 搜索結果 
         * @param iError 錯誤號(0表示正確返回) 
         */
        @Override
        public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {  
        }  
      
        /** 
         * 步行路線搜索結果 
         *  
         * @param result 搜索結果 
         * @param iError 錯誤號(0表示正確返回) 
         */
        @Override
        public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) {  
        }  
    }  
}

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved