天天看點

Android地圖應用開發之--百度地圖內建及應用_baidumap什麼是百度地圖API-(3)

什麼是百度地圖API-(3)

  百度地圖移動版API(Android)是一套基于Android裝置的應用程式接口,通過該接口,可以輕松通路 百度服務和資料,建構功能豐富、互動性強的 地圖應用程式。       

 百度地圖移動版API不僅包含建構地圖的基本接口,還提供了本地 搜尋、 路線規劃、 地圖定位等資料服務。

 sdk下載下傳位址:http://developer.baidu.com/map/

 使用百度經緯度坐标,可以通過http://api.map.baidu.com/lbsapi/getpoint/index.html查詢地理

百度地圖入門(45)

三大核心

BMapManager:百度引擎的管理工具。

MapView:顯示地圖的類,它的父類是ViewGroup.

MapView 的MKMapViewListener

MapController:對目前地圖進行控制:縮放、旋轉、平移。

準備工作 1、擷取API Key

Android簽名證書的sha1值擷取方式有兩種:

第一種方法:使用keytool

第1步:運作進入控制台 第2步:定位到.android檔案夾下,輸入cd .android

第3步:輸入keytool -list -v -keystore debug.keystore,會得到三種指紋證書,選取SHA1類型的證書(密鑰密碼是android),例如:

其中keytool為jdk自帶工具;keystorefile為Android 簽名證書檔案

擷取API Key 位址:http://developer.baidu.com/map/android-mobile-apply-key.htm 已經得到的Key: 1A4A4ABEFBEECD8C17DEE880C4EA69B9607020B5

電影時光: 8gvYUwg6QKIqfMHhcMyys531pH7PWGHW

不同的地圖廠商,申請API Key

2、建立工程 建立工程後BaiduMap

添加引擎到Andoid工程中 添加jar包:baidumapapi_v2_1_2.jar和locSDK_3.1.jar 添加.so檔案:拷貝libapp_BaiduMapApplib_v2_1_2.so、liblocSDK3.so、libvi_voslib.so到libs\armeabi目錄下 注:liblocSDK3.so和locSDK_3.1.jar為百度定位SDK所使用資源,開發者可根據實際需求自行添加。

3、在布局檔案mapView初始化前 添加地圖引擎到Andoid工程中 initManager();

4、添權重限

<!-- gps --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- wifi --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <!-- 網絡的權限 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 離線包 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 擷取手機資訊 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" />

5、初始化地圖引擎

    private void initManager() {         // 地圖引擎         manager = new BMapManager(this);        

        manager.init(ConfigValues.key, new MKGeneralListener() {

            // MKEvent             // 授權驗證             @Override             public void onGetPermissionState(int iError) {                 //                 if (iError == MKEvent.ERROR_PERMISSION_DENIED) {                     Toast.makeText(getApplicationContext(), "授權失敗", 1).show();                 }             }

            // 網絡狀态             @Override             public void onGetNetworkState(int iError) {                 if (iError == MKEvent.ERROR_NETWORK_CONNECT) {                     Toast.makeText(getApplicationContext(), "網絡連接配接失敗", 1).show();                 }             }         });

    }

6、引入布局(地圖控件)common.xml Layout中添加MapView控件用于展示地圖

<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"     >     <com.baidu.mapapi.map. MapView         android:layout_width="wrap_content"         android:layout_height="wrap_content"          />

</RelativeLayout>

運作示範,看看顯示效果。

7、縮放級别 打開浏覽器看一看百度地圖最小級别 地圖縮放級别 V1.X : 3--18級别 V2.X : 3--19級别 V2.X和V1.X的主要差別 A:修改了地圖檔案袋格式,節省空間。 例如北京市地圖:V1.x:120MB,V2.X:20MB,相對于壓縮9倍。 B:放大級别多了一個級别變成19級别,增加了3D效果。

8、MapController地圖控制器 建立管理工具,并初使化 BMapManager在init時校驗key(300)和網絡狀态(2),關于狀态碼資訊我們可以在MKEvent查詢

管理某個具體的MapView:縮放、旋轉、移動;

private void init() {         //MapController管理某個MapView:縮放、旋轉、移動         mapView = (MapView) findViewById(R.id.map_view);         controller = mapView.getController();         //設定地圖的縮放級别,這個參數取值範圍3--19         controller.setZoom(12);     } 運作起來,示範一下。 9、添加控制地圖放大放小按鈕 //需要在mapview添加一組按鈕,mapview.addView(view)     mapView.setBuiltInZoomControls(true);

10. 中心點的設定  預設地圖中心設定是天安門  如果自己設定喜歡的中心點? 北京天安門廣場的經緯度(東經:116°23′17〃,北緯:39°54′27〃 ) int latitudeE6 = 116°23′17 乘以 10六次方 這樣便于支援小數點後幾位 代碼如下: int latitude=(int) (40.107218*1E6);//緯度 int longitude=(int) (116.385178*1E6);//經度 GeoPoint point=new GeoPoint(latitude, longitude);//尚矽谷 controller.setCenter(point);

退出項目,進來,拖動地圖出現下面bug.如圖:

解決代碼如下:

@Override

protected void onResume() {

super.onResume();

mapView.onResume();

}

@Override

protected void onPause() {

super.onPause();

mapView.onPause();

}

@Override

protected void onDestroy() {

super.onDestroy();

mapView.destroy();

}

MapController:主要用于控制地圖移動、縮放、旋轉的工具

動畫形式移動 :animateTo(GeoPoint point)

縮放:zoomOut()—縮小;zoomIn()—放大;setZoom(arg0)—指定縮放級别

旋轉

水準方向:setRotation,旋轉角範圍: 0 ~ 360(?) , 機關:度   預設值為0度,逆時針旋轉為角度增大方向,通過MapView的getMapRotation擷取目前角度

俯視:setOverlooking,俯角範圍:  -45 ~ 0 , 機關: 度

指南針設定:setCompassMargin(int x, int y)  ,坐标系原點為MapView左上頂點 ,指南針在3D模式下自動顯現,注意了,旋轉式才出現。

以一個點為中心旋轉:

基于一條線旋轉(overlooking俯視)

代碼如下:

@Override

public boolean onKeyDown(int keyCode, KeyEvent event) {

// 縮放、旋轉、移動

switch (keyCode) {

case KeyEvent.KEYCODE_1:

// 放大(一級級)

controller.zoomIn();

break;

case KeyEvent.KEYCODE_2:

// 縮小(一級級)

controller.zoomOut();

break;

case KeyEvent.KEYCODE_3:

// 以一個點為中心旋轉

// 擷取到地圖目前的角度

// -180~180

int rotation = mapView.getMapRotation();

controller.setRotation(rotation + 30);

Log.i(TAG, "rotation:" + rotation);

break;

case KeyEvent.KEYCODE_4:

// 俯瞰,以一條線旋轉overlooking

// -45~0

int overlooking = mapView.getMapOverlooking();

controller.setOverlooking(overlooking - 5);

Log.i(TAG, "overlooking:" + overlooking);

break;

case KeyEvent.KEYCODE_5:

// 移動

controller.animateTo(new GeoPoint(40065796, 116349868));

break;

}

return super.onKeyDown(keyCode, event);

}

示範看效果以及旋轉日志。Android 4.1 沒法直接接收鍵盤的數字

進階功能簡介

地圖圖層-(20)

什麼是地圖圖層

地圖可以包含一個或多個圖層,每個圖層在每個級别都是由若幹個圖塊組成的,它們覆寫了地圖的整個表面。例如您所看到包括街道、興趣點、學校、公園等内容的地圖展現就是一個圖層,另外交通流量的展現也是通過圖層來實作的。

圖層分類

底圖

    基本的地圖圖層,包括若幹個縮放級别,顯示基本的地圖資訊,包括道路、街道、學校、 公園等内容。

實時交通資訊圖:MapView.setTraffic(true)

衛星圖:MapView.setSatellite(true)

   衛星地圖是衛星拍攝的真實的地理面貌,是以衛星地圖可用來檢測地面的資訊,你可以了解到地理位置,地形等。 1、建立圖層頁面 LayerDemo==>基于Hello.java

    @Override    public boolean onKeyDown(int keyCode, KeyEvent event) {        // 底層,交通實時圖,衛星圖        switch (keyCode) {        case KeyEvent.KEYCODE_1:           // 底圖           mapView.setTraffic(false);          mapView.setSatellite(false);           break;        case KeyEvent.KEYCODE_2:           // 交通實時圖           mapView.setTraffic(true);           mapView.setSatellite(false);           break;        case KeyEvent.KEYCODE_3:          // 衛星圖           mapView.setSatellite(true);           mapView.setTraffic(false);           break;        }        return super.onKeyDown(keyCode, event);    }

   private void init() {        mapView = (MapView) findViewById(R.id.map_view);        controller = mapView.getController();        controller.setZoom(12);       mapView.setBuiltInZoomControls(true);    }

}

覆寫物概念

所有疊加或覆寫到地圖的内容,我們統稱為地圖覆寫物。如标注、矢量圖形元素(包括:折線和多邊形和圓)、定位圖示等。覆寫物擁有自己的地理坐标,當您拖動或縮放地圖時,它們會相應的處理。

覆寫物包括:

覆寫物的抽象基類:Overlay(核心類),第四個核心類

幾何圖形繪制覆寫物:GraphicsOverlay

文字繪制覆寫物:TextOverlay

分條目覆寫物:ItemizedOverlay

本地搜尋覆寫物:PoiOverlay

路線規劃覆寫物:RouteOverlay

換乘路線覆寫物:TransitOverlay

我的位置覆寫物: MyLocationOverlay ---------------------------------------------------------------------------------------------------------------------------------------------------------------

Overlay是一個基類,它表示可以顯示在地圖上方的覆寫物。

從2.0.0開始,SDK不支援直接繼承Overlay , 使用者可通過繼承ItemizedOverlay來添加覆寫物。

關于Overlay的使用,即在MapView上顯示Overlay的步驟

1、需要擷取到MapView中儲存Overlay的集合

2、在其中添加需要顯示的内容

3、然後重新整理界面

注意:所不同的是如何給不同的Overlay設定資料,這也是重點。

覆寫物-GraphicsOverlay-

自定義繪制幾何圖形需要以下幾個類的支援:

Geometry:這是一個幾何圖形類,利用此類,可以建構待繪制的各種基本幾何元素;

Symbol:樣式類,如果隻建構幾何圖形類而沒有樣式的話,該幾何圖形是無意義的;

Graphic:圖形類,利用幾何圖形加上樣式,這樣就可以建構一個圖形類,Graphic就是這樣一個類,用于管理所添加的圖形;

GraphicsOverlay:這是一個用于繪制圖形的overlay,和其他的各種overlay用法相同。

繪制步驟

建立自繪圖形:Geometry,Geometry表示一個用于繪圖的幾何圖形,目前繪圖api提供五種幾何圖形:點,線,圓、矩形和凸多邊形。

為自繪圖形選擇合适的樣式:Symbol,Symbol表示繪圖樣式,如點顔色,線寬,填充色等。

建構繪圖對象:Graphic,通過幾何元素(Geometry)和相對應的樣式(Symbol)就可以組合成Graphic, Graphic表示SDK可直接用于繪制的一個繪圖對象,使用者通過操縱Graphic對象向地圖添加/移除自繪圖形。

GraphicsOverlay :将自繪圖形添加到地圖中。 Graphic 對象可通過 GraphicsOvelay 添加到 MapView 中。 private void draw() {

    //1. 從 MapView 得到所有的覆寫物

    List<Overlay>  overlays =  mapview.getOverlays();

    //2. 自定義 GraphicsOverlay

    GraphicsOverlay  graphicsOverlay = new GraphicsOverlay(mapview);

    //3. 給 GraphicsOverlay 設定參數

    setData(graphicsOverlay);

    //4. 添加到覆寫物的清單集合中

    overlays.add(graphicsOverlay);//不能少

    //5.MapView 重新整理

    mapview.refresh(); } //設定一個圓 private void setData(GraphicsOverlay overlay) {         //1.定義幾何圖形:圓心和半徑         //幾何        Geometry geometry = new Geometry();                geometry.setCircle( point , 1000);                 //2.樣式:顔色、是否填充、繪制圓形是的線條的粗心         //符号        Symbol symbol = new Symbol();                Symbol.Color color =symbol. new Color();        color. red = 255;        color. green = 0;        color. blue = 0;        color. alpha = 100;        symbol.setSurface(color, 1, 5);         //圖形        Graphic graphic = new Graphic(geometry, symbol);         overlay.setData(graphic);       } }

把地圖公共功能抽取到BaseActivity,代碼如下:

覆寫物-TextOverlay- 簡單介紹 Geometry 的方法,就是支援的圖形。

文字繪制的方法與幾何圖形繪制的方法類似,它也需要幾個類的功能支援才能完成最終繪制: Symbol:樣式類,主要負責為所繪制的文字提供顔色屬性; TextItem:文字類,包含文字對齊方式、顔色、字号、繪制位置、字型等基本資訊; TextOverlay:這是一個用于繪制文字的overlay,和其他的各種overlay用法相同。 繪制步驟 定義并初始化兩個Symbol.Color對象,用于設定文字的顔色和其背景的顔色; 定義并初始化TextItem對象,用于所繪制文字的基本屬性資訊; 基本資訊設定:大小、對齊方式等

public class TextOverlayDemo extends BaseActivity {      @Override      protected void onCreate(Bundle savedInstanceState) {         super .onCreate(savedInstanceState);        draw();     }

          private void draw() { //1. 從 MapView 得到所有的覆寫物 List<Overlay> overlays =  mapview.getOverlays(); //2. 自定義 TextOverlay TextOverlay textOverlay =  new TextOverlay( mapview); //3. 給 TextOverlay 設定參數 setData(textOverlay); //4. 添加到覆寫物的清單集合中 overlays.add(textOverlay); //5.MapView 重新整理 mapview.refresh();

    }

          private void setData(TextOverlay textOverlay) {         // int align         // 文字對齊方式 ,為 ALIGN_TOP,ALIGN_CENTER, ALIGN_BOTTOM中的一個值         // static int ALIGN_BOTTOM         // 文字對齊參數,下邊中點對齊         // static int ALIGN_CENTER         // 文字對齊參數,中心對齊         // static int ALIGN_TOP         // 文字對齊參數,上邊中點對齊

        // Symbol.Color bgColor         // 文字背景色, 預設為透明

        // Symbol.Color fontColor         // 文字顔色

        // int fontSize         // 字号大小

        // GeoPoint pt         // 文字顯示的位置,用經緯度坐标表示

        // String text         // 要顯示的文字内容

        // Typeface typeface         // 文字字型, android 字型表示,為空則用系統預設字型.        TextItem textItem = new TextItem();        textItem. align = TextItem. ALIGN_CENTER ;

       textItem. fontColor = getColor();        textItem. fontSize = 20 ;        textItem. pt = point ;        textItem. text = " 尚矽谷 " ;        textItem. typeface = Typeface. SERIF ;        textOverlay.addText(textItem);

    }

     private Color getColor() {         // 符号        Symbol symbol = new Symbol();                Symbol.Color color = symbol. new Color();        color. red = 255;        color. green = 0;        color. blue = 0;        color. alpha = 100;         return color;     }

}

覆寫物-多條目的繪制-ItemizedOverlay 1、某個類型的覆寫物,包含多個類型相同、顯示方式相同、處理方式相同的項時,使用此類。 2、開發步驟 繼承ItemizedOverlay 建立OverlayItem,準備overlay資料; 建立ItemizedOverlay執行個體,調用 addItem(OverlayItem)} 接口添加overlay。 調用MapView.getOverlays().add()方法添加overlay到mapview中。 調用MapView.refresh() 使Overlay生效 3、顯示一個“泡泡視窗”

案例代碼: OverlayItem item=new OverlayItem(atguiguPos, "尚矽谷", "牛"); overlay.addItem(item);

item = new OverlayItem(new GeoPoint(latitude + 1000, longitude), "向北", "增加緯度"); overlay.addItem(item);

item = new OverlayItem(new GeoPoint(latitude, longitude + 1000), "向東", "增加經度"); overlay.addItem(item);

item = new OverlayItem(new GeoPoint(latitude - 1000, longitude - 1000), "向西南", "減少經緯度"); overlay.addItem(item); 代碼如下: public class ItemizedOverlayDemo extends BaseActivity {     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         initPop();         draw();         controller.setZoom(16);     }

        private void draw() {         ItemizedOverlay<OverlayItem> overlay = new ItemizedOverlay<OverlayItem>(                 getResources().getDrawable(R.drawable.eat_icon), mapView);

        setData(overlay);

        mapView.getOverlays().add(overlay);

    }

    private void setData(ItemizedOverlay<OverlayItem> overlay) {

        // protected GeoPoint mPoint         // 該item的位置         // protected String mSnippet         // 該item的文字片段         // protected String mTitle         // 該item的标題文本         OverlayItem item = new OverlayItem(point, "尚矽谷", "不6k不就業");         overlay.addItem(item);         item = new OverlayItem(new GeoPoint(latitude + 1000, longitude), "向北",                 "增加緯度");         overlay.addItem(item);         item = new OverlayItem(new GeoPoint(latitude, longitude + 1000), "向東",                 "增加經度");         overlay.addItem(item);         item = new OverlayItem(new GeoPoint(latitude - 1000, longitude - 1000),                 "向西南", "減少經緯度");         overlay.addItem(item);     } }

顯示一個“泡泡視窗”

顯示一個“泡泡視窗”-(15)

1、準備好泡泡的layout <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="wrap_content"     android:layout_height="wrap_content"     android:orientation="horizontal"     android:paddingBottom="0dip" >

    <LinearLayout         android:id="@+id/user_info"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:layout_weight="1"         android:background="@drawable/popupmap"         android:orientation="horizontal"         android:gravity="center_vertical"         android:layout_marginBottom="20dip"         >

        <ImageView             android:id="@+id/round"             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:layout_marginBottom="2dip"             android:src="@drawable/round" />

        <TextView             android:id="@+id/title"             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:ellipsize="end"             android:text="标題"             android:textSize="20sp" />

        <ImageView             android:id="@+id/roads"             android:layout_width="wrap_content"             android:layout_height="wrap_content"             android:src="@drawable/roads" />     </LinearLayout>

</LinearLayout>

2、在MapView中添加該泡泡 addView(View child, LayoutParams params) LayoutParams:MapView.LayoutParams MapView.LayoutParams(int width, int height, GeoPoint point, int alignment),其中alignment為對其方式,采用BOTTOM_CENTER 在處理onTap時更新Layout,利用LayoutParams傳遞點位資訊,同時可以擷取标題資訊,設定給TextView

添加泡泡代碼如下紅色部分:

public class ItemizedOverlayDemo extends BaseActivity {     @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         initPop();         draw();         controller.setZoom(16);     }

        private void draw() {          //1. 從 MapView 得到所有的覆寫物

//        List<Overlay> overlays =  mapview.getOverlays();

        //2. 自定義 ItemizedOverlay

        ItemizedOverlay itemizedOverlay =  new ItemizedOverlay(getResources().getDrawable(R.drawable. eat_icon), mapview){

            @Override

            public int compare(Object lhs, Object rhs) {

                return  0;

            }

            @Override

            protected boolean onTap( int i) {

                OverlayItem overlayItem =  getItem(i);

                // 設定标題

                tv_title.setText(overlayItem.getTitle());

                // 配置參數 MapView.LayoutParams params =  new MapView.LayoutParams(MapView.LayoutParams. WRAP_CONTENT,                         MapView.LayoutParams. WRAP_CONTENT,overlayItem.getPoint(), 0,- 100,MapView.LayoutParams. BOTTOM_CENTER);                 pop.setVisibility(View. VISIBLE);

                // 更新地圖

                mapview. updateViewLayout( pop,params);

                return super.onTap(i);

            }

        };

        //3. 給 ItemizedOverlay 設定參數

        setData(itemizedOverlay);

        //4. 添加到覆寫物的清單集合中

        mapview.getOverlays().add(itemizedOverlay);

        //5.MapView 重新整理

        mapview.refresh();

        controller.setZoom( 16);

    }

    private void setData(ItemizedOverlay<OverlayItem> overlay) {

        // protected GeoPoint mPoint         // 該item的位置         // protected String mSnippet         // 該item的文字片段         // protected String mTitle         // 該item的标題文本         OverlayItem item = new OverlayItem(point, "尚矽谷", "不4k不就業");         overlay.addItem(item);         item = new OverlayItem(new GeoPoint(latitude + 1000, longitude), "向北",                 "增加緯度");         overlay.addItem(item);         item = new OverlayItem(new GeoPoint(latitude, longitude + 1000), "向東",                 "增加經度");         overlay.addItem(item);         item = new OverlayItem(new GeoPoint(latitude - 1000, longitude - 1000),                 "向西南", "減少經緯度");         overlay.addItem(item);     }

    private View pop;     private TextView title;

    // 添加泡泡     // 單擊某一條具體的Item的時候其上方顯示     // 加載pop     // 添加到mapview中,不這種坐标,pop隐藏     // 當點選時,顯示泡泡,位置更新     private void initPop() {         pop = View.inflate(this, R.layout.pop, null);         title = (TextView) pop.findViewById(R.id.title);         // MapView.LayoutParams(int width, int height, GeoPoint point, int         // alignment)         // 建立自定義布局參數,按地理坐标布局         MapView.LayoutParams params = new MapView.LayoutParams(                 LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, null,                 MapView.LayoutParams.BOTTOM_CENTER);         mapView.addView(pop, params);         pop.setVisibility(View.INVISIBLE);

    }

}

搜尋

1、百度地圖移動版API內建搜尋服務包括 位置檢索、周邊檢索、範圍檢索、公交檢索、駕乘檢索、步行檢索。 2、 核心類: MKSearch和MKSearchListener 3、實作思路 初始化MKSearch類,通過init方法注冊搜尋結果的監聽對象MKSearchListener,實作異步搜尋服務。 通過自定義MySearchListener實作類,處理不同的回調方法,獲得搜尋結果。 注意,MKSearchListener隻支援一個,以最後一次設定為準 4、結合覆寫物展示搜尋 本地搜尋覆寫物:PoiOverlay-圓形區域的、矩形區域、全城範圍内搜尋。 路線覆寫物:RouteOverlay 換乘路線覆寫物:TransitOverlay

本地搜尋 1、POI(Point of Interest興趣點)搜尋有三種方式 根據範圍和檢索詞發起範圍檢索PoiSearchInbounds 興趣的界内搜尋 周邊檢索poiSearchNearBy 城市poi檢索poiSearchInCity poi詳細資訊檢索 poiDetailSearch 2、結果的展示: PoiOverlay

參數及案例:

poiSearchInbounds:使用參數資訊 左下:40.103148 116.368541 右上:40.112916  116.399012,

GeoPoint ptLB = new GeoPoint((int) (40.103148 * 1E6), (int) (116.368541 * 1E6)); GeoPoint ptRT = new GeoPoint((int) (40.112916 * 1E6), (int) (116.399012 * 1E6));

//搜尋 public int poiSearchInbounds(java.lang.String key, GeoPoint ptLB, GeoPoint ptRT) 根據範圍和檢索詞發起範圍檢索.異步函數,傳回結果在MKSearchListener裡的onGetPoiResult方法通知 參數: key - 關鍵詞 ptLB - 地理坐标,範圍的左下角 ptRT - 地理坐标,範圍的右上角 傳回: 成功傳回0,否則傳回-1

//結果處理 void onGetPoiResult(MKPoiResult result, int type, int iError) 傳回poi搜尋結果

參數: result - 搜尋結果 type - 傳回結果類型: MKSearch.TYPE_POI_LIST, MKSearch.TYPE_AREA_POI_LIST, MKSearch.TYPE_AREA_MULTI_POI_LIST, MKSearch.TYPE_CITY_LIST iError - 錯誤号,0表示正确傳回 對于poiSearchInbounds和poiSearchNearBy,type的值為MKSearch.TYPE_AREA_POI_LIST 對于poiSearchInCity,type的值為MKSearch.TYPE_POI_LIST

3、查詢加油站資訊

多種查詢方法,但結果的處理都在MKSearchListener的onGetPoiResult方法中,在該方法中可以通過傳遞的type值來區分是範圍搜尋還是城市檢索。

處理步驟: 判斷伺服器結果傳回 建立poi覆寫物 将伺服器傳回資料添加到poi覆寫物中 添加覆寫物到MapView 重新整理MapView

4、注意事項 POI檢索結果每頁容量預設情況下為10,可以通過setPoiPageCapacity設定,支援1-50(10) 翻頁功能通過MKSearch類的goToPoiPage實作,該方法是異步函數,搜尋成功後會調用注冊的事件處理函數onGetPoiResult 傳回查詢頁的結果。 支援分類搜尋,例如mSearch.poiSearchInCity("北京", "娛樂")

首先将監聽方法寫在基類.

矩形區域檢索 public class PoiSearchInboundsDemo  extends BaseActivity {

    private MKSearch  search;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        initSeach();

    }

    private void  initSeach() {

        search =  new MKSearch();

        search.init(mapManager, new BaseMKSearchListener(){

            @Override//檢索結果的回調             public void  onGetPoiResult(MKPoiResult mkPoiResult,  int i,  int i1) {

                super.onGetPoiResult(mkPoiResult, i, i1);

                if(mkPoiResult !=  null&&i1 == 0){

                    // 得到興趣點

                    PoiOverlay poiOverlay =  new                         PoiOverlay(PoiSearchInboundsDemo. this, mapview);

                    poiOverlay.setData(mkPoiResult.getAllPoi());

                    mapview.getOverlays().add(poiOverlay);

                    mapview.refresh();

                } else{

                    Toast.makeText(PoiSearchInboundsDemo. this, " 檢索未找到結果 ",Toast. LENGTH_SHORT).show();

                }

            }

        });

        // 矩形區域檢索興趣點

//        參數:

//        key -  關鍵詞

//        ptLB -  地理坐标,範圍的左下角

//        ptRT -  地理坐标,範圍的右上角

//        傳回:

//        成功傳回 0 ,否則傳回 -1

        int code =  search.poiSearchInbounds( " 加油站 ", new GeoPoint( 40057884, 116248736), new GeoPoint( 40178827, 116539643));

        if(code == 0){

            Toast.makeText(PoiSearchInboundsDemo. this, " 檢索成功 ",Toast. LENGTH_SHORT).show();

        } else{

            Toast.makeText(PoiSearchInboundsDemo. this, " 檢索失敗 ",Toast. LENGTH_SHORT).show();

        }

    }

}

圓形(附近)區域搜尋-(16) public class PoiSearchNearByDemo  extends BaseActivity {

    private MKSearch  search;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        initSeach();

    }

    private void initSeach() {

        search =  new MKSearch();

        search.init( mapManager,  new BaseMKSearchListener(){

            @Override

            public void onGetPoiResult(MKPoiResult mkPoiResult,  int i,  int i1) {

                super.onGetPoiResult(mkPoiResult, i, i1);

                if(mkPoiResult !=  null&&i1 == 0){

                    // 得到興趣點

                    PoiOverlay poiOverlay =  new PoiOverlay(PoiSearchNearByDemo. this, mapview);

                    poiOverlay.setData(mkPoiResult.getAllPoi());

                    mapview.getOverlays().add(poiOverlay);

                    mapview.refresh();

                } else{

                    Toast.makeText(PoiSearchNearByDemo. this, " 檢索未找到結果 ",Toast. LENGTH_SHORT).show();

                }

            }

        });

//        參數:

//        key -  關鍵詞

//        pt -  中心點地理坐标

//        radius -  半徑,機關 : 米

//        傳回:

//        成功傳回 0 ,否則傳回 -1

        int code =  search.poiSearchNearBy( " 洗浴 ",  atguiguPoint, 3000);

        if(code == 0){

            Toast.makeText(PoiSearchNearByDemo. this, " 檢索成功 ",Toast. LENGTH_SHORT).show();

        } else{

            Toast.makeText(PoiSearchNearByDemo. this, " 檢索失敗 ",Toast. LENGTH_SHORT).show();

        }

    }

}

全城搜尋 public class PoiSearchInCityDemo  extends BaseActivity {

    private MKSearch  search;

    private int  indexPager;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        btn_next.setVisibility(View. VISIBLE);

        btn_next.setOnClickListener( new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                indexPager++;

                search.goToPoiPage( indexPager);

            }

        });

        initSeach();

    }

    private void initSeach() {

        search =  new MKSearch();

        search.init( mapManager,  new BaseMKSearchListener(){

            @Override

            public void onGetPoiResult(MKPoiResult mkPoiResult,  int i,  int i1) {

                super.onGetPoiResult(mkPoiResult, i, i1);

                if(mkPoiResult !=  null&&i1 == 0){

                    // 注意檢索的值超過 10 個隻顯示 10 ,需要分頁

                    mkPoiResult.getAllPoi(); // 總的個數

                    mkPoiResult.getNumPages(); // 總夜數

                    mkPoiResult.getCurrentNumPois(); // 目前頁的個數

                    mkPoiResult.getNumPois(); // 總興趣點

                    indexPager = mkPoiResult.getPageIndex(); // 目前頁面

                    String msg =  " 總興趣點 =="+mkPoiResult.getNumPois()+ ", 目前頁的個數 =="+ mkPoiResult.getCurrentNumPois()+

                            ", 目前頁面 =="+mkPoiResult.getPageIndex();

                    System. out.println(msg);

                    Toast.makeText(PoiSearchInCityDemo. this,msg,Toast. LENGTH_SHORT).show();

                    // 得到興趣點

                    PoiOverlay poiOverlay =  new PoiOverlay(PoiSearchInCityDemo. this, mapview);

                    poiOverlay.setData(mkPoiResult.getAllPoi());

                    mapview.getOverlays().clear(); // 先清除上次頁面

                    mapview.getOverlays().add(poiOverlay); // 再加載新的頁面

                    mapview.refresh();

                } else{

                    Toast.makeText(PoiSearchInCityDemo. this, " 檢索未找到結果 ",Toast. LENGTH_SHORT).show();

                }

            }

        });

//        參數:

//        city -  城市名

//        key -  關鍵詞

//        傳回:

//        成功傳回 0 ,否則傳回 -1

        int code =  search.poiSearchInCity( " 北京市 ",  " 加油站 ");

        if(code == 0){

            Toast.makeText(PoiSearchInCityDemo. this, " 檢索成功 ",Toast. LENGTH_SHORT).show();

        } else{

            Toast.makeText(PoiSearchInCityDemo. this, " 檢索失敗 ",Toast. LENGTH_SHORT).show();

        }

    }

路線檢索-駕車路線-(20)

1 、可以進行駕車和步行路線查詢 結果展示: RouteOverlay 2 、案例:從尚矽谷到北京大學路線查詢 3 、駕車路線查詢 查詢: MKSearch.drivingSearch(java.lang.String startCity, MKPlanNode start, java.lang.String endCity, MKPlanNode end) 駕乘路線搜尋,或者增加途經點 . MKPlanNode 内容的設定:可以使用經緯度和地名,但不支援模糊查詢,需要輸入準确的名稱 可以通過 setDrivingPolicy(int policy)  來設定駕車路線規劃政策 結果處理: MKSearchListener.onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) 參數案例: 尚矽谷辦公樓 :40107218,116385178 ECAR_DIS_FIRST 最短距離 ECAR_FEE_FIRST 較少費用 ECAR_TIME_FIRST 時間優先

駕車路線 public class DrivingSearchDemo  extends BaseActivity {

    private MKSearch  search;

    private int  indexPager;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        initSeach();

    }

    private void initSeach() {

        search =  new MKSearch();

        search.init( mapManager,  new BaseMKSearchListener(){

            @Override

            public void onGetDrivingRouteResult(MKDrivingRouteResult mkPoiResult,  int i) {

                super.onGetDrivingRouteResult(mkPoiResult, i);

                if(mkPoiResult !=  null&&i == 0){                     if(mkPoiResult.getNumPlan()> 0){                      RouteOverlay poiOverlay =  new     RouteOverlay(DrivingSearchDemo. this, mapview);                         poiOverlay.setData(mkPoiResult.getPlan( 0).getRoute( 0));

                        mapview.getOverlays().add(poiOverlay);

                        mapview.refresh();

                    } else{

                        Toast.makeText(DrivingSearchDemo. this, " 此路不通 ",Toast. LENGTH_SHORT).show();

                    }

                } else{

                    Toast.makeText(DrivingSearchDemo. this, " 檢索未找到結果 ",Toast. LENGTH_SHORT).show();

                }

        }

        });

        // 設定駕車政策

        search.setDrivingPolicy(MKSearch. ECAR_TIME_FIRST);

//        startCity -  起點所在城市,起點為坐标時可不填

//        start -  搜尋的起點,可以為坐标,名稱任一種

//        endCity -  終點所在城市,終點為坐标時可不填

//        end -  搜尋的終點,可以為坐标,名稱任一種

//        傳回:

//        成功傳回 0 ,否則傳回 -1

        MKPlanNode start =  new MKPlanNode();

        start. pt =  atguiguPoint;

        MKPlanNode end =  new MKPlanNode();

        end. name =  " 北京大學 ";

//        int code = search.drivingSearch(" 北京 ",start," 北京 ",end);

        ArrayList<MKWpNode> list =  new ArrayList<>();

        MKWpNode mknode =  new MKWpNode();

        mknode. city =  " 北京 ";

        mknode. name =  " 北京外國語大學 ";

        list.add(mknode);

        int code =  search.drivingSearch( " 北京 ",start, " 北京 ",end,list);

        if(code == 0){

            Toast.makeText(DrivingSearchDemo. this, " 檢索成功 ",Toast. LENGTH_SHORT).show();

        } else{

            Toast.makeText(DrivingSearchDemo. this, " 檢索失敗 ",Toast. LENGTH_SHORT).show();

        }

    }

文檔中駕車第二個方法:

private void initSearch() {          listener = new MyListener();          search .init( manager , listener );          // 檢索政策          // static int ECAR_DIS_FIRST          // 駕乘檢索政策常量:最短距離          // static int ECAR_FEE_FIRST          // 駕乘檢索政策常量:較少費用          // static int ECAR_TIME_FIRST          // 駕乘檢索政策常量:時間優先          search .setDrivingPolicy(MKSearch. ECAR_TIME_FIRST );

         // 參數:          // startCity - 起點所在城市,起點為坐标時可不填          // start - 搜尋的起點,可以為坐标,名稱任一種          // endCity - 終點所在城市,終點為坐标時可不填          // end - 搜尋的終點,可以為坐标,名稱任一種          //wpNodes - 途經點資料          // 傳回:          // 成功傳回0,否則傳回-1         MKPlanNode start = new MKPlanNode();         start. pt = point ;          //      MKPlanNode end = new MKPlanNode(); //      end.name = "天安門";                   MKPlanNode end = new MKPlanNode();         end.pt = new GeoPoint(40065796,116349868);          // 搜尋 //      search.drivingSearch("北京", start, "北京", end);                   //途徑點          ArrayList<MKWpNode> arrayList = new ArrayList<MKWpNode>();         MKWpNode mkWpNode = new  MKWpNode();         mkWpNode.city = "北京";         mkWpNode.name = "天安門";         arrayList.add(mkWpNode);          search .drivingSearch( "北京" , start, "北京" , end, arrayList );                   }

路線檢索-步行檢索- public class WalkingSearchDemo  extends BaseActivity {

    private MKSearch  search;

    private int  indexPager;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        initSeach();

    }

    private void initSeach() {

        search =  new MKSearch();

        search.init( mapManager,  new BaseMKSearchListener() {

            @Override

            public void onGetWalkingRouteResult(MKWalkingRouteResult mkPoiResult,  int i) {

                super.onGetWalkingRouteResult(mkPoiResult, i);

                if (mkPoiResult !=  null && i ==  0) {

                    if (mkPoiResult.getNumPlan() >  0) {

                        RouteOverlay poiOverlay =  new RouteOverlay(WalkingSearchDemo. this,  mapview);

                        poiOverlay.setData(mkPoiResult.getPlan( 0).getRoute( 0));

                        mapview.getOverlays().add(poiOverlay);

                        mapview.refresh();

                    }  else {

                        Toast.makeText(WalkingSearchDemo. this,  " 此路不通 ", Toast. LENGTH_SHORT).show();

                    }

                }  else {

                    Toast.makeText(WalkingSearchDemo. this,  " 檢索未找到結果 ", Toast. LENGTH_SHORT).show();

                }

            }

            @Override

            public void onGetDrivingRouteResult(MKDrivingRouteResult mkPoiResult,  int i) {

                super.onGetDrivingRouteResult(mkPoiResult, i);

                if (mkPoiResult !=  null && i ==  0) {

                    if (mkPoiResult.getNumPlan() >  0) {

                        RouteOverlay poiOverlay =  new RouteOverlay(WalkingSearchDemo. this,  mapview);

                        poiOverlay.setData(mkPoiResult.getPlan( 0).getRoute( 0));

                        mapview.getOverlays().add(poiOverlay);

                        mapview.refresh();

                    }  else {

                        Toast.makeText(WalkingSearchDemo. this,  " 此路不通 ", Toast. LENGTH_SHORT).show();

                    }

                }  else {

                    Toast.makeText(WalkingSearchDemo. this,  " 檢索未找到結果 ", Toast. LENGTH_SHORT).show();

                }

            }

        });

路線檢索-換乘路線- public class TransitSearchDemo  extends BaseActivity {

    private MKSearch  search;

    private int  indexPager;

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        initSeach();

    }

    private void initSeach() {

        search =  new MKSearch();

        search.init( mapManager,  new BaseMKSearchListener() {

            @Override

            public void onGetTransitRouteResult(MKTransitRouteResult mkTransitRouteResult,  int i) {

                super.onGetTransitRouteResult(mkTransitRouteResult, i);

                if (mkTransitRouteResult !=  null && i ==  0) {

                    if (mkTransitRouteResult.getNumPlan() >  0) {

                        // 注意檢索的值超過 10 個隻顯示 10 ,需要分頁

                        // 得到興趣點

                        TransitOverlay poiOverlay =  new TransitOverlay(TransitSearchDemo. this,  mapview);

                        poiOverlay.setData(mkTransitRouteResult.getPlan( 0));

                        mapview.getOverlays().add(poiOverlay);

                        mapview.refresh();

                    }  else {

                        Toast.makeText(TransitSearchDemo. this,  " 此路不通 ", Toast. LENGTH_SHORT).show();

                    }

                }  else {

                    Toast.makeText(TransitSearchDemo. this,  " 檢索未找到結果 ", Toast. LENGTH_SHORT).show();

                }

            }

            @Override

            public void onGetWalkingRouteResult(MKWalkingRouteResult mkPoiResult,  int i) {

                super.onGetWalkingRouteResult(mkPoiResult, i);

                if (mkPoiResult !=  null && i ==  0) {

                    if (mkPoiResult.getNumPlan() >  0) {

                        RouteOverlay poiOverlay =  new RouteOverlay(TransitSearchDemo. this,  mapview);

                        poiOverlay.setData(mkPoiResult.getPlan( 0).getRoute( 0));

                        mapview.getOverlays().add(poiOverlay);

                        mapview.refresh();

                    }  else {

                        Toast.makeText(TransitSearchDemo. this,  " 此路不通 ", Toast. LENGTH_SHORT).show();

                    }

                }  else {

                    Toast.makeText(TransitSearchDemo. this,  " 檢索未找到結果 ", Toast. LENGTH_SHORT).show();

                }

            }

            @Override

            public void onGetDrivingRouteResult(MKDrivingRouteResult mkPoiResult,  int i) {

                super.onGetDrivingRouteResult(mkPoiResult, i);

                if (mkPoiResult !=  null && i ==  0) {

                    if (mkPoiResult.getNumPlan() >  0) {

                        RouteOverlay poiOverlay =  new RouteOverlay(TransitSearchDemo. this,  mapview);

                        poiOverlay.setData(mkPoiResult.getPlan( 0).getRoute( 0));

                        mapview.getOverlays().add(poiOverlay);

                        mapview.refresh();

                    }  else {

                        Toast.makeText(TransitSearchDemo. this,  " 此路不通 ", Toast. LENGTH_SHORT).show();

                    }

                }  else {

                    Toast.makeText(TransitSearchDemo. this,  " 檢索未找到結果 ", Toast. LENGTH_SHORT).show();

                }

            }

        });

    // 設定換乘政策

        search.setTransitPolicy(MKSearch. EBUS_TIME_FIRST);

//        city -  城市名,用于在哪個城市内進行檢索 ( 必須填寫 )

//        start -  檢索的起點,可通過關鍵字,坐标,兩種方式指定

//        end -  檢索的終點,可通過關鍵字,坐标,兩種方式指定

//        傳回:

//        成功傳回 0 ,否則傳回 -1

        MKPlanNode start =  new MKPlanNode();

        start. name =  " 尚矽谷 ";

        MKPlanNode end =  new MKPlanNode();

        end. name =  " 北京大學 ";

        int code =  search.transitSearch( " 北京 ", start, end);

        if(code == 0){

            Toast.makeText(TransitSearchDemo. this, " 檢索成功 ",Toast. LENGTH_SHORT).show();

        } else{

            Toast.makeText(TransitSearchDemo. this, " 檢索失敗 ",Toast. LENGTH_SHORT).show();

        }

    }

}

定位--MyLocationOverlay-

一個負責顯示使用者目前位置的 Overlay 。

在百度地圖移動版API中,提供一個重要的特色功能:定位,通過這個功能,能擷取到使用者目前所在位置。

在程式中,如果使用此功能,必須注冊GPS和網絡的使用權限。

在擷取使用者位置時,優先使用GPS進行定位;如果GPS定位沒有打開或者沒有可用位置資訊,則會通過判斷網絡是否連接配接(即确認手機是否能上網,不論是連接配接2G/3G或Wi-Fi網絡),如果是,則通過請求百度網絡定位服務,傳回網絡定位結果。為了使獲得的網絡定位結果更加精确,請打開手機的Wi-Fi開關。

目前系統自帶的網絡定位服務精度低,且服務不穩定、精度低,并且從未來的趨勢看,基站定位是不可控的(移動公司随時可能更改基站編号以壟斷定位服務),而Wi-Fi定位則不然,它是一種精度更高、不受管制的定位方法。國内其它使用Wi-Fi定位的地圖軟體,Wi-Fi定位基本不可用,百度的定位服務量化名額優秀,網絡接口傳回速度快(服務端每次定位響應時間50毫秒以内),平均精度70米,其中Wi-Fi精度40米左右,基站定位精度200米左右,覆寫率98%,在國内處于一枝獨秀的地位。

自2.0.0版本開始,MyLocationOverlay隻負責顯示我的位置,位置資料請使用百度定位SDK擷取,将擷取的位置資料放在一個LocationData結構中并用該結構設定MyLcationOverlay的資料源,即可建立MyLocationOverlay。

LocationData資料擷取

建立監聽器:當擷取到位置資訊時,将資訊添加到LocationData中,監聽器需要實作BDLocationListener接口,

兩個方法需要實作:

1.接收異步傳回的定位結果,參數是BDLocation類型參數。

2.接收異步傳回的POI查詢結果,參數是BDLocation類型參數。

監聽的設定:

建立LocationClient對象,注冊監聽registerLocationListener

設定定位參數(LocationClientOption):定位模式(單次定位,定時定位),傳回坐标類型,是否打開GPS等等。

通過LocationClient的start、stop控制定位資訊擷取,在做中間可以手動發起定位的請求requestLocation

注意

關于經緯度的說明:該經緯度資訊是經過加密處理,是以在其它地圖工具中測得的經緯度 資訊不适合百度的坐标系統。

使用百度經緯度坐标,可以通過 http://api.map.baidu.com/lbsapi/getpoint/index.html 查詢地理坐标如果需要在百度地圖上顯示使用其他坐标系統的位置,請發郵件至 [email protected] 申請坐标轉換接口

http://developer.baidu.com/map/geosdk-android-developv3.3.htm

option.setOpenGps(true);

option.setAddrType("all");//傳回的定位結果包含位址資訊

option.setCoorType("bd09ll");//傳回的定位結果是百度經緯度,預設值gcj02

option.setScanSpan(5000);//設定發起定位請求的間隔時間為5000ms

option.disableCache(true);//禁止啟用緩存定位

option.setPoiNumber(5); //最多傳回POI個數

option.setPoiDistance(1000); //poi查詢距離

option.setPoiExtraInfo(true); // 是否需要 POI 的電話和位址等詳細信

public class MyLocationOverlayDeom extends BaseActivity {

public LocationClient mLocationClient = null;

public BDLocationListener myListener = null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

initLocation();

}

@Override

protected void onResume() {

mLocationClient.registerLocationListener(myListener);

mLocationClient.requestLocation();

mLocationClient.start();

super.onResume();

}

@Override

protected void onPause() {

mLocationClient.unRegisterLocationListener(myListener);

mLocationClient.stop();

super.onPause();

}

private void initLocation() {

//1.發起定位請求

mLocationClient = new LocationClient(this);

    LocationClientOption option = new LocationClientOption();

    option.setOpenGps(true);

    option.setAddrType("all");//傳回的定位結果包含位址資訊

    option.setCoorType("bd09ll");//傳回的定位結果是百度經緯度,預設值gcj02

    option.setScanSpan(5000);//設定發起定位請求的間隔時間為5000ms

    option.disableCache(true);//禁止啟用緩存定位

    option.setPoiNumber(5); //最多傳回POI個數

    option.setPoiDistance(1000); //poi查詢距離

    option.setPoiExtraInfo(true); //是否需要POI的電話和位址等詳細資訊

    mLocationClient.setLocOption(option);

myListener = new MyListener();

mLocationClient.registerLocationListener(myListener);

//2.顯示結果

}

class MyListener implements BDLocationListener{

@Override

public void onReceiveLocation(BDLocation location) {

if(location ==null)

return;

MyLocationOverlay locationOverlay = new MyLocationOverlay(mapView);

LocationData arg0 = new LocationData();

arg0.longitude = location.getLongitude();

arg0.latitude = location.getLatitude();

locationOverlay.setData(arg0 );

mapView.getOverlays().clear();

mapView.getOverlays().add(locationOverlay);

mapView.refresh();

//地圖移動

controller.animateTo(new GeoPoint((int)(arg0.longitude*1E6), (int)(arg0.latitude*1E6)));

}

@Override

public void onReceivePoi(BDLocation poi) {

}

}

}

繼續閱讀