说到百度地图,现在这个时候应该都是众说周知了吧,多的话不扯了,直接奔向主题。
接入百度地图api必须申请key,这里申请key就不用说了,官方文档上面有介绍如何去申请key。
这里使用的百度地图定位是4.2的版本,api是3.1.1版本。如果申请好了key,那么就可以进入编码阶段了,具体实现如下:
1.引入百度地图相关jar包及armeabi目录到libs目录中
2.在项目的AndroidManifest.xml文件中配置相关信息
配置权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.GET_ACCOUNTS" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="android.permission.MANAGE_ACCOUNTS" /> <uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_LOGS" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
在application标签中声明Service标签,每个app拥有独立的service
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"/>
设置百度密钥
<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="yMSCtrtXNOKOZnyXtVXaMA7O" />
3.配置布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <com.baidu.mapapi.map.MapView android:id="@+id/mv_map" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" /> </LinearLayout>
4.代码具体实现
package com.example.map.activity; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.location.LocationClientOption.LocationMode; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BitmapDescriptor; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.MarkerOptions; import com.baidu.mapapi.map.MyLocationConfiguration; import com.baidu.mapapi.map.MyLocationData; import com.baidu.mapapi.map.OverlayOptions; import com.baidu.mapapi.model.LatLng; import android.app.Activity; import android.os.Bundle; public class MainActivity extends Activity{ private LocationClient locationClient;//定位客户端 private MyLocationListener locationListener=new MyLocationListener(); private MapView mvMap;//百度地图控件 private BaiduMap baiduMap;//地图对象控制器 private static double x_pi = 3.14159265358979324 * 3000.0 / 180.0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //必须在setContentView前 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.main_activity); initMap();//初始化 } /** * 初始化地图 */ private void initMap(){ //获取地图控件 mvMap=(MapView) findViewById(R.id.mv_map); //获取地图对象控制器 baiduMap=mvMap.getMap(); baiduMap.setBuildingsEnabled(true);//设置显示楼体 baiduMap.setMapStatus(MapStatusUpdateFactory.zoomTo(19f));//设置地图状态 //创建定位客户端 locationClient=new LocationClient(getApplicationContext()); //注册监听器 locationClient.registerLocationListener(locationListener); //实例化客户端定位参数 LocationClientOption options=new LocationClientOption(); options.setLocationMode(LocationMode.Hight_Accuracy);//设置定位模式 options.setCoorType("gcj02");//返回定位结果 options.setScanSpan(6000);//设置定位扫描间隔时间 options.setIsNeedAddress(true);//设置定位结果中是否含地址信息,默认无 options.setNeedDeviceDirect(true);//设置网络定位时,需要设备方向 locationClient.setLocOption(options);//设置定位参数 locationClient.start();//开始定位 } /** * 实现百度定位监听器 * @author Arvin_Li * */ public class MyLocationListener implements BDLocationListener{ @Override public void onReceiveLocation(BDLocation location) { if (location == null) return ; //创建地理坐标点对象 LatLng point=new LatLng(location.getLatitude(), location.getLongitude()); //将国测局坐标转为百度坐标 point=gcjTobaidu(point); //开启定位图层 baiduMap.setMyLocationEnabled(true); //构造定位数据 MyLocationData locData=new MyLocationData.Builder() .accuracy(location.getRadius())//设置位置的精度信息 .direction(location.getDirection())//设置获取到的方向信息,顺时针0-360 .latitude(point.latitude)//设置定位数据的纬度 .longitude(point.longitude)//设置定位数据的经度 .build();//构建生成定位数据对象 //设置定位数据 baiduMap.setMyLocationData(locData); //构建定位图标 constructionLocationIcon(point); } } /** * 构建定位图标 * @param point 图标位置 */ private void constructionLocationIcon(LatLng point){ //创建Marker图标 BitmapDescriptor descriptor=BitmapDescriptorFactory.fromResource(R.drawable.xk); //构建MarkerOption,用于在地图上添加Marker OverlayOptions options=new MarkerOptions() .icon(descriptor)//设置图标 .position(point)//设置图标位置 .draggable(true)//允许拖拽 .zIndex(5);//设置图标层次 //清空地图所有的 Overlay 覆盖物以及 InfoWindow baiduMap.clear(); //在地图上添加图标 baiduMap.addOverlay(options); //设置定位图层配置信息,只有先允许定位图层后设置定位图层配置信息才会生效 baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(com.baidu.mapapi.map.MyLocationConfiguration.LocationMode.FOLLOWING, true, descriptor)); //关闭定位图层 baiduMap.setMyLocationEnabled(false); } @Override protected void onPause() { super.onPause(); mvMap.onPause(); } @Override protected void onResume() { super.onResume(); mvMap.onResume(); } @Override protected void onDestroy() { super.onDestroy(); if(null!=locationClient&&locationClient.isStarted()){ locationClient.stop();//停止定位 } locationClient=null; mvMap.onDestroy();//销毁地图 } /** * 国测局转换百度经纬度 * @param point * @return */ public static LatLng gcjTobaidu(LatLng point) { // double x = gg_lon, y = gg_lat; double x = point.longitude, y = point.latitude; double z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi); double theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi); double bd_lon = z * Math.cos(theta) + 0.0065; double bd_lat = z * Math.sin(theta) + 0.006; LatLng point1 = new LatLng(bd_lat,bd_lon); return point1; } }
返回定位参数有三个值:
1.gcj02 返回国测局经纬度坐标系
2.bd09返回百度墨卡托坐标系
3.bd09ll 返回百度经纬度坐标
默认是gcj02
设置定位模式有三种:
1.Battery_Saving 低功耗模式
2.Device_Sensors 仅设备GPS模式
3.Hight_Accuracy 高精度模式
option.setLocationMode(LocationMode.Hight_Accuracy)
设置定位图层配置信息,只有先允许定位图层后设置定位图层配置信息才会生效
其中的定位图层显示方式有3中:
1.COMPASS 罗盘态,显示定位方向圈,保持定位图标在地图中心
2.NORMAL 普通态: 更新定位数据时不对地图做任何操作
3.FOLLOWING 跟随态,保持定位图标在地图中心
baiduMap.setMyLocationConfigeration(new MyLocationConfiguration(com.baidu.mapapi.map.MyLocationConfiguration.LocationMode.FOLLOWING, true, descriptor));
到这里定位的功能就算是结束了。
时间: 2024-11-12 11:27:29