android端使用百度地图
百度地图API简介
百度地图移动版API(Android)是一套基于Android设备的应用程序接口,通过该接口,可以轻松的访问百度服务和数据,构建功能丰富、交互性强的地图应用程序。
百度地图移动版API不仅包含构建地图的基本接口,还提供了本地搜索、路线规划、地图定位等数据服务
- 百度地图开发指南http://developer.baidu.com/map/index.php?title=androidsdk/guide/introduction
演示示例
id="iframe_0.31984983989968896" src="data:text/html;charset=utf8,%3Cimg%20id=%22img%22%20src=%22http://i5.tietuku.com/8b3d7372d5cd8abc.gif?_=4994110%22%20style=%22border:none;max-width:999px%22%3E%3Cscript%3Ewindow.onload%20=%20function%20()%20%7Bvar%20img%20=%20document.getElementById('img');%20window.parent.postMessage(%7BiframeId:'iframe_0.31984983989968896',width:img.width,height:img.height%7D,%20'http://www.cnblogs.com');%7D%3C/script%3E" frameborder="0" scrolling="no" style="margin: 0px; padding: 0px; border-style: none; border-width: initial; width: 200px; height: 200px;">
一、准备工作
- 1.注册百度开发者账号,创建应用,获取API key
- 地址:http://lbsyun.baidu.com/apiconsole/key
- 2.创建应用需要应用的数字签名SHA1和包名
在Preference中可以看到Android项目Eclipse默认的数字签名SHA1
切换到模拟器安装目录下输入命令
命令 "C:\Program Files\Java\jdk1.6.0_45\bin\keytool.exe" -list -v -keystoredebug.keystore
默认密码是android
也能获取数字签名的SHA1- 获取创建的API key
- 3.添加地图引擎(类库和.so文件)到工程中
4.添加权限
<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!-- 用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET" />
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
<!--允许应用读取低级别的系统日志文件 -->
<uses-permission android:name="android.permission.READ_LOGS"></uses-permission>
- 5.在清单文件Application节点下添加
<meta-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="33c6iZyFukuzDOg77Wk6wE2t"/>
二、MapView和BaiduMap介绍
public class HelloWorld extends Activity{private static final String TAG ="HelloWorld";private MapView mapView;private BaiduMap baiduMap;private double latitude = 40.050966;// 纬度private double longitude = 116.303128;// 经度private LatLng hmPos = new LatLng(latitude, longitude);// 坐标private MyBaiduSdkReceiver receiver;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);intManager();setContentView(R.layout.common);init();}private void intManager(){receiver = new MyBaiduSdkReceiver();IntentFilter filter = new IntentFilter();filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);registerReceiver(receiver, filter);}private void init(){mapView = (MapView) findViewById(R.id.mapView);//BaiduMap管理具体的某一个MapView: 旋转,移动,缩放,事件。。。baiduMap = mapView.getMap();//设置缩放级别,默认级别为12MapStatusUpdate mapstatusUpdate = MapStatusUpdateFactory.zoomTo(19);;baiduMap.setMapStatus(mapstatusUpdate);//设置地图中心点,默认是天安门MapStatusUpdate mapstatusUpdatePoint = MapStatusUpdateFactory.newLatLng(hmPos);baiduMap.setMapStatus(mapstatusUpdatePoint );//mapView.showScaleControl(false);//默认是true,显示缩放按钮//mapView.showZoomControls(false);//默认是true,显示比例尺}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event){//旋转,移动,缩放switch (keyCode) {case KeyEvent.KEYCODE_1://放大地图缩放级别,每次放大一个级别baiduMap.setMapStatus(MapStatusUpdateFactory.zoomIn());break;case KeyEvent.KEYCODE_2://每次缩小一个级别baiduMap.setMapStatus(MapStatusUpdateFactory.zoomOut());break;case KeyEvent.KEYCODE_3://以一个点为中心旋转//获取地图当前的状态MapStatus mapStatus = baiduMap.getMapStatus();float rotate = mapStatus.rotate;Log.d(TAG, "rotate:" + rotate);//旋转范围 0-360MapStatus newRotate = new MapStatus.Builder().rotate(rotate+30).build();baiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(newRotate));break;case KeyEvent.KEYCODE_4://以一条直线为轴,旋转 调整俯仰角 overlook//范围 0-45float overlook = baiduMap.getMapStatus().overlook;MapStatus overStatus = new MapStatus.Builder().overlook(overlook-5).build();baiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(overStatus));break;case KeyEvent.KEYCODE_5://移动MapStatusUpdate moveStatusUpdate = MapStatusUpdateFactory.newLatLng(new LatLng(40.065796,116.349868));//带动画的更新地图状态,还是300毫秒baiduMap.animateMapStatus(moveStatusUpdate);break;default:break;}return super.onKeyDown(keyCode, event);}@Overrideprotected void onDestroy(){//卸载super的前后是没有却别的mapView.onDestroy();unregisterReceiver(receiver);super.onDestroy();}@Overrideprotected void onResume(){mapView.onResume();super.onResume();}@Overrideprotected void onPause(){// TODO Auto-generated method stubsuper.onPause();mapView.onPause();}class MyBaiduSdkReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent){String action = intent.getAction();if (action.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)) {//网络错误Toast.makeText(getApplicationContext(), "无网络", 0).show();}else if (action.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)) {//key校验失败Toast.makeText(getApplicationContext(), "校验失败", 0).show();}}}
}
三、地图图层
什么是地图图层
地图可以包含一个或多个图层,每个图层在每个级别都是由若干个图块组成的,他们覆盖了地图的整个表面。例如您所看到的包括街道、兴趣点(POI)、学校、公园等内容的地图展现就是一个图层,另外交通留香的展现也是通过图层来实现的。
图层分类
- 底图
- 基本的地图图层,包括软杆个缩放级别,显示基本的地图信息,包括道路、街道、学校、公园等内容
- 实时交通信息图
baiduMap.setTrafficEnabled(true)
- 卫星图
baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE)
卫星地图是卫星拍摄的真实的地理面貌(其实很多都是飞机航拍的,因为卫星拍照贵啊),所以卫星地图可用来检测地面的信息
覆盖物的成绩压盖关系,具体如下(从下至上的顺序):
1.基础底图(包括底图、底图道路、卫星图等);
2.地形图图层(GroundOverlay);
3.热力图图层(HeatMap);
4.实时路况图图层(BaiduMap.setTrafficEnabled(true););
5.百度城市热力图(BaiduMap.setBaiduHeatMapEnabled(true););
6.底图标注(指的是底图上面自带的那些POI元素);
7.几何图形图层(点、折线、弧线、圆、多边形);
8.标注图层(Marker),文字绘制图层(Text);
9.指南针图层(当地图发生旋转和视角变化时,默认出现在左上角的指南针);
10.定位图层(BaiduMap.setMyLocationEnabled(true););
11.弹出窗图层(InfoWindow);
12.自定义View(MapView.addView(View););
切换地图,交通图,卫星图,是否显示实时交通
@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {//切换 地图、交通图、 卫星图switch (keyCode) {case KeyEvent.KEYCODE_1://按1 设置显示底图baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);break;case KeyEvent.KEYCODE_2://卫星图baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);break;case KeyEvent.KEYCODE_3://打开交通图baiduMap.setTrafficEnabled(true);break;}return super.onKeyDown(keyCode, event);}
四、覆盖物
所有叠加或覆盖到地图的内容,我们琮琤为地图覆盖物。如标注、矢量图性元素(包括:折现和多边形和圆),定位图标等。覆盖物拥有自己的地理坐标,当您拖动或缩放地图时,他们会向应的处理
覆盖物包括:本地覆盖物和搜索覆盖物
#### 本地覆盖物的抽象基类:OverlayOptions(核心类)
- 圆形覆盖物: CircleOptions
- 文字覆盖物: TextOptions
- marker覆盖物: MarkerOptions
- 圆点覆盖物:DotOptions
- ground 覆盖物:GroundOverlayOptions
- 圆点覆盖物:DotOptions
- 多边形覆盖物:PolygonOptions
- 折线覆盖物:PolylineOptions
弧线覆盖物:ArcOptions
搜索覆盖物抽象类: OverlayManager (核心类)
- 本地搜索覆盖物:PoiOverlay
- 驾车路线覆盖物:DrivingRouteOverlay
- 步行路线覆盖物:WalkingRouteOverlay
- 换乘路线覆盖物:TransitOverlay
公交路线覆盖物:BusLineOverlay
创建覆盖物的步骤:
- 创建自己
- 给自己设置数据
- 把覆盖物添加到地图中
- 添加圆形覆盖物
private void draw(){//定义一个圆 : 圆心+半径//1.创建自己CircleOptions circleOptions = new CircleOptions();//2.给自己设置数据circleOptions.center(hmPos) //圆心.radius(1000)//半径 单位米.fillColor(0x60ff0000)//填充色.stroke(new Stroke(2,0x6000ff00));//边框宽度和颜色//3.把覆盖物添加到地图中baiduMap.addOverlay(circleOptions);}
效果
添加文字覆盖物
private void draw(){TextOptions textOptions = new TextOptions();textOptions.fontColor(0x60ff0000)//设置字体颜色.text("无良印品,窗前明月光")//文字内容.position(hmPos)//位置.fontSize(24)//字体大小.typeface(Typeface.SERIF)//字体.rotate(30);//旋转baiduMap.addOverlay(textOptions);}
效果
Marker覆盖物
public class MarkerOptionsDemo extends BaseActivity{private View pop;private TextView title;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);draw();//点击某一个Marker,在脑袋上弹出popinitPop();}private void draw(){BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.drawable.eat_icon);MarkerOptions markerOptions = new MarkerOptions();markerOptions.position(hmPos)//设置位置.icon(bitmapDescriptor)//设置覆盖物小图标.draggable(true)//设置是否可以拖拽,默认为否.title("中心");//设置标题baiduMap.addOverlay(markerOptions);markerOptions = new MarkerOptions().title("向北").position(new LatLng(latitude+0.001, longitude)).icon(bitmapDescriptor);baiduMap.addOverlay(markerOptions);ArrayList<BitmapDescriptor> bitmaps = new ArrayList<BitmapDescriptor>();bitmaps.add(bitmapDescriptor);bitmaps.add(BitmapDescriptorFactory.fromResource(R.drawable.icon_geo));markerOptions = new MarkerOptions().title("向东").position(new LatLng(latitude, longitude+0.001)).icons(bitmaps)//图标设置一个帧动画,多个图片来回切换.period(10);//切换帧的时间间隔baiduMap.addOverlay(markerOptions);markerOptions = new MarkerOptions().title("向西南").position(new LatLng(latitude-0.001, longitude-0.001)).icon(bitmapDescriptor);baiduMap.addOverlay(markerOptions);baiduMap.setOnMarkerClickListener(new OnMarkerClickListener() {@Overridepublic boolean onMarkerClick(Marker result){//当点击时,更新pop的位置,设置为显示MapViewLayoutParams layoutParams = new MapViewLayoutParams.Builder().layoutMode(ELayoutMode.mapMode)//按照经纬度设置位置.position(result.getPosition())//不能传null.width(MapViewLayoutParams.WRAP_CONTENT).height(MapViewLayoutParams.WRAP_CONTENT).yOffset(-5)//距离position的像素 向下是正值,向上是负值.build();mapview.updateViewLayout(pop, layoutParams);pop.setVisibility(View.VISIBLE);title.setText(result.getTitle());return true;}});}private void initPop(){//加载pop 添加到mapview,设置为隐藏pop = View.inflate(getApplicationContext(), R.layout.pop, null);MapViewLayoutParams layoutParams = new MapViewLayoutParams.Builder().layoutMode(MapViewLayoutParams.ELayoutMode.mapMode)//按照经纬度设置位置.position(hmPos)//不能传null,设置为mapMode时,必须设置position.width(MapViewLayoutParams.WRAP_CONTENT).height(MapViewLayoutParams.WRAP_CONTENT).build();mapview.addView(pop, layoutParams);pop.setVisibility(View.INVISIBLE);title = (TextView) pop.findViewById(R.id.title);}}
- 效果
五、搜索
百度地图移动版API集成搜索服务,包括位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索
核心类
PoiSearch和OnGetPoiSearchResultListener RoutePlanSearch和OnGetRoutePlanResultListener
实现思路
- 初始化PoiSearch类,通过setOnGetPoiSearchResultListtener方法注册搜索结果的监听对象OnGetPoiSearchResultListener
,实现异步搜索服务。 - 通过自定义MySearchListener实现类,处理不同的回调方法,获得搜索结果。
注意,OnGetPoiSearchResultListener只支持一个,一最后一次设置为准
结合覆盖物展示搜索
本地搜索覆盖物:PoiOverlay
驾车路线覆盖物:DrivingRouteOverlay
步行路线覆盖物:WalkingRouteOverlay
换乘路线覆盖物:TransitOverlayPOI(Point of Interest兴趣点)搜索有三种方式
根据范围和检索词发起范围检索searchInBound
周边检索searchNearby
城市poi检索searchInCity
poi详细信息检索 searchPoiDetail
结果的展示: PoiOverlay在OnGetPoiSearchResultListener的onGetPoiResult方法中处理搜索结果
- 处理步骤:
- 判断服务器结果返回
- 创建poi覆盖物
- 将服务器返回数据添加到poi覆盖物中
- 添加覆盖物到地图addToMap
- 缩放地图,使所有Overlay都在合适的视野内
- 注意
- POI检索结果每页容量默认情况下为10,可以通过pageCapacity设置,支持1-50(10)
翻页功能重新调用通过PoiSearch类的searchInXxx()方法并传递页数角标pageNum来实现,该方法是异步函数,搜索成功后会调用注册的事件处理函数onGetPoiResult 返回查询页的结果
在一定范围内搜索POI
/*** 范围内搜索* @author mwp**/
public class PoiSearchInBoundsDemo extends BaseActivity{@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);search();}private void search() {PoiSearch poiSearch = PoiSearch.newInstance();PoiBoundSearchOption boundSearchOption = new PoiBoundSearchOption();LatLngBounds latLngBounds = new LatLngBounds.Builder().include(new LatLng(40.049233, 116.302675))//东北的点.include(new LatLng(40.050645, 116.303695))//西南的点.build();//由东北的点和西南的点两个点确定搜索的矩形范围boundSearchOption.bound(latLngBounds);//设置搜索范围boundSearchOption.keyword("加油站");//搜索关键字poiSearch.searchInBound(boundSearchOption);// 只是把范围能搜索到的poi设置为 地图的中心,同时会搜索到范围外的poipoiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {@Overridepublic void onGetPoiResult(PoiResult result) {if (result==null || result.error==ERRORNO.RESULT_NOT_FOUND) {Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();return;}//搜索poi的覆盖物MyPoiOverlay overlay = new MyPoiOverlay(baiduMap);//把事件分发给overlay,overlay才能处理那个点击事件baiduMap.setOnMarkerClickListener(overlay);overlay.setData(result);//设置结果overlay.addToMap();//把搜索的结果添加到地图中overlay.zoomToSpan();//缩放地图,使所有overlay都在合适的视野内, 注: 该方法只对Marker类型的overlay有效}@Overridepublic void onGetPoiDetailResult(PoiDetailResult result) {}});}class MyPoiOverlay extends PoiOverlay{public MyPoiOverlay(BaiduMap arg0) {super(arg0);}@Overridepublic boolean onPoiClick(int index) {//获取搜索结果PoiResult poiResult = getPoiResult();//获取点击的那个poi的信息PoiInfo poiInfo = poiResult.getAllPoi().get(index);String text = poiInfo.name+","+poiInfo.address;Toast.makeText(getApplicationContext(), text, 0).show();return super.onPoiClick(index);}}
}
搜索结果
周边搜索
/*** 周边搜索* @author mwp**/
public class PoiSearchNearByDemo extends BaseActivity{private PoiSearch poiSearch;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);search();}private void search() {poiSearch = PoiSearch.newInstance();PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption();nearbySearchOption.location(hmPos);//设置中心点nearbySearchOption.radius(1000);//设置半径 米nearbySearchOption.keyword("加油站");//关键字poiSearch.searchNearby(nearbySearchOption);poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {@Overridepublic void onGetPoiResult(PoiResult result) {if(result==null||SearchResult.ERRORNO.RESULT_NOT_FOUND==result.error){Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();return;}PoiOverlay overlay = new MyPoiOverlay(baiduMap);// 搜索poi的覆盖物baiduMap.setOnMarkerClickListener(overlay);// 把事件分发给overlay,overlay才能处理点击事件overlay.setData(result);// 设置结果overlay.addToMap();// 把搜索的结果添加到地图中overlay.zoomToSpan();// 缩放地图,使所有Overlay都在合适的视野内 注: 该方法只对Marker类型的overlay有效}@Overridepublic void onGetPoiDetailResult(PoiDetailResult result) {if(result==null||SearchResult.ERRORNO.RESULT_NOT_FOUND==result.error){Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();return;}String text = result.getAddress()+ "::" + result.getCommentNum() + result.getEnvironmentRating();Toast.makeText(getApplicationContext(), text, 0).show();}});}class MyPoiOverlay extends PoiOverlay{public MyPoiOverlay(BaiduMap arg0) {super(arg0);}@Overridepublic boolean onPoiClick(int index) {PoiResult poiResult = getPoiResult();PoiInfo poiInfo = poiResult.getAllPoi().get(index);// 得到点击的那个poi信息String text = poiInfo.name + "," + poiInfo.address;Toast.makeText(getApplicationContext(), text, 0).show();PoiDetailSearchOption detailSearchOption = new PoiDetailSearchOption();detailSearchOption.poiUid(poiInfo.uid);//设置poi的uidpoiSearch.searchPoiDetail(detailSearchOption);return super.onPoiClick(index);}}
}
搜索结果
城市内搜索
/*** 城市内搜索* @author mwp**/
public class PoiSearchIncityDemo extends BaseActivity{private PoiSearch poiSearch;private int currentPageIndex = 0;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);poiSearch = PoiSearch.newInstance();search();poiSearch.setOnGetPoiSearchResultListener(new OnGetPoiSearchResultListener() {@Overridepublic void onGetPoiResult(PoiResult result){if (result == null|| SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) {Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();return;}String text = "共" + result.getTotalPageNum() + "页,共"+ result.getTotalPoiNum() + "条,当前第"+ result.getCurrentPageNum() + "页,当前页"+ result.getCurrentPageCapacity() + "条";Toast.makeText(getApplicationContext(), text, 1).show();baiduMap.clear();//清空地图所有的Overlay覆盖物以及InfoWindowPoiOverlay overlay = new MyPoiOverlay(baiduMap);baiduMap.setOnMarkerClickListener(overlay);overlay.setData(result);overlay.addToMap();overlay.zoomToSpan();}@Overridepublic void onGetPoiDetailResult(PoiDetailResult arg0){}});}private void search(){PoiCitySearchOption citySearchOption = new PoiCitySearchOption();citySearchOption.city("北京");citySearchOption.keyword("加油站");citySearchOption.pageNum(currentPageIndex);poiSearch.searchInCity(citySearchOption);}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event){//每按一下数字键1就显示下一页的POIif (keyCode == KeyEvent.KEYCODE_1) {currentPageIndex++;search();}return super.onKeyDown(keyCode, event);}class MyPoiOverlay extends PoiOverlay{public MyPoiOverlay(BaiduMap arg0){super(arg0);}@Overridepublic boolean onPoiClick(int index){PoiResult poiResult = getPoiResult();PoiInfo poiInfo = poiResult.getAllPoi().get(index);// 得到点击的那个poi信息String text = poiInfo.name + "," + poiInfo.address;Toast.makeText(getApplicationContext(), text, 0).show();return super.onPoiClick(index);}}
}
- 搜索结果
六、路线规划
自驾路线规划
结果展示: DrivingRouteOverlay
- 驾车路线查询
- 查询:RoutePlanSearch.drivingSearch驾乘路线搜索,或者增加途经点.
- PlanNode内容的设置:可以使用经纬度和地名,但不支持模糊查询,需要输入准确的名称
- 可以通过DrivingRoutePlanOption.policy (int policy)来设置驾车路线规划策略
- 结果处理:OnGetRoutePlanResultListener. onGetDrivingRouteResult(DrivingRouteResult result)
步行路线规划
步行路线查询
结果展示: WalkingRouteOverlay
RoutePlanSearch. walkingSearch步行路线搜索.
结果处理: OnGetRoutePlanResultListener. onGetWalkingRouteResult(WalkingRouteResult result)
公交换乘路线规划
结果展示:TransitRouteOverlay
检索: RoutePlanSearch. transitSearch
通过TransitRoutePlanOption.policy (int policy) 设置路线规划策略
结果处理: OnGetRoutePlanResultListener. onGetTransitRouteResult(TransitRouteResult result)
- 自驾线路规划(路过特定地点)
/*** 驾车路线* @author mwp**/
public class DrivingRouteOverlayDemo extends BaseActivity{private RoutePlanSearch routePlanSearch;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);search();}private void search(){routePlanSearch = RoutePlanSearch.newInstance();DrivingRoutePlanOption drivingOption = new DrivingRoutePlanOption();PlanNode from = PlanNode.withLocation(hmPos);//窗前起点PlanNode to = PlanNode.withLocation(new LatLng(40.065796,116.349868));//创建终点drivingOption.from(from);//设置起点drivingOption.to(to);//设置终点List<PlanNode> nodes = new ArrayList<PlanNode>();nodes.add(PlanNode.withCityNameAndPlaceName("北京", "天安门"));drivingOption.passBy(nodes);drivingOption.policy(DrivingPolicy.ECAR_DIS_FIRST);//设置策略,驾乘检索策略常量:最短距离routePlanSearch.drivingSearch(drivingOption);routePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() {@Overridepublic void onGetWalkingRouteResult(WalkingRouteResult arg0){}@Overridepublic void onGetTransitRouteResult(TransitRouteResult arg0){}// 自驾搜索结果回调@Overridepublic void onGetDrivingRouteResult(DrivingRouteResult result){if (result == null|| SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) {Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();return;}DrivingRouteOverlay drivingOverlay = new MyDrivingOverlay(baiduMap);baiduMap.setOnMarkerClickListener(drivingOverlay);drivingOverlay.setData(result.getRouteLines().get(0));//设置线路为搜索结果的第一条drivingOverlay.addToMap();drivingOverlay.zoomToSpan();}});}class MyDrivingOverlay extends DrivingRouteOverlay{public MyDrivingOverlay(BaiduMap arg0){super(arg0);}@Overridepublic BitmapDescriptor getStartMarker(){// 覆写此方法以改变默认起点图标return BitmapDescriptorFactory.fromResource(R.drawable.icon_st);}@Overridepublic BitmapDescriptor getTerminalMarker(){// 覆写此方法以改变默认终点图标return BitmapDescriptorFactory.fromResource(R.drawable.icon_en);}}}
搜索结果
步行线路规划
/*** 步行路线* @author mwp**/
public class WalkingRouteOverlayDemo extends BaseActivity{@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);search();}private void search(){RoutePlanSearch routePlanSearch = RoutePlanSearch.newInstance();WalkingRoutePlanOption walkingOption = new WalkingRoutePlanOption();PlanNode from = PlanNode.withLocation(hmPos);//创建起点PlanNode to = PlanNode.withLocation(new LatLng(40.065796,116.349868));// 创建终点walkingOption.from(from);walkingOption.to(to);routePlanSearch.walkingSearch(walkingOption);routePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() {@Overridepublic void onGetWalkingRouteResult(WalkingRouteResult result){if (result == null|| SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) {Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();return;}WalkingRouteOverlay overlay = new WalkingRouteOverlay(baiduMap);baiduMap.setOnMarkerClickListener(overlay);overlay.setData(result.getRouteLines().get(0));overlay.addToMap();overlay.zoomToSpan();}@Overridepublic void onGetTransitRouteResult(TransitRouteResult arg0){}@Overridepublic void onGetDrivingRouteResult(DrivingRouteResult arg0){}});}}
搜索结果
公交换乘规划
/*** 公交换乘路线规划* @author mwp**/
public class TransitRouteOverlayDemo extends BaseActivity{@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);search();}private void search(){RoutePlanSearch routePlanSearch = RoutePlanSearch.newInstance();TransitRoutePlanOption transitOption = new TransitRoutePlanOption();PlanNode from = PlanNode.withLocation(hmPos);// 创建起点PlanNode to = PlanNode.withLocation(new LatLng(40.065796,116.349868));// 创建终点transitOption.from(from);transitOption.to(to);transitOption.city("北京");//公交换乘只能在一个城市中,不能跨城市transitOption.policy(TransitPolicy.EBUS_WALK_FIRST);//公交检索策略常量:最少步行距离routePlanSearch.transitSearch(transitOption);routePlanSearch.setOnGetRoutePlanResultListener(new OnGetRoutePlanResultListener() {@Overridepublic void onGetWalkingRouteResult(WalkingRouteResult arg0){}@Overridepublic void onGetTransitRouteResult(TransitRouteResult result){if (result == null|| SearchResult.ERRORNO.RESULT_NOT_FOUND == result.error) {Toast.makeText(getApplicationContext(), "未搜索到结果", 0).show();return;}TransitRouteOverlay overlay = new TransitRouteOverlay(baiduMap);baiduMap.setOnMarkerClickListener(overlay);overlay.setData(result.getRouteLines().get(0));overlay.addToMap();overlay.zoomToSpan();}@Overridepublic void onGetDrivingRouteResult(DrivingRouteResult arg0){}});}class MyDrivingOverlay extends DrivingRouteOverlay{public MyDrivingOverlay(BaiduMap arg0){super(arg0);}@Overridepublic BitmapDescriptor getStartMarker(){//覆写此方法以改变默认起点图标return BitmapDescriptorFactory.fromResource(R.drawable.icon_st);}@Overridepublic BitmapDescriptor getTerminalMarker(){//覆写此方法以改变默认终点图标return BitmapDescriptorFactory.fromResource(R.drawable.icon_en);}}
}
- 规划结果
七、地址解析服务
GeoCoder.geocode(GeoCodeOption option)
根据地址名获取地址信息 异步函数,返回结果在OnGetGeoCoderResultListener里的onGetGeoCodeResult方法通知
GeoCoder.reverseGeoCode(ReverseGeoCodeOption option)
根据地理坐标点获取地址信息 异步函数,返回结果在OnGetGeoCoderResultListener里的onGetReverseGeoCodeResult方法通知
八、联想词检索
SuggestionSearch . requestSuggestion(SuggestionSearchOption option)
查询一系列与指定key相关的内容,结果中包括城市及包含key的名称
结果处理OnGetSuggestionResultListener . onGetSuggestionResult(SuggestionResult result)
九、定位
在百度地图移动版API中,提供一个重要的特色功能:定位,通过这个功能,能获取到用户当前所在位置。
在程序中,如果使用此功能,必须注册GPS和网络的使用权限。
在获取用户位置时,优先使用GPS进行定位;如果GPS定位没有打开或者没有可用位置信息,则会通过判断网络是否连接(即确认手机是否能上网,不论是连接2G/3G或Wi-Fi网络),如果是,则通过请求百度网络定位服务,返回网络定位结果。为了使获得的网络定位结果更加精确,请打开手机的Wi-Fi开关。
目前系统自带的网络定位服务精度低,且服务不稳定、精度低,并且从未来的趋势看,基站定位是不可控的(移动公司随时可能更改基站编号以垄断定位服务),而Wi-Fi定位则不然,它是一种精度更高、不受管制的定位方法。国内其它使用Wi-Fi定位的地图软件,Wi-Fi定位基本不可用,百度的定位服务量化指标优秀,网络接口返回速度快(服务端每次定位响应时间50毫秒以内),平均精度70米,其中Wi-Fi精度40米左右,基站定位精度200米左右,覆盖率98%,在国内处于一枝独秀的地位。
注意
关于经纬度的说明:该经纬度信息是经过加密处理,所以在其它地图工具中测得的经纬度 信息不适合百度的坐标系统。
使用百度经纬度坐标,可以通过http://api.map.baidu.com/lbsapi/getpoint/index.html查询地理坐标如果需要在百度地图上显示使用其他坐标系统的位置,请发邮件至mapapi@baidu.com申请坐标转换接口http://developer.baidu.com/map/index.php?title=android-locsdk/guide/v5-0
/*** 定位* * @author mwp**/
public class LocationDemo extends BaseActivity{private LocationClient locationClient;private BitmapDescriptor geo;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);lacate();}private void lacate(){locationClient = new LocationClient(getApplicationContext());LocationClientOption option = new LocationClientOption();option.setLocationMode(LocationMode.Hight_Accuracy);// 设置定位模式option.setCoorType("bd0911");// 返回的定位结果是百度经纬度,默认值gcj02option.setScanSpan(5000);// 设置发起定位请求的间隔时间为5000msoption.setIsNeedAddress(true);// 返回的定位结果包含地址信息option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向locationClient.setLocOption(option);locationClient.registerLocationListener(new BDLocationListener() {@Overridepublic void onReceiveLocation(BDLocation result){if (result != null) {MyLocationData data = new MyLocationData.Builder().latitude(result.getLatitude()).longitude(result.getLongitude()).build();baiduMap.setMyLocationData(data);}}});geo = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo);MyLocationConfiguration configuration = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.FOLLOWING, true, geo);baiduMap.setMyLocationConfigeration(configuration);// 设置定位模式baiduMap.setMyLocationEnabled(true);// 打开定位图层}@Overrideprotected void onStart(){locationClient.start();super.onStart();}@Overrideprotected void onPause(){locationClient.stop();super.onPause();}@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event){switch (keyCode) {case KeyEvent.KEYCODE_1://正常baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(MyLocationConfiguration.LocationMode.NORMAL, true, geo));break;case KeyEvent.KEYCODE_2://罗盘baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(MyLocationConfiguration.LocationMode.COMPASS, true, geo));break;case KeyEvent.KEYCODE_3://跟随baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(MyLocationConfiguration.LocationMode.FOLLOWING, true, geo));break;default:break;}return super.onKeyDown(keyCode, event);}
}
十、离线地图
离线文件下载
http://shouji.baidu.com/map/map.html?from=3052,指定机型和城市下载对应的离线地图
- 2.0以上版本处理步骤
- 将下载好的离线地图包解压缩。
- 找到解压出的"BaiduMap"文件夹,把它放入手机存储卡根目录。在上述过程中如遇提示“是否需要覆盖文件”,点击确定即可。
- 断开与电脑连接,打开百度手机地图(如已打开请重启),系统会提示导入成功。
- 提示:下载多个城市包时,经解压后,这些城市数据都会被同时解压到BaiduMap文件夹中,不同城市不会出现被覆盖的情况。
- 1.X版本处理步骤
- 将离线地图加压,把Mapdata文件夹拷入SD卡根目录下的BaiduMapSdk下
- 利用MKOfflineMap在初始化(init)后调用scan()扫描本地地图资源
/** 离线地图初始化 **/ mOffline = new MKOfflineMap();mOffline.init(mBMapMan, new MKOfflineMapListener() {public void onGetOfflineMapState(int type, int state) {switch (type) {case MKOfflineMap.TYPE_DOWNLOAD_UPDATE:{MKOLUpdateElement update = mOffline.getUpdateInfo(state);//mText.setText(String.format("%s : %d%%", update.cityName, update.ratio));}break;case MKOfflineMap.TYPE_NEW_OFFLINE:Log.d("OfflineDemo", String.format("add offlinemapnum:%d", state));break;case MKOfflineMap.TYPE_VER_UPDATE:Log.d("OfflineDemo", String.format("new offlinemapver"));break;} }});/** 离线地图导入离线包 **/intnum = mOffline.scan();
android端使用百度地图相关推荐
- Android studio显示百度地图及闪退问题的解决
Android studio引入百度地图包括解决真机闪退问题 引入百度地图方法 申请百度地图key 百度地图SDK下载即配置 完整代码及部分解释 MainActivity.java AndroidMa ...
- Android Studio调用百度地图(二):实现地图显示后台定位和步行导航
先看一下运行效果: 实现功能:后台定位+步行导航(可通过长按屏幕自定义终点,起点为定位点) 后台定位即当程序在后台时依旧执行定位功能,步行导航支持30米-50千米范围内的导航 一 导入SDK并配置相关 ...
- Android开发之百度地图定位打卡
Android开发之百度地图定位打卡 一.效果图 二.下载百度地图SDK 三.代码实现 1.布局文件(activity_main) 2.布局文件(activity_map) 3.在res文件夹下新建m ...
- Android开发之百度地图定位
Android开发之百度地图定位 一.效果图 二.下载百度地图SDK 1.打开[百度地图](https://lbsyun.baidu.com/index.php?title=%E9%A6%96%E9% ...
- Android BLE开发 百度地图 大神博客简书传送门合集
一.踩坑 踩坑1: 问题Q:方法报错.标红.Android Studio提示必须添加权限检查. 解决S:不用管,一样能够正常运行! 踩坑2: 问题Q:权限报错.标红.提示必须是系统应用才可以使用. 解 ...
- 基于android studio的百度地图(放大缩小搜索功能)
首先我们需要下载百度SDK包 百度网盘提取码1234 这个复制在这里 还有百度官方的代码也已经打好了. 百度网盘 请输入1234 自行导入.直接复制全部java,之后粘贴在工程里面 这是布局 布局.x ...
- 百度地图android室内定位,百度地图4.0正式发布,主打免费语音导航、室内定位、实时公交和生活搜索 (视频)...
自2010年10月百度地图在塞班平台上线了第一个版本以后,陆续登陆了Android和iPhone平台,据百度地图团队介绍,其最新的用户数已达7000万.今天,百度地图4.0 正式发布(iPhone版 ...
- Android中应用百度地图API开发地图APP实例-显示百度地图
场景 效果 在使用百度地图API之前需要先在百度地图开放平台中申请API_KEY http://lbsyun.baidu.com/index.php 申请API_KEY 登录百度开放平台后找到控制台下 ...
- android应用 百度地图,Android学习之百度地图API的应用(一)
现在的地图API很多,我就从百度地图开始了,为了方面自己以后回顾,我会把所有学到的东西记录下来,下面是学习记录: 要使用百度地图首先得申请一个KEY,可以到这里申请(需要注册一个百度账号),申请完之后 ...
- Android开发之百度地图定位以及简单覆盖物的实现
直接上代码: 先看下效果图: 我这里主要做了三个功能: 1.一秒钟实时定位功能: 2.添加任意经纬度地点到地图上: 3.判断朝阳门是否在本人定位范围1000米内: 百度地图初始化方法: DemoApp ...
最新文章
- pd.read_csv时出现unnamed列
- 离线缓存占内存吗_彻底弄懂浏览器缓存策略
- 第三届Apache Flink 极客挑战赛暨AAIG CUP攻略发布!
- 介绍一下XMLHttpRequest对象,他有哪些常用方法和属性
- CommandBehavior.CloseConnection的使用
- yolo opencv_如何使用Yolo,SORT和Opencv跟踪足球运动员。
- Java pdf文件传输_java中pdf文件的管理(pdf文件转png文件,base64传输文件以及删除)...
- 《大数据》期刊“农业大数据”专刊征文通知
- 实现一个靠左靠右靠中间的listview
- PHP好玩的代码一(笛卡尔的情书)
- 大数据:技术与应用实践指南(中国工程院院士倪光南倾情作序,雷万云、毛新生、段永朝、安晖联合力荐)
- 中国互联网今日正式满 20 岁
- Arcgis Javascript API 开发笔记
- 【MATLAB】MATLAB基本运算
- 数据分类分级产品,一文详解
- 猪八戒让网赚国人再也不用看外国人…
- 幼儿园保育员好吗 就业前景如何
- CSP-J/S2022游寂寞记
- Python中使用BeautifulReport形成测试报告教程
- GY-Kit 物联网开发板
热门文章
- CM源码(CyanogenMod)源码编译
- leetcode:1000. 合并石头的最低成本(区间dp,困难)
- 解决:RN和H5之间通信
- No provisioned iOS devices are available with a compatible iOS version.
- 彻底解决Tensorflow2.0 使用tensorflow_datasets出现unbalanced parenthesis错误
- 最佳解决方法 Error: No such file or directory @ rb_sysopen
- opencv学习系列:实例练习(含多个实例)
- 需要点智商才能看懂的恐怖故事,你能看懂多少个?
- 飓风“桑迪”的蝴蝶效应:扇起桑迪域名注册潮
- 摄像头视频直播方案比较之方案二:乐橙云