現在大多數應用的位置服務都是使用百度地圖和高德地圖提供的API了,今天我們也來看看百度地圖的使用。
如何獲得BaiduMap SDK
要使用百度地圖,首先我們要獲得baidu的Sdk,那麼如何去獲得呢?首先你要先有一個Baidu的賬號,這裏胡藏劍賬號不再描述。如何equest獲取Baidu地圖開發工具,看下面步驟:
1. 首先進入百度地圖API的官網。
2. 點擊“開發——>百度地圖SDK”。
3. 點擊右側邊框中的“相關下載”,然後點擊”一鍵下載”。這樣會將百度地圖的SDK,示例等一塊下載下來。
這樣我們就獲得了Baidu地圖開發的相關工具了。
如何使用BaiduMap
百度其實已經爲我們提供了幫助文檔,可以通過點擊右側邊框中的開發指南來獲得Baidu地圖的使用幫助:
在開發指南中我們首先可以閱讀簡介來了解Baidu SDK的基本功能,然後可以申請祕鑰, 申請祕鑰之後配置開發環境。然後通過提供的Hello BaiduMap使用示例來講解Baidu 地圖的基本使用。然後可以通過逐步的閱讀,構建自己應用中Map的功能。
下面來看博主的小小練習……
讓Map顯示出來
基本的配置在之前已經說了,可以參照Baidu “開發指南”上的說明文檔,很清楚的。我們下面之間看博主自己的使用。
1. 首先導入jar包和so包。
java的jar包,放置在libs文件夾下,so庫放置在main文件夾新建的jniLibs文件夾下。 so庫時C語言寫的一些邏輯,不需要關注。需要用到一些機制JNI java native interface。so導入的原因是爲了不同手機系統進行編譯。
然後講如下四個放置so的文件夾拷貝到jniLibs中:
2. 通過Android Studio “File——>Project Structure——>Dependencies”中的File Dependency將我們剛纔拷貝的那兩個jar包導入。
3. 設置祕鑰。將”開發者 key”替換成自己在百度上申請的Ak。
<application>
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="開發者 key" />
</application>
4. 添加權限。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
5. 在佈局xml文件中添加地圖控件。
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
6. 在應用程序創建時初始化 SDK引用的Context 全局變量,並創建地圖Activity,管理地圖生命週期。
public class MainActivity extends Activity {
MapView mMapView = null;//地圖視圖
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//使用BaiduMap SDK
//在使用SDK各組件之前初始化context信息,傳入ApplicationContext
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
//獲取地圖控件引用
mMapView = (MapView) findViewById(R.id.bmapView);//獲得地圖視圖的對象
}
/*
Activity關閉時將地圖關閉
*/
@Override
protected void onDestroy() {
super.onDestroy();
//在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理
mMapView.onDestroy();
}
/*
ActivityonResume時,將地圖onResume。
*/
@Override
protected void onResume() {
super.onResume();
//在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理
mMapView.onResume();
}
/*
ActivityonPause時,將地圖onPause。
*/
@Override
protected void onPause() {
super.onPause();
//在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理
mMapView.onPause();
}
}
這樣我們的地圖即可即基本顯示了……
讓地址轉化爲緯度精度
在BaiduMap中,給我們提供了將具體地址轉換爲緯度經度,將緯度經度轉化爲具體地址的一個功能。我們參照Baidu給我們提供的Demo來學習具體地址轉緯度經度:
public class MainActivity extends Activity implements View.OnClickListener {
private Button mButtonOne;//獲取地址一按鈕
private Button mButtonTwo;//獲取地址二按鈕
MapView mMapView = null;//地圖視圖
BaiduMap mBaiduMap;//地圖對象
//通過地址獲得經緯度
GeoCoder mSearch = null; // 搜索模塊,也可去掉地圖模塊獨立使用
public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//使用BaiduMap SDK
//在使用SDK各組件之前初始化context信息,傳入ApplicationContext
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
//獲取地圖控件引用
mMapView = (MapView) findViewById(R.id.bmapView);//獲得地圖視圖的對象
mBaiduMap = mMapView.getMap();//獲得地圖對象
//初始化搜索模塊,註冊事件監聽
mSearch = GeoCoder.newInstance();//獲得搜索的對象
mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MainActivity.this, "抱歉,未能找到結果", Toast.LENGTH_LONG)
.show();
return;
}
mBaiduMap.addOverlay(new MarkerOptions().position(geoCodeResult.getLocation())
.icon(BitmapDescriptorFactory
.fromResource(R.mipmap.icon_marka)));
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(geoCodeResult
.getLocation()));
String strInfo = String.format("緯度:%f 經度:%f",
geoCodeResult.getLocation().latitude, geoCodeResult.getLocation().longitude);
Log.d("data", strInfo);
Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show();
}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
}
});
//獲取佈局中的各個控件對象
mButtonOne = (Button) findViewById(R.id.button_one);
mButtonTwo = (Button) findViewById(R.id.button_two);
//設置點擊事件
mButtonOne.setOnClickListener(this);
mButtonTwo.setOnClickListener(this);
}
/*
Activity關閉時將地圖關閉
*/
@Override
protected void onDestroy() {
super.onDestroy();
//在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理
mMapView.onDestroy();
}
/*
ActivityonResume時,將地圖onResume。
*/
@Override
protected void onResume() {
super.onResume();
//在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理
mMapView.onResume();
}
/*
ActivityonPause時,將地圖onPause。
*/
@Override
protected void onPause() {
super.onPause();
//在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理
mMapView.onPause();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button_one:
//獲得天安門的地址
mSearch.geocode(new GeoCodeOption().city("北京市").address("海淀區中關村海龍大廈"));
break;
case R.id.button_two:
//獲得中關村的地址
mSearch.geocode(new GeoCodeOption().city("北京市").address("西城區西便門"));
break;
}
}
}
通過“北京市海淀區中關村海龍大廈”地址獲得的緯度經度定位:
通過“北京市西城區西便門”地址獲得的緯度經度定位:
在Map上繪製連線
public class MainActivity extends Activity implements View.OnClickListener {
private Button mButtonOne;//獲取地址一按鈕
private Button mButtonTwo;//獲取地址二按鈕
private Button mButtonLine;//劃線按鈕
MapView mMapView = null;//地圖視圖
BaiduMap mBaiduMap;//地圖對象
//連線點的集合
private List<LatLng> points = new ArrayList<LatLng>();
//通過地址獲得經緯度
GeoCoder mSearch = null; // 搜索模塊,也可去掉地圖模塊獨立使用
public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//使用BaiduMap SDK
//在使用SDK各組件之前初始化context信息,傳入ApplicationContext
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
//獲取地圖控件引用
mMapView = (MapView) findViewById(R.id.bmapView);//獲得地圖視圖的對象
mBaiduMap = mMapView.getMap();//獲得地圖對象
//初始化搜索模塊,註冊事件監聽
mSearch = GeoCoder.newInstance();//獲得搜索的對象
mSearch.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
Toast.makeText(MainActivity.this, "抱歉,未能找到結果", Toast.LENGTH_LONG)
.show();
return;
}
mBaiduMap.addOverlay(new MarkerOptions().position(geoCodeResult.getLocation())
.icon(BitmapDescriptorFactory
.fromResource(R.mipmap.icon_marka)));
mBaiduMap.setMapStatus(MapStatusUpdateFactory.newLatLng(geoCodeResult.getLocation()));
//添加點
LatLng p = new LatLng(geoCodeResult.getLocation().latitude,geoCodeResult.getLocation().longitude);
points.add(p);
String strInfo = String.format("緯度:%f 經度:%f",
geoCodeResult.getLocation().latitude, geoCodeResult.getLocation().longitude);
Log.d("data", strInfo);
Toast.makeText(MainActivity.this, strInfo, Toast.LENGTH_LONG).show();
}
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
}
});
//獲取佈局中的各個控件對象
mButtonOne = (Button) findViewById(R.id.button_one);
mButtonTwo = (Button) findViewById(R.id.button_two);
mButtonLine = (Button) findViewById(R.id.button_three);
//設置點擊事件
mButtonOne.setOnClickListener(this);
mButtonTwo.setOnClickListener(this);
mButtonLine.setOnClickListener(this);
}
/*
Activity關閉時將地圖關閉
*/
@Override
protected void onDestroy() {
super.onDestroy();
//在activity執行onDestroy時執行mMapView.onDestroy(),實現地圖生命週期管理
mMapView.onDestroy();
}
/*
ActivityonResume時,將地圖onResume。
*/
@Override
protected void onResume() {
super.onResume();
//在activity執行onResume時執行mMapView. onResume (),實現地圖生命週期管理
mMapView.onResume();
}
/*
ActivityonPause時,將地圖onPause。
*/
@Override
protected void onPause() {
super.onPause();
//在activity執行onPause時執行mMapView. onPause (),實現地圖生命週期管理
mMapView.onPause();
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button_one:
//獲得中關村海龍大廈的地址
mSearch.geocode(new GeoCodeOption().city("北京市").address("海淀區中關村海龍大廈"));
break;
case R.id.button_two:
//獲得便門的地址
mSearch.geocode(new GeoCodeOption().city("北京市").address("西城區西便門"));
break;
case R.id.button_three:
//獲得當地的地址
// 添加折線
OverlayOptions ooPolyline = new PolylineOptions().width(10).color(0xAAFF0000).points(points);
mBaiduMap.addOverlay(ooPolyline);
break;
}
}
}
添加折線使用我們首先要獲得我們要連接的點:
//傳入經度和緯度
LatLng point = new LatLng(geoCodeResult.getLocation().latitude,geoCodeResult.getLocation().longitude);
然後將這些點保存在集合中:
//聲明一個全局變量,創建點的集合
private List<LatLng> points = new ArrayList<LatLng>();
//在確定點的位置,將點添加到集合中
points.ass(point);
在點擊按鈕處,將點連接成線:
// 添加折線
OverlayOptions ooPolyline = new PolylineOptions().width(10).color(0xAAFF0000).points(points);
mBaiduMap.addOverlay(ooPolyline);