什麼是百度地圖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
擷取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) { } } } |