26 百度地图的使用
- 1 先申请key 详细步骤
2 配置环境变量(poi)
- 百度详细图文介绍
- 这里推荐下载SDK后用sample 中的jar包和类库
2 配置定位的环境(上面的不一样 如果你只需要定位看这里即可)
- 百度图文详细介绍
- 这里推荐下载SDK后用sample 中的jar包和类库
案例一 显示百度地图
package com.qf.sxy.day27_baidumap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.MapView;
public class MainActivity extends AppCompatActivity {
MapView mMapView = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
//获取地图控件引用
mMapView = (MapView) findViewById(R.id.bmapView);
}
/**
* 管理百度地图的生命周期
*/
@Override
protected void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
}
- 当然初始化代码可以写application
SDKInitializer.initialize(getApplicationContext());
- 例子
package com.qf.sxy.day27_baidumap;
import android.app.Application;
import com.baidu.mapapi.SDKInitializer;
/**
* Created by sxy on 2016/9/27.
*
* 使用Application做全局初始化
* note:必须在清单文件进行注册 android:name=".MyApplication"
* 否则 写没写这个Application是没有作用
*/
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
}
}
- 注意需要在清单文件注册
<application
android:name=".MyApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
案例二 覆盖物
说明:在地图上某个点显示个图标或者View等
package com.qf.sxy.day27_baidumap;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Button;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.LogoPosition;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.Marker;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
/**
* 添加覆盖物
* 步骤:
* 1,获取Baidumap对象
* 2,给Baidumap添加覆盖物 addOverlay
* 3,给覆盖物添加点击监听
*/
public class OverlayActivity extends AppCompatActivity {
private MapView mapView;
private BaiduMap baiduMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_overlay);
mapView = ((MapView) findViewById(R.id.bmapView));
mapView.setLogoPosition(LogoPosition.logoPostionRightBottom);
//获取百度地图对象
baiduMap = mapView.getMap();
// //地图类型 卫星
// baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
// //MAP_TYPE_NONE 空白的
// baiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);
//普通的
// baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
//
// //开启交通图
// baiduMap.setTrafficEnabled(true);
//
// //开启交通图
// baiduMap.setBaiduHeatMapEnabled(true);
//获取图标
BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
//获取当前坐标
final LatLng latLng = new LatLng(40.089597, 116.419385);
//获取OverlayOptions 对象 设置图标
OverlayOptions options= new MarkerOptions().icon(bitmapDescriptor).position(latLng).title("天通苑");
//添加覆盖物
baiduMap.addOverlay(options);
//覆盖物的点击监听
baiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
Button btn = new Button(OverlayActivity.this);
btn.setBackgroundColor(Color.WHITE);
btn.setText(marker.getTitle());
BitmapDescriptor descriptor = BitmapDescriptorFactory.fromView(btn);
/**
* 参数1:图片 当然这也可以放View等
* 参数2:坐标点
* 参数3:y轴的偏移量
* 参数4:提示的监听
*/
InfoWindow infoWindow = new InfoWindow(descriptor, latLng, -50, new InfoWindow.OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick() {
//隐藏
baiduMap.hideInfoWindow();
}
});
//设置提示
baiduMap.showInfoWindow(infoWindow);
return false;
}
});
}
}
案例三 路线规划
说明:制定两个点的的路线图
package com.qf.sxy.day27_baidumap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.search.route.BikingRouteResult;
import com.baidu.mapapi.search.route.DrivingRouteLine;
import com.baidu.mapapi.search.route.DrivingRoutePlanOption;
import com.baidu.mapapi.search.route.DrivingRouteResult;
import com.baidu.mapapi.search.route.OnGetRoutePlanResultListener;
import com.baidu.mapapi.search.route.PlanNode;
import com.baidu.mapapi.search.route.RoutePlanSearch;
import com.baidu.mapapi.search.route.TransitRouteResult;
import com.baidu.mapapi.search.route.WalkingRouteResult;
import com.qf.sxy.day27_baidumap.utils.DrivingRouteOverlay;
import java.util.List;
/**
* 路线规划步骤:
* 1,获取路线规划对象RoutePlanSearch
* 2,对路线规划对象进行监听
* 3,开启路线查询(有四种)
* 4,在监听中 进行处理 获取路线覆盖物 将其添加到地图 可以进行点击监听节点
*/
public class RouteActivity extends AppCompatActivity {
private MapView mMapView;
private BaiduMap mBaiduMap;
//路线规划的对象
private RoutePlanSearch mRoutePlanSearch;
private DrivingRouteLine drivingRouteLine;//这个路线展示到Map
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_route);
mMapView = ((MapView) findViewById(R.id.bmapView));
//获取百度地图对象
mBaiduMap = mMapView.getMap();
//获取路线规划对象
mRoutePlanSearch = RoutePlanSearch.newInstance();
//对路线规划进行监听
mRoutePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() {
@Override
public void onGetWalkingRouteResult(WalkingRouteResult walkingRouteResult) {
//走路的规划
}
@Override
public void onGetTransitRouteResult(TransitRouteResult transitRouteResult) {
//公交的规划
}
@Override
public void onGetDrivingRouteResult(DrivingRouteResult drivingRouteResult) {
//自己开车
//获取所有的路线
List<DrivingRouteLine> lines = drivingRouteResult.getRouteLines();
if(lines!=null&&lines.size()>0){//说明有路线
Log.e("AAA","==="+lines.size());
drivingRouteLine = lines.get(0);//这里我们只获取其中一条路径
}else{
Log.e("AAA","==没有路==");
}
//将路线展示到地图 以覆盖物---这类给sample类帮我们画出 开头和结尾还有中间的路
MyOverlay myOverlay = new MyOverlay(mBaiduMap);
//将开车的路线 给覆盖物
myOverlay.setData(drivingRouteLine);
//对路线覆盖物监听 myOverlay内部实现了new BaiduMap.OnMarkerClickListener()方法
//监听地图上的箭头图片 (图片每次有转向路口都会有个箭头图片 点击图片显示相应的转向提示)
mBaiduMap.setOnMarkerClickListener(myOverlay);
//将覆盖物添加到地图
myOverlay.addToMap();
}
@Override
public void onGetBikingRouteResult(BikingRouteResult bikingRouteResult) {
//骑自行车行
}
});
//开启路线查询
mRoutePlanSearch.drivingSearch(new DrivingRoutePlanOption().
from(PlanNode.withCityNameAndPlaceName("北京","北京科技职业学院")).
to(PlanNode.withCityNameAndPlaceName("北京","北京西站")));
}
//开车的覆盖物 此类继承是百度sample中的类
public class MyOverlay extends DrivingRouteOverlay{
/**
* 构造函数
*
* @param baiduMap 该DrivingRouteOvelray引用的 BaiduMap
*/
public MyOverlay(BaiduMap baiduMap) {
super(baiduMap);
}
//路线节点的 点击监听
@Override
public boolean onRouteNodeClick(int i) {
//监听地图上的箭头图片 (图片每次有转向路口都会有个箭头图片 点击图片显示相应的转向提示)
//获取所有的节点
List<DrivingRouteLine.DrivingStep> lists = drivingRouteLine.getAllStep();
DrivingRouteLine.DrivingStep step = lists.get(i);
Log.e("AAAA","==>"+step.getInstructions());
return super.onRouteNodeClick(i);
}
}
}
- 示例图:
说明:图中箭头就是监听事件
案例四 POI搜索 商铺
- POI是“Point of Interest”的缩写,中文可以翻译为“兴趣点”。在地理信息系统中,一个POI可以是一栋房子、一个商铺、一个邮筒、一个公交站等。
package com.qf.sxy.day27_baidumap;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.InfoWindow;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiCitySearchOption;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiDetailSearchOption;
import com.baidu.mapapi.search.poi.PoiIndoorResult;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;
import com.qf.sxy.day27_baidumap.utils.PoiOverlay;
import java.util.List;
/**
* 1,获取对象
* 2,设置监听
* 3,开启搜索
*/
public class PoiSearchActivity extends AppCompatActivity {
private MapView mMapView;
private EditText mEtKey;
private BaiduMap mBaiduMap ;
private PoiSearch mPoiSearch;//Poi检索的对象
private PoiInfo poiInfo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_poi_search);
mMapView = ((MapView) findViewById(R.id.bmapView));
mEtKey = ((EditText) findViewById(R.id.et_key));
mBaiduMap = mMapView.getMap();
}
//点击按钮开始搜索
public void findClick(View view) {
String keyStr = mEtKey.getText().toString().trim();
if(TextUtils.isEmpty(keyStr)){
Log.e("AAA","当前搜索的关键字为null");
return;
}
//实例化检索对象
mPoiSearch = PoiSearch.newInstance();
//Poi搜索的监听
mPoiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
@Override
public void onGetPoiResult(PoiResult poiResult) {
//Poi搜索的结果
//清除之前的数据
mBaiduMap.clear();
MyPoiOverlay myPoiOverlay = new MyPoiOverlay(mBaiduMap);
myPoiOverlay.setData(poiResult);
mBaiduMap.setOnMarkerClickListener(myPoiOverlay);
myPoiOverlay.addToMap();
}
@Override
public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
//得到结果的详情
Intent intent = new Intent(PoiSearchActivity.this,PoidetailActivity.class);
intent.putExtra("url",poiDetailResult.getDetailUrl());
startActivity(intent);
}
@Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
//获取室内的结果
}
});
//开启搜索 搜索所在的城市 关键字
mPoiSearch.searchInCity(new PoiCitySearchOption().city("北京").keyword(keyStr));
// LatLng llC = new LatLng(39.639723, 118.425541);
// LatLng llD = new LatLng(39.906965, 118.401394);
//坐标点的附近
// mPoiSearch.searchNearby(new PoiNearbySearchOption().location(llC).keyword())
//区域 设置俩个坐标点 左上 右下
// LatLngBounds latLngBounds = new LatLngBounds.Builder().include(llC).include(llD).build();
// mPoiSearch.searchInBound(new PoiBoundSearchOption().bound(latLngBounds))
}
//Poi搜索的覆盖物 此类事sample
class MyPoiOverlay extends PoiOverlay{
/**
* 构造函数
*
* @param baiduMap 该 PoiOverlay 引用的 BaiduMap 对象
*/
public MyPoiOverlay(BaiduMap baiduMap) {
super(baiduMap);
}
//点击覆盖物的监听
@Override
public boolean onPoiClick(int i) {
//获取Poi所有节点
List<PoiInfo> list = getPoiResult().getAllPoi();
//获取点击的节点
poiInfo = list.get(i);
Button button = new Button(getApplicationContext());
button.setBackgroundColor(Color.GREEN);
button.setText(poiInfo.name);
BitmapDescriptor descriptor = BitmapDescriptorFactory.fromView(button);
InfoWindow infoWindow = new InfoWindow(descriptor, poiInfo.location, -100, new InfoWindow.OnInfoWindowClickListener() {
@Override
public void onInfoWindowClick() {
//根据Uid搜索详情 此时回调mPoiSearch的onGetPoiDetailResult方法
mPoiSearch.searchPoiDetail(new PoiDetailSearchOption().poiUid(poiInfo.uid));
mBaiduMap.hideInfoWindow();
}
});
mBaiduMap.showInfoWindow(infoWindow);
return super.onPoiClick(i);
}
}
}
package com.qf.sxy.day27_baidumap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class PoidetailActivity extends AppCompatActivity {
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_poidetail);
mWebView = ((WebView) findViewById(R.id.webView));
mWebView.getSettings().setJavaScriptEnabled(true);
String url = getIntent().getStringExtra("url");
mWebView.setWebViewClient(new WebViewClient() {
//重写了 shouldOverrideUrlLoading()方法。这就表明当需要从一个网页跳转到另一个网页时,我们希望目标网页仍然在当前 WebView 中显示,而不是打开系统浏览器
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url); // 根据传入的参数再去加载新的网页
return true; // 表示当前WebView可以处理打开新网页的请求,不用借助系统浏览器
}
});
mWebView.loadUrl(url);
}
}
案例五 POI 查找公交路线
package com.qf.sxy.day27_baidumap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.search.busline.BusLineResult;
import com.baidu.mapapi.search.busline.BusLineSearch;
import com.baidu.mapapi.search.busline.BusLineSearchOption;
import com.baidu.mapapi.search.busline.OnGetBusLineSearchResultListener;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiCitySearchOption;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiIndoorResult;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;
import com.qf.sxy.day27_baidumap.utils.BusLineOverlay;
public class BusLineSearchActivity extends AppCompatActivity {
private MapView mapView;
private BaiduMap baiduMap;
private EditText etBus;
private PoiSearch poiSearch;
private BusLineSearch busLineSearch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_bus_line_search);
mapView = ((MapView) findViewById(R.id.bmapView));
baiduMap = mapView.getMap();
etBus = ((EditText) findViewById(R.id.et_bus));
busLineSearch= BusLineSearch.newInstance();
busLineSearch.setOnGetBusLineSearchResultListener(new OnGetBusLineSearchResultListener() {
@Override
public void onGetBusLineResult(BusLineResult busLineResult) {
if(busLineResult!=null&&busLineResult.error == SearchResult.ERRORNO.NO_ERROR){
//删除原来的覆盖物
baiduMap.clear();
//一个显示公交站点类
BusLineOverlay overlay = new BusLineOverlay(baiduMap);
overlay.setData(busLineResult);
overlay.addToMap();
}
}
});
//poi
poiSearch = PoiSearch.newInstance();
poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {
@Override
public void onGetPoiResult(PoiResult poiResult) {
if(poiResult!=null&&poiResult.error== SearchResult.ERRORNO.NO_ERROR){
//可能查到多个 这里我们只取第一个
String uid = poiResult.getAllPoi().get(0).uid;
busLineSearch.searchBusLine(new BusLineSearchOption().city("北京").uid(uid));
}
}
@Override
public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {
}
@Override
public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {
}
});
}
public void searchClick(View view) {
//开启搜索 城市 关键字 公交号 476
poiSearch.searchInCity(new PoiCitySearchOption().city("北京").keyword(etBus.getText().toString().trim()));
}
}
案例六 定位
注意安卓6.0的运行时权限
安卓6.0运行时权限
所需:
liblocSDK6a.so
locSDK_6.13.jar
package com.qf.sxy.day27_baidumap;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MarkerOptions;
import com.baidu.mapapi.map.OverlayOptions;
import com.baidu.mapapi.model.LatLng;
public class LocationActivity extends AppCompatActivity {
private MapView mapView;
private BaiduMap baiduMap;
//定位对象
private LocationClient locationClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_location);
mapView = ((MapView) findViewById(R.id.bmapView));
baiduMap = mapView.getMap();
locationClient = new LocationClient(LocationActivity.this);
//对定位的设置
LocationClientOption option = new LocationClientOption();
/**
* LocationClientOption.LocationMode.Battery_Saving:低功耗定位 不用GPS (wifi 基站)
*
* LocationClientOption.LocationMode.Hight_Accuracy:高精度定位 全开GPS wifi 基站
*
* LocationClientOption.LocationMode.Device_Sensors 仅仅使用设备 GPS 不支持室内
*/
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
/**
* bd09ll:百度经纬度坐标
* bd09:墨卡托坐标
* gcjo2:国家测量局坐标
*/
option.setCoorType("bd09ll");
//设置定位间隔时间 每隔两秒记录一次位置
option.setScanSpan(1000*2);
//设置定位超出时间
option.setTimeOut(1000*10);
//是否需要得到地址
option.setIsNeedAddress(true);
//是否设置手机 机头方向
option.setNeedDeviceDirect(true);
//2给定位对象进行设置
locationClient.setLocOption(option);
//3监听
locationClient.registerLocationListener(new BDLocationListener() {
@Override
public void onReceiveLocation(BDLocation bdLocation) {
//获取坐标 bdLocation.getLatitude()纬度 bdLocation.getLongitude()经度
LatLng latLng = new LatLng(bdLocation.getLatitude(),bdLocation.getLongitude());
BitmapDescriptor descriptor = BitmapDescriptorFactory.fromResource(R.mipmap.ic_launcher);
OverlayOptions options = new MarkerOptions().position(latLng).icon(descriptor).title("当前位置");
baiduMap.addOverlay(options);
Log.e("fmy","位置"+bdLocation.getLatitude());
}
});
//4启动
locationClient.start();//开启
locationClient.requestLocation();//发起请求
}
}