1. 程式人生 > 實用技巧 >百度地圖SDK2.0周邊探索

百度地圖SDK2.0周邊探索

>>> hot3.png

周邊檢索:根據檢索詞、中心點地理座標和半徑與發起周邊檢索。

實現場景:查詢以上海市浦東新區為中心,半徑為1000米內所有的“浦東發展銀行”(搜周邊)。

實現步驟:

一、前提條件:

搭建百度地圖開發環境;

地圖引擎管理物件和顯示地圖的View物件,都已建立並初始化;

MapView物件的相關屬性已設定,生命週期函式也已處理。

詳見:Android 百度地圖SDK (v2.0.0)初探(一樓)

二、檢索以上海市浦東新區為中心,半徑為1000米內所有的“浦東發展銀行”(搜周邊)的具體實現步驟:

1、建立搜尋服務類物件,並初始化。程式碼如下:


[mw_shl_code=java,true] mMKSearch = new MKSearch();

mMKSearch.init(mBMapManager, new MKSearchListener() {

@Override
public void onGetAddrResult(MKAddrInfo arg0, int arg1) {
// TODO Auto-generated method stub

}

@Override
public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {
// TODO Auto-generated method stub

}

@Override
public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) {
// TODO Auto-generated method stub

}

@Override
public void onGetPoiResult(MKPoiResult result, int type, int error) {

}

@Override
public void onGetPoiDetailSearchResult(int type, int error) {

}

@Override
public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {
// TODO Auto-generated method stub

}

@Override
public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {
// TODO Auto-generated method stub

}

@Override
public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) {
// TODO Auto-generated method stub

}

});[/mw_shl_code]
2、 呼叫mMKSearch物件的mMKSearch.poiSearchNearBy(arg0, arg1, arg2)方法,引數列表:關鍵詞、中心點地理座標、半徑,單位:米。
[mw_shl_code=java,true] // 根據中心點、半徑與檢索詞發起周邊檢索.
// 引數列表:關鍵詞、中心點地理座標、半徑,單位:米
mMKSearch.poiSearchNearBy("浦東發展銀行", mGeoPoint, 1000);[/mw_shl_code]
3、在onGetPoiResult()回撥方法內處理檢索到的結果。
[mw_shl_code=java,true]@Override
public void onGetPoiResult(MKPoiResult result, int type, int error) {
if (error != 0) {
Toast.makeText(BaiduMapPoiOverlayActivity.this,
"抱歉,未查詢到結果",
Toast.LENGTH_SHORT).show();
} else {
if (result == null) {
Toast.makeText(BaiduMapPoiOverlayActivity.this,
"抱歉,您填寫的搜尋條件,未查詢到結果,換個條件試試!",
Toast.LENGTH_SHORT).show();
return;
}

// 建立POI內建的Overlay物件
PoiOverlay poiOverlay = new PoiOverlay(BaiduMapPoiOverlayActivity.this, mMapView);
// 符合搜尋條件的所有點
poiOverlay.setData(result.getAllPoi());
// 向覆蓋物列表中新增覆蓋物物件PoiOverlay
mMapView.getOverlays().add(poiOverlay);
// 重新整理地圖
mMapView.refresh();
}
}[/mw_shl_code]

4、執行效果圖如下:

23102348_MZPj.jpg


三、檢視檢索到的POI詳情:

1、在前面我們以上海市浦東新區為中心,半徑為1000米內所有的“浦東發展銀行”,檢索得到的是一個POI的列表。程式碼如下:


[mw_shl_code=java,true]ArrayList<MKPoiInfo> mkPois = result.getAllPoi();[/mw_shl_code]

注:a. result是MKPoiResult類物件的一個引用。

b. POI是中國POI(Point of Interest)資料庫的縮寫,可以翻譯成“興趣點”, 每個POI包含四方面資訊,名稱、類別、經度、緯度。這個計劃的遠景目標是建立全國的POI資料庫,並且全部開放。
2、從POI的列表中取出一個元素:


[mw_shl_code=java,true]MKPoiInfo mkPoi = mkPois.get(1);[/mw_shl_code]
3、發起檢視詳細資訊的請求:
[mw_shl_code=java,true] mMKSearch.poiDetailSearch(mkPoi.uid);
[/mw_shl_code]

4、需要在AndroidManifest.xml中設定如下資訊:

注:呼叫百度API裡的POI詳細資訊展示Activity,官方給的有錯誤。


[mw_shl_code=java,true] <activity
android:configChanges="orientation|keyboardHidden"
android:name="com.baidu.mapapi.search.PlaceCaterActivity"
android:theme="@android:style/Theme.NoTitleBar" >
</activity>[/mw_shl_code]
5、處理onGetPoiDetailSearchResult()回撥方法:
[mw_shl_code=java,true]@Override
public void onGetPoiDetailSearchResult(int type, int error) {
// type - 值為GeoSearchManager.GEO_SEARCH_DETAILS
if (error != 0) {
Toast.makeText(BaiduMapPoiOverlayActivity.this, "抱歉,未找到結果", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(BaiduMapPoiOverlayActivity.this, "成功,檢視詳情頁面", Toast.LENGTH_SHORT).show();
}
}[/mw_shl_code]

6、執行效果圖如下:

23102348_RXHV.jpg


三、完整程式碼:

1、在AndroidManifest.xml中的配置:


[mw_shl_code=java,true]<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.baidu.map"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk android:minSdkVersion="8" />

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:configChanges="orientation|keyboardHidden"
android:label="@string/app_name"
android:name=".BaiduMapPoiOverlayActivity"
android:screenOrientation="sensor" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

<activity
android:configChanges="orientation|keyboardHidden"
android:name="com.baidu.mapapi.search.PlaceCaterActivity"
android:theme="@android:style/Theme.NoTitleBar" >
</activity>
</application>

<!-- 使用網路功能所需許可權 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.INTERNET" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
</uses-permission>

<!-- 讀取手機的當前狀態許可權,沒有的話會報錯,這個是使用百度地圖API必須的 -->
<uses-permission android:name="android.permission.READ_PHONE_STATE" >
</uses-permission>

<!-- Cache功能需要讀寫外部儲存器 ,若沒這個許可權,地圖載入不出來 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
</uses-permission>

<supports-screens
android:anyDensity="true"
android:largeScreens="true"
android:normalScreens="true"
android:resizeable="true"
android:smallScreens="true" />

</manifest>[/mw_shl_code]
2、繼承自Activity類的子類的完整程式碼:
[mw_shl_code=java,true]package com.android.baidu.map;

import java.util.ArrayList;

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

import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.map.MKEvent;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.PoiOverlay;
import com.baidu.mapapi.search.MKAddrInfo;
import com.baidu.mapapi.search.MKBusLineResult;
import com.baidu.mapapi.search.MKDrivingRouteResult;
import com.baidu.mapapi.search.MKPoiInfo;
import com.baidu.mapapi.search.MKPoiResult;
import com.baidu.mapapi.search.MKSearch;
import com.baidu.mapapi.search.MKSearchListener;
import com.baidu.mapapi.search.MKSuggestionResult;
import com.baidu.mapapi.search.MKTransitRouteResult;
import com.baidu.mapapi.search.MKWalkingRouteResult;
import com.baidu.platform.comapi.basestruct.GeoPoint;

/**
* 根據檢索詞、中心點地理座標和半徑與發起周邊檢索.
* @author android_ls
*
*/
public class BaiduMapPoiOverlayActivity extends Activity {

/**地圖引擎管理類*/
private BMapManager mBMapManager = null;

/**顯示地圖的View*/
private MapView mMapView = null;

/**搜尋服務,用於位置檢索、周邊檢索、範圍檢索、公交檢索、駕乘檢索、步行檢索*/
private MKSearch mMKSearch = null;

/**
* 經研究發現在申請KEY時:應用名稱一定要寫成my_app_應用名(也就是說"my_app_"是必須要有的)。
* 百度地圖SDK提供的服務是免費的,介面無使用次數限制。您需先申請金鑰(key),才可使用該套SDK。
* */
public static final String BAIDU_MAP_KEY = "07418AEC69BAAB7104C6230A6120C580DFFAEEBB";

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// 注意:請在呼叫setContentView前初始化BMapManager物件,否則會報錯
mBMapManager = new BMapManager(this.getApplicationContext());
mBMapManager.init(BAIDU_MAP_KEY, new MKGeneralListener() {

@Override
public void onGetNetworkState(int iError) {
if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
Toast.makeText(BaiduMapPoiOverlayActivity.this.getApplicationContext(),
"您的網路出錯啦!",
Toast.LENGTH_LONG).show();
}
}

@Override
public void onGetPermissionState(int iError) {
if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
// 授權Key錯誤:
Toast.makeText(BaiduMapPoiOverlayActivity.this.getApplicationContext(),
"請在 DemoApplication.java檔案輸入正確的授權Key!",
Toast.LENGTH_LONG).show();
}
}
});

setContentView(R.layout.main);

mMapView = (MapView) this.findViewById(R.id.bmapsView);
// 設定啟用內建的縮放控制元件
mMapView.setBuiltInZoomControls(true);

MapController mapController = mMapView.getController();
// 上海市浦東新區的GPS緯度經度值:31.224078,121.540419
GeoPoint mGeoPoint = new GeoPoint(
(int) (31.224078 * 1E6),
(int) (121.540419 * 1E6));

// 設定地圖的中心點
mapController.setCenter(mGeoPoint);
mapController.setZoom(15);

mMKSearch = new MKSearch();
mMKSearch.init(mBMapManager, new MKSearchListener() {

@Override
public void onGetAddrResult(MKAddrInfo arg0, int arg1) {
// TODO Auto-generated method stub

}

@Override
public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {
// TODO Auto-generated method stub

}

@Override
public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) {
// TODO Auto-generated method stub

}

@Override
public void onGetPoiResult(MKPoiResult result, int type, int error) {
if (error != 0) {
Toast.makeText(BaiduMapPoiOverlayActivity.this,
"抱歉,未查詢到結果",
Toast.LENGTH_SHORT).show();
} else {
if (result == null) {
Toast.makeText(BaiduMapPoiOverlayActivity.this,
"抱歉,您填寫的搜尋條件,未查詢到結果,換個條件試試!",
Toast.LENGTH_SHORT).show();
return;
}

// 建立POI內建的Overlay物件
PoiOverlay poiOverlay = new PoiOverlay(BaiduMapPoiOverlayActivity.this, mMapView);
// 符合搜尋條件的所有點
poiOverlay.setData(result.getAllPoi());
// 向覆蓋物列表中新增覆蓋物物件PoiOverlay
mMapView.getOverlays().add(poiOverlay);
// 重新整理地圖
mMapView.refresh();

/* 注: POI是中國POI(Point of Interest)資料庫的縮寫,可以翻譯成“興趣點”,
* 每個POI包含四方面資訊,名稱、類別、經度、緯度。
* 這個計劃的遠景目標是建立全國的POI資料庫,並且全部開放。*/

// 當執行完POI檢索後,我們會得到一個POI的列表。
ArrayList<MKPoiInfo> mkPois = result.getAllPoi();
// 取POI列表中的第二個元素
MKPoiInfo mkPoi = mkPois.get(1);
/* 每個POI節點都有個uid屬性,我們可以根據這個uid獲取關於這個poi的一些更詳細的資訊。
* 比如:評論、圖片、商戶描述等。*/

// 發起檢視詳細資訊的請求
mMKSearch.poiDetailSearch(mkPoi.uid);
}
}

@Override
public void onGetPoiDetailSearchResult(int type, int error) {
// type - 值為GeoSearchManager.GEO_SEARCH_DETAILS
if (error != 0) {
Toast.makeText(BaiduMapPoiOverlayActivity.this, "抱歉,未找到結果", Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(BaiduMapPoiOverlayActivity.this, "成功,檢視詳情頁面", Toast.LENGTH_SHORT).show();
}
}

@Override
public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {
// TODO Auto-generated method stub

}

@Override
public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {
// TODO Auto-generated method stub

}

@Override
public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) {
// TODO Auto-generated method stub

}

});

// 根據中心點、半徑與檢索詞發起周邊檢索.
// 引數列表:關鍵詞、中心點地理座標、半徑,單位:米
mMKSearch.poiSearchNearBy("浦東發展銀行", mGeoPoint, 1000);

}

// 重寫以下方法,管理API
@Override
protected void onResume() {
mMapView.onResume();
if (mBMapManager != null) {
mBMapManager.start();
}
super.onResume();
}

@Override
protected void onPause() {
mMapView.onPause();
if (mBMapManager != null) {
mBMapManager.stop();
}
super.onPause();
}

@Override
protected void onDestroy() {
mMapView.destroy();
if (mBMapManager != null) {
mBMapManager.destroy();
mBMapManager = null;
}
super.onDestroy();
}
}[/mw_shl_code]


轉載於:https://my.oschina.net/boonya/blog/317250