【“零起點”--百度地圖手機SDK】如何進行三種POI搜索?


摘要:POI即關鍵興趣點,比如人民大學、新世界華聯、306醫院、沙縣小吃、百度大廈,這些都是POI點。百度地圖SDK查詢POI有三種接口,分別是城市內搜索poiSearchInCity、周邊搜索poiSearchNearBy、范圍搜索poiSearchInbounds。其中周邊和范圍搜索還分別有多關鍵搜索,支持1-10個多關鍵詞。

----------------------------------------------------------------------

系列閱讀:
1、【百度地圖-安卓SDK】從頭開始寫android程序
http://www.cnblogs.com/milkmap/archive/2011/11/25/2263475.html  
2、【“零起點”--百度地圖手機SDK】如何創建一張地圖
http://www.cnblogs.com/milkmap/archive/2012/05/11/2496526.html 
3、【“零起點”--百度地圖手機SDK】如何使用離線地圖?
http://www.cnblogs.com/milkmap/archive/2012/05/21/2511928.html

4、【“零起點”--百度地圖手機SDK】如何添加地圖圖層+按鈕事件+水平垂直布局?

http://www.cnblogs.com/milkmap/archive/2012/05/25/2518454.html
-----------------------------------------------------------------------

一、選擇一個POI搜索接口

官網的類參考上有全部接口的說明:http://dev.baidu.com/wiki/imap/index.php?title=Android%E5%B9%B3%E5%8F%B0/%E7%B1%BB%E5%8F%82%E8%80%83/MKSearch

 

以范圍檢索為例,我們查詢一個矩形范圍內的味多美有多少。

第一個參數是關鍵詞,這里寫的是味多美。

第二個參數,是矩形的左下角坐標。第三個參數,是矩形右上角坐標。

取坐標的可視化工具:http://dev.baidu.com/wiki/static/map/API/tool/getPoint/

myMKSearch.poiSearchInbounds("味多美",new GeoPoint((int) (39.863116 * 1E6), (int) (116.199024 * 1E6)),new GeoPoint((int) (39.90298 * 1E6), (int) (116.338728 * 1E6)));

 

 

二、初始化

需要申明變量,然后初始化搜索接口。

/** 寫在activity里面頂部 **/
MKSearch myMKSearch = null;    //POI搜索變量申明

/** 寫在oncreate里面 **/
myMKSearch = new MKSearch();  //初始化。

 

 

三、設置回調函數

onGetPoiResult是POI搜索的回調函數。
在里面設置了,如果查詢到結果,就將結果添加到地圖上。
myMKSearch.init(mBMapMan, new MKSearchListener(){
            @Override
            public void onGetPoiResult(MKPoiResult result, int type, int iError) {
                if (result == null) {
                    return;
                }
                PoiOverlay poioverlay = new PoiOverlay(SearchPOIActivity.this, mMapView);
                poioverlay.setData(result.getAllPoi());
                mMapView.getOverlays().add(poioverlay);
            }
       
           @Override
           ......
}

 

不過,覺得百度地圖SDK在這里有個很奇怪的地方。我明明只使用POI搜索啊,可是在回調函數里,必須要寫出公交、駕車等的回調函數,即使是空的,也必須寫,不然就會報錯。如下圖:

1、把駕車回調函數注釋了,就報錯

 

2、必須要將其他回調函數代碼補齊,才不報錯。(總覺得,這個有點兒不合理……)

 

四、效果圖

 

 

五、其他POI搜索接口

以下三個接口,選一個寫就可以了。

//1、城市poi檢索
myMKSearch.poiSearchInCity("北京", "德庄火鍋");


//2、根據范圍和檢索詞發起范圍檢索|多關鍵詞poiMultiSearchInbounds
myMKSearch.poiSearchInbounds("味多美",new GeoPoint((int) (39.863116 * 1E6), (int) (116.199024 * 1E6)),new GeoPoint((int) (39.90298 * 1E6), (int) (116.338728 * 1E6)));


//3、中心點5000米內的KFC有多少|多關鍵詞poiMultiSearchNearBy
myMKSearch.poiSearchNearBy("KFC", new GeoPoint((int) (39.920 * 1E6), (int) (116.410 * 1E6)), 5000);
                

 

六、關於布局

這個教程的布局和上一個教程保持不變,我就把按鈕的layout注釋了。

布局的詳細代碼可以參見上一個教程~

 

七、全部源代碼

package com.baidu.searchpoi;

import android.app.Activity;
import android.os.Bundle;

/** 引入類 **/
import java.util.ArrayList;
import java.util.List;
 
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.drawable.Drawable;
import android.location.Location;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
 
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.GeoPoint;
import com.baidu.mapapi.ItemizedOverlay;
import com.baidu.mapapi.LocationListener;
import com.baidu.mapapi.MKAddrInfo;
import com.baidu.mapapi.MKBusLineResult;
import com.baidu.mapapi.MKDrivingRouteResult;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.MKLocationManager;
import com.baidu.mapapi.MKOLUpdateElement;
import com.baidu.mapapi.MKOfflineMap;
import com.baidu.mapapi.MKOfflineMapListener;
import com.baidu.mapapi.MKPlanNode;
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.MyLocationOverlay;
import com.baidu.mapapi.Overlay;
import com.baidu.mapapi.OverlayItem;
import com.baidu.mapapi.PoiOverlay;
import com.baidu.mapapi.RouteOverlay;
import com.baidu.mapapi.TransitOverlay;

/** activity **/
public class SearchPOIActivity extends MapActivity {
    //申明變量
    BMapManager mBMapMan = null;  
    MapView mMapView = null; 
    MKOfflineMap mOffline = null;   //離線地圖變量
    MapController mMapController = null; //縮放平移地圖
    MKSearch myMKSearch = null;    //POI搜索
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mBMapMan = new BMapManager(getApplication());
        mBMapMan.init("4AA2949E616E069C37CDC3152E8C401A05A0035D", null);
        super.initMapActivity(mBMapMan);
         
        mMapView = (MapView) findViewById(R.id.bmapsView);
        mMapView.setBuiltInZoomControls(true);  //設置啟用內置的縮放控件
         
        mMapController = mMapView.getController();  // 得到mMapView的控制權,可以用它控制和驅動平移和縮放
        //GeoPoint point = new GeoPoint((int) (39.93 * 1E6),(int) (116.42 * 1E6));  //用給定的經緯度構造一個GeoPoint,單位是微度 (度 * 1E6)
        GeoPoint point = new GeoPoint((int) (30.670007 * 1E6),(int) (104.092569 * 1E6)); 
        mMapController.setCenter(point);  //設置地圖中心點
        mMapController.setZoom(13);    //設置地圖zoom級別
        //mMapView.getOverlays().add(new MyOverlay());  //添加覆蓋物
        
        /** 離線地圖初始化  **/
        mOffline = new MKOfflineMap();
        mOffline.init(mBMapMan, new MKOfflineMapListener() {
            public void onGetOfflineMapState(int type, int state) {
                switch (type) {
                case MKOfflineMap.TYPE_DOWNLOAD_UPDATE:
                    {
                        MKOLUpdateElement update = mOffline.getUpdateInfo(state);
                        //mText.setText(String.format("%s : %d%%", update.cityName, update.ratio));
                    }
                    break;
                case MKOfflineMap.TYPE_NEW_OFFLINE:
                    Log.d("OfflineDemo", String.format("add offlinemap num:%d", state));
                    break;
                case MKOfflineMap.TYPE_VER_UPDATE:
                    Log.d("OfflineDemo", String.format("new offlinemap ver"));
                    break;
                }    
                  }
        }
        );
        /** 離線地圖導入離線包 **/
        int num = mOffline.scan();
        //if (num != 0)   mText.setText(String.format("已安裝%d個離線包", num));
        
        /** POI搜索  **/
        myMKSearch = new MKSearch();
        
        /** 回調函數 **/        
        myMKSearch.init(mBMapMan, new MKSearchListener(){
            @Override
            public void onGetPoiResult(MKPoiResult result, int type, int iError) {
                if (result == null) {
                    return;
                }
                PoiOverlay poioverlay = new PoiOverlay(SearchPOIActivity.this, mMapView);
                poioverlay.setData(result.getAllPoi());                
                mMapView.getOverlays().add(poioverlay);
                
                mMapView.getController().animateTo(result.getPoi(0).pt);   //手動設定地圖的中心點
                mMapView.invalidate();  //手動刷新地圖                
                
                //疑問1,如果是外省,如何設置覆蓋物的最佳顯示區域?無viewport接口
                //疑問2,為何不能直接顯示搜索結果,要先點擊一下地圖?刷新地圖
            }

            public void onGetDrivingRouteResult(MKDrivingRouteResult res,
                    int error) {
            }
            public void onGetTransitRouteResult(MKTransitRouteResult res,
                    int error) {
            }
            public void onGetWalkingRouteResult(MKWalkingRouteResult res,
                    int error) {
            }
            public void onGetAddrResult(MKAddrInfo res, int error) {
            }
            public void onGetBusDetailResult(MKBusLineResult result, int iError) {
            }
            
        });        
        
        //1、城市poi檢索
        //myMKSearch.poiSearchInCity("成都", "紅星路");
        //2、根據范圍和檢索詞發起范圍檢索|多關鍵詞poiMultiSearchInbounds
        myMKSearch.poiSearchInbounds("味多美",new GeoPoint((int) (39.863116 * 1E6), (int) (116.199024 * 1E6)),new GeoPoint((int) (39.90298 * 1E6), (int) (116.338728 * 1E6)));
        //3、中心點5000米內的KFC有多少|多關鍵詞poiMultiSearchNearBy
        //myMKSearch.poiSearchNearBy("KFC", new GeoPoint((int) (39.920 * 1E6), (int) (116.410 * 1E6)), 5000);
        
    }
 
    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }
    
    @Override
    protected void onDestroy() {
        if (mBMapMan != null) {
            mBMapMan.destroy();
            mBMapMan = null;
        }
        super.onDestroy();
    }
    
    @Override
    protected void onPause() {
        if (mBMapMan != null) {
            mBMapMan.stop();
        }
        super.onPause();
    }
    
    @Override
    protected void onResume() {
        if (mBMapMan != null) {
            mBMapMan.start();
        }
        super.onResume();
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM