优定义网

手把手教你实现百度基础地图+定位功能+设置中心点+添加Marker

朴子萱 发表于 2018-6-11 20:56:32 | 显示全部楼层 |阅读模式

配置环境

1.获取AppKey

1.创建应用地址:http://lbsyun.baidu.com/apiconsole/key

1.jpg

2.创建应用:

2.jpg

3.获取SHA1值,首先cmd打开dos窗口

2.jpg

4.cd .android 切换到 .android目录

4.jpg

5.使用keytool -list -v -keystore debug.keystore获取指纹整数中的SHA1值,输入口令直接回车或者输入android即可:

5.jpg

6.得到的指纹整数SHA1值

6.jpg

7.获取应用的包名(PackageName):

7.jpg

这个是包名 PackageName

8.jpg

8.把SHA1和PackageName放到对应的位置点击确定,得到APPKEY

9.jpg

2.配置AndroidManifest.xml文件

1.设置你的APPKEY

  1. <meta-data  
  2.             android:name="com.baidu.lbsapi.API_KEY"  
  3.             android:value="你的 AppKey" />  
复制代码

2.添加用户权限

  1. <!-- 百度地图需要的权限 -->  
  2.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
  3.     <uses-permission android:name="android.permission.INTERNET" />  
  4.     <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />  
  5.     <uses-permission android:name="android.permission.WAKE_LOCK" />  
  6.     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />  
  7.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
  8.     <uses-permission android:name="android.permission.GET_TASKS" />  
  9.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
  10.     <uses-permission android:name="android.permission.WRITE_SETTINGS" />  
复制代码

3.基础地图实现

效果图

10.jpg

1.在布局文件添加地图控件

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     tools:context="com.demo.baidumapblog.ShowMapActivity">  
  7.   
  8.     <com.baidu.mapapi.map.MapView  
  9.         android:id="@+id/bmapView"  
  10.         android:layout_width="fill_parent"  
  11.         android:layout_height="fill_parent"  
  12.         android:clickable="true" />  
  13.   
  14. </RelativeLayout>  
复制代码

2.初始化地图控件并管理控件的生命周期

  1. package com.demo.baidumapblog;  
  2.   
  3. import android.support.v7.app.AppCompatActivity;  
  4. import android.os.Bundle;  
  5.   
  6. import com.baidu.mapapi.SDKInitializer;  
  7. import com.baidu.mapapi.map.MapView;  
  8.   
  9. public class ShowMapActivity extends AppCompatActivity {  
  10.   
  11.     private MapView mMapView;  
  12.   
  13.     @Override  
  14.     protected void onCreate(Bundle savedInstanceState) {  
  15.         super.onCreate(savedInstanceState);  
  16.         //在使用SDK各组件之前初始化context信息,传入ApplicationContext  
  17.         //注意该方法要再setContentView方法之前实现  
  18.         //使用百度地图的任何功能都需要先初始化这段代码  最好放在全局中进行初始化  
  19.         //百度地图+定位+marker比较简单 我就不放到全局去了  
  20.         SDKInitializer.initialize(getApplicationContext());  
  21.         setContentView(R.layout.activity_show_map);  
  22.         //获取地图控件引用  
  23.         mMapView = (MapView) findViewById(R.id.bmapView);  
  24.     }  
  25.   
  26.     /**
  27.      * 必须要实现
  28.      */  
  29.     @Override  
  30.     protected void onDestroy() {  
  31.         super.onDestroy();  
  32.         //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理  
  33.         mMapView.onDestroy();  
  34.     }  
  35.   
  36.     /**
  37.      * 必须要实现
  38.      */  
  39.     @Override  
  40.     protected void onResume() {  
  41.         super.onResume();  
  42.         //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理  
  43.         mMapView.onResume();  
  44.     }  
  45.   
  46.     /**
  47.      * 必须要实现
  48.      */  
  49.     @Override  
  50.     protected void onPause() {  
  51.         super.onPause();  
  52.         //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理  
  53.         mMapView.onPause();  
  54.     }  
  55. }  
复制代码

4.实现定位功能

效果图  和基础地图没有什么区别 因为没有加中心点以及marker 但是已经获取到了经纬度坐标

11.jpg
12.jpg

1.在AndroidManifest.xml中注册广播  注意这个广播一定要注册 否则定位会失败

  1. <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"/>  
复制代码

2.添加定位需要的权限 去重之后的:

  1. <!-- 这个权限用于进行网络定位-->  
  2.     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>  
  3.     <!-- 这个权限用于访问GPS定位-->  
  4.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>  
  5.     <!-- 用于读取手机当前的状态-->  
  6.     <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>  
  7.     <!-- SD卡读取权限,用户写入离线定位数据-->  
  8.     <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>  
复制代码

3.正式写代码 定位功能的全部代码:

  1. package com.demo.baidumapblog;  
  2.   
  3. import android.support.v7.app.AppCompatActivity;  
  4. import android.os.Bundle;  
  5. import android.util.Log;  
  6.   
  7. import com.baidu.location.BDLocation;  
  8. import com.baidu.location.BDLocationListener;  
  9. import com.baidu.location.LocationClient;  
  10. import com.baidu.location.LocationClientOption;  
  11. import com.baidu.location.Poi;  
  12. import com.baidu.mapapi.SDKInitializer;  
  13. import com.baidu.mapapi.map.MapView;  
  14.   
  15. import java.util.List;  
  16.   
  17. public class ShowMapActivity extends AppCompatActivity {  
  18.   
  19.     private MapView mMapView;  
  20.     public LocationClient mLocationClient = null;  
  21.     public BDLocationListener myListener = new MyLocationListener();  
  22.   
  23.     @Override  
  24.     protected void onCreate(Bundle savedInstanceState) {  
  25.         super.onCreate(savedInstanceState);  
  26.         //在使用SDK各组件之前初始化context信息,传入ApplicationContext  
  27.         //注意该方法要再setContentView方法之前实现  
  28.         //使用百度地图的任何功能都需要先初始化这段代码  最好放在全局中进行初始化  
  29.         //百度地图+定位+marker比较简单 我就不放到全局去了  
  30.         SDKInitializer.initialize(getApplicationContext());  
  31.         setContentView(R.layout.activity_show_map);  
  32.         //获取地图控件引用  
  33.         mMapView = (MapView) findViewById(R.id.bmapView);  
  34.   
  35.         //声明LocationClient类  
  36.         mLocationClient = new LocationClient(getApplicationContext());  
  37.         //注册监听函数  
  38.         mLocationClient.registerLocationListener( myListener );  
  39.   
  40.         //配置定位参数  
  41.         initLocation();  
  42.         //开始定位  
  43.         mLocationClient.start();  
  44.     }  
  45.   
  46.     /**
  47.      * 配置定位参数
  48.      */  
  49.     private void initLocation(){  
  50.         LocationClientOption option = new LocationClientOption();  
  51.         option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy  
  52.         );//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备  
  53.         option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系  
  54.         int span=1000;  
  55.         option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的  
  56.         option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要  
  57.         option.setOpenGps(true);//可选,默认false,设置是否使用gps  
  58.         option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果  
  59.         option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”  
  60.         option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到  
  61.         option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死  
  62.         option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集  
  63.         option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要  
  64.         mLocationClient.setLocOption(option);  
  65.     }  
  66.   
  67.     /**
  68.      * 实现定位监听 位置一旦有所改变就会调用这个方法
  69.      * 可以在这个方法里面获取到定位之后获取到的一系列数据
  70.      */  
  71.     public class MyLocationListener implements BDLocationListener {  
  72.   
  73.         private double lat;  
  74.         private double lon;  
  75.   
  76.         @Override  
  77.         public void onReceiveLocation(BDLocation location) {  
  78.             //Receive Location  
  79.             StringBuffer sb = new StringBuffer(256);  
  80.             sb.append("time : ");  
  81.             sb.append(location.getTime());  
  82.             sb.append("\nerror code : ");  
  83.             sb.append(location.getLocType());  
  84.             sb.append("\nlatitude : ");  
  85.             sb.append(location.getLatitude());  
  86.             sb.append("\nlontitude : ");  
  87.             sb.append(location.getLongitude());  
  88.             sb.append("\nradius : ");  
  89.             sb.append(location.getRadius());  
  90.             lat = location.getLatitude();  
  91.             lon = location.getLongitude();  
  92.             if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果  
  93.                 sb.append("\nspeed : ");  
  94.                 sb.append(location.getSpeed());// 单位:公里每小时  
  95.                 sb.append("\nsatellite : ");  
  96.                 sb.append(location.getSatelliteNumber());  
  97.                 sb.append("\nheight : ");  
  98.                 sb.append(location.getAltitude());// 单位:米  
  99.                 sb.append("\ndirection : ");  
  100.                 sb.append(location.getDirection());// 单位度  
  101.                 sb.append("\naddr : ");  
  102.                 sb.append(location.getAddrStr());  
  103.                 sb.append("\ndescribe : ");  
  104.                 sb.append("gps定位成功");  
  105.   
  106.             } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果  
  107.                 sb.append("\naddr : ");  
  108.                 sb.append(location.getAddrStr());  
  109.                 //运营商信息  
  110.                 sb.append("\noperationers : ");  
  111.                 sb.append(location.getOperators());  
  112.                 sb.append("\ndescribe : ");  
  113.                 sb.append("网络定位成功");  
  114.             } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果  
  115.                 sb.append("\ndescribe : ");  
  116.                 sb.append("离线定位成功,离线定位结果也是有效的");  
  117.             } else if (location.getLocType() == BDLocation.TypeServerError) {  
  118.                 sb.append("\ndescribe : ");  
  119.                 sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");  
  120.             } else if (location.getLocType() == BDLocation.TypeNetWorkException) {  
  121.                 sb.append("\ndescribe : ");  
  122.                 sb.append("网络不同导致定位失败,请检查网络是否通畅");  
  123.             } else if (location.getLocType() == BDLocation.TypeCriteriaException) {  
  124.                 sb.append("\ndescribe : ");  
  125.                 sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");  
  126.             }  
  127.             sb.append("\nlocationdescribe : ");  
  128.             sb.append(location.getLocationDescribe());// 位置语义化信息  
  129.             List<Poi> list = location.getPoiList();// POI数据  
  130.             if (list != null) {  
  131.                 sb.append("\npoilist size = : ");  
  132.                 sb.append(list.size());  
  133.                 for (Poi p : list) {  
  134.                     sb.append("\npoi= : ");  
  135.                     sb.append(p.getId() + " " + p.getName() + " " + p.getRank());  
  136.                 }  
  137.             }  
  138.             Log.v("pcw","lat : " + lat+" lon : " + lon);  
  139.             Log.i("BaiduLocationApiDem", sb.toString());  
  140.         }  
  141.     }  
  142.   
  143.     /**
  144.      * 必须要实现
  145.      */  
  146.     @Override  
  147.     protected void onDestroy() {  
  148.         super.onDestroy();  
  149.         //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理  
  150.         mMapView.onDestroy();  
  151.     }  
  152.   
  153.     /**
  154.      * 必须要实现
  155.      */  
  156.     @Override  
  157.     protected void onResume() {  
  158.         super.onResume();  
  159.         //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理  
  160.         mMapView.onResume();  
  161.     }  
  162.   
  163.     /**
  164.      * 必须要实现
  165.      */  
  166.     @Override  
  167.     protected void onPause() {  
  168.         super.onPause();  
  169.         //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理  
  170.         mMapView.onPause();  
  171.     }  
  172. }  
复制代码

4.声明LocationClient类 并注册监听函数

  1. //声明LocationClient类  
  2.         mLocationClient = new LocationClient(getApplicationContext());  
  3.         //注册监听函数  
  4.         mLocationClient.registerLocationListener( myListener );  
复制代码

5.配置定位参数

  1. /**
  2.      * 配置定位参数
  3.      */  
  4.     private void initLocation(){  
  5.         LocationClientOption option = new LocationClientOption();  
  6.         option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy  
  7.         );//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备  
  8.         option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系  
  9.         int span=1000;  
  10.         option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的  
  11.         option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要  
  12.         option.setOpenGps(true);//可选,默认false,设置是否使用gps  
  13.         option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果  
  14.         option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”  
  15.         option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到  
  16.         option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死  
  17.         option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集  
  18.         option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要  
  19.         mLocationClient.setLocOption(option);  
  20.     }  
复制代码

6.实现定位监听

  1. /**  
  2.     * 实现定位监听 位置一旦有所改变就会调用这个方法  
  3.     * 可以在这个方法里面获取到定位之后获取到的一系列数据  
  4.     */  
  5.    public class MyLocationListener implements BDLocationListener {  
  6.   
  7.        private double lat;  
  8.        private double lon;  
  9.   
  10.        @Override  
  11.        public void onReceiveLocation(BDLocation location) {  
  12.            //Receive Location  
  13.            StringBuffer sb = new StringBuffer(256);  
  14.            sb.append("time : ");  
  15.            sb.append(location.getTime());  
  16.            sb.append("\nerror code : ");  
  17.            sb.append(location.getLocType());  
  18.            sb.append("\nlatitude : ");  
  19.            sb.append(location.getLatitude());  
  20.            sb.append("\nlontitude : ");  
  21.            sb.append(location.getLongitude());  
  22.            sb.append("\nradius : ");  
  23.            sb.append(location.getRadius());  
  24.            lat = location.getLatitude();  
  25.            lon = location.getLongitude();  
  26.            if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果  
  27.                sb.append("\nspeed : ");  
  28.                sb.append(location.getSpeed());// 单位:公里每小时  
  29.                sb.append("\nsatellite : ");  
  30.                sb.append(location.getSatelliteNumber());  
  31.                sb.append("\nheight : ");  
  32.                sb.append(location.getAltitude());// 单位:米  
  33.                sb.append("\ndirection : ");  
  34.                sb.append(location.getDirection());// 单位度  
  35.                sb.append("\naddr : ");  
  36.                sb.append(location.getAddrStr());  
  37.                sb.append("\ndescribe : ");  
  38.                sb.append("gps定位成功");  
  39.   
  40.            } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果  
  41.                sb.append("\naddr : ");  
  42.                sb.append(location.getAddrStr());  
  43.                //运营商信息  
  44.                sb.append("\noperationers : ");  
  45.                sb.append(location.getOperators());  
  46.                sb.append("\ndescribe : ");  
  47.                sb.append("网络定位成功");  
  48.            } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果  
  49.                sb.append("\ndescribe : ");  
  50.                sb.append("离线定位成功,离线定位结果也是有效的");  
  51.            } else if (location.getLocType() == BDLocation.TypeServerError) {  
  52.                sb.append("\ndescribe : ");  
  53.                sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");  
  54.            } else if (location.getLocType() == BDLocation.TypeNetWorkException) {  
  55.                sb.append("\ndescribe : ");  
  56.                sb.append("网络不同导致定位失败,请检查网络是否通畅");  
  57.            } else if (location.getLocType() == BDLocation.TypeCriteriaException) {  
  58.                sb.append("\ndescribe : ");  
  59.                sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");  
  60.            }  
  61.            sb.append("\nlocationdescribe : ");  
  62.            sb.append(location.getLocationDescribe());// 位置语义化信息  
  63.            List<Poi> list = location.getPoiList();// POI数据  
  64.            if (list != null) {  
  65.                sb.append("\npoilist size = : ");  
  66.                sb.append(list.size());  
  67.                for (Poi p : list) {  
  68.                    sb.append("\npoi= : ");  
  69.                    sb.append(p.getId() + " " + p.getName() + " " + p.getRank());  
  70.                }  
  71.            }  
  72.            Log.v("pcw","lat : " + lat+" lon : " + lon);  
  73.            Log.i("BaiduLocationApiDem", sb.toString());  
  74.        }  
  75.    }  
复制代码

5.设置中心点和marker

效果图

13.jpg

1.基础地图+定位+设置中心点+marker 所有代码

  1. package com.demo.baidumapblog;  
  2.   
  3. import android.os.Handler;  
  4. import android.os.Message;  
  5. import android.support.v7.app.AppCompatActivity;  
  6. import android.os.Bundle;  
  7. import android.util.Log;  
  8.   
  9. import com.baidu.location.BDLocation;  
  10. import com.baidu.location.BDLocationListener;  
  11. import com.baidu.location.LocationClient;  
  12. import com.baidu.location.LocationClientOption;  
  13. import com.baidu.location.Poi;  
  14. import com.baidu.mapapi.SDKInitializer;  
  15. import com.baidu.mapapi.map.BaiduMap;  
  16. import com.baidu.mapapi.map.BitmapDescriptor;  
  17. import com.baidu.mapapi.map.BitmapDescriptorFactory;  
  18. import com.baidu.mapapi.map.MapStatus;  
  19. import com.baidu.mapapi.map.MapStatusUpdate;  
  20. import com.baidu.mapapi.map.MapStatusUpdateFactory;  
  21. import com.baidu.mapapi.map.MapView;  
  22. import com.baidu.mapapi.map.MarkerOptions;  
  23. import com.baidu.mapapi.map.OverlayOptions;  
  24. import com.baidu.mapapi.model.LatLng;  
  25.   
  26. import java.util.List;  
  27.   
  28. public class ShowMapActivity extends AppCompatActivity {  
  29.   
  30.     private MapView mMapView;  
  31.   
  32.     private boolean isFirstLocation = true;  
  33.   
  34.     public LocationClient mLocationClient = null;  
  35.     public BDLocationListener myListener = new MyLocationListener();  
  36.     private BaiduMap mBaiduMap;  
  37.   
  38.     private double lat;  
  39.     private double lon;  
  40.   
  41.   
  42.     @Override  
  43.     protected void onCreate(Bundle savedInstanceState) {  
  44.         super.onCreate(savedInstanceState);  
  45.         //在使用SDK各组件之前初始化context信息,传入ApplicationContext  
  46.         //注意该方法要再setContentView方法之前实现  
  47.         //使用百度地图的任何功能都需要先初始化这段代码  最好放在全局中进行初始化  
  48.         //百度地图+定位+marker比较简单 我就不放到全局去了  
  49.         SDKInitializer.initialize(getApplicationContext());  
  50.         setContentView(R.layout.activity_show_map);  
  51.         //获取地图控件引用  
  52.         mMapView = (MapView) findViewById(R.id.bmapView);  
  53.         //获取BaiduMap对象  
  54.         mBaiduMap = mMapView.getMap();  
  55.         //声明LocationClient类  
  56.         mLocationClient = new LocationClient(getApplicationContext());  
  57.         //注册监听函数  
  58.         mLocationClient.registerLocationListener(myListener);  
  59.   
  60.         //配置定位参数  
  61.         initLocation();  
  62.         //开始定位  
  63.         mLocationClient.start();  
  64.   
  65.     }  
  66.   
  67.   
  68.     /**
  69.      * 添加marker
  70.      */  
  71.     private void setMarker() {  
  72.         Log.v("pcw","setMarker : lat : "+ lat+" lon : " + lon);  
  73.         //定义Maker坐标点  
  74.         LatLng point = new LatLng(lat, lon);  
  75.         //构建Marker图标  
  76.         BitmapDescriptor bitmap = BitmapDescriptorFactory  
  77.                 .fromResource(R.drawable.location_marker);  
  78.         //构建MarkerOption,用于在地图上添加Marker  
  79.         OverlayOptions option = new MarkerOptions()  
  80.                 .position(point)  
  81.                 .icon(bitmap);  
  82.         //在地图上添加Marker,并显示  
  83.         mBaiduMap.addOverlay(option);  
  84.     }  
  85.   
  86.     /**
  87.      * 设置中心点
  88.      */  
  89.     private void setUserMapCenter() {  
  90.         Log.v("pcw","setUserMapCenter : lat : "+ lat+" lon : " + lon);  
  91.         LatLng cenpt = new LatLng(lat,lon);  
  92.         //定义地图状态  
  93.         MapStatus mMapStatus = new MapStatus.Builder()  
  94.                 .target(cenpt)  
  95.                 .zoom(18)  
  96.                 .build();  
  97.         //定义MapStatusUpdate对象,以便描述地图状态将要发生的变化  
  98.         MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);  
  99.         //改变地图状态  
  100.         mBaiduMap.setMapStatus(mMapStatusUpdate);  
  101.   
  102.     }  
  103.   
  104.     /**
  105.      * 配置定位参数
  106.      */  
  107.     private void initLocation(){  
  108.         LocationClientOption option = new LocationClientOption();  
  109.         option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy  
  110.         );//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备  
  111.         option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系  
  112.         int span=1000;  
  113.         option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的  
  114.         option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要  
  115.         option.setOpenGps(true);//可选,默认false,设置是否使用gps  
  116.         option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果  
  117.         option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”  
  118.         option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到  
  119.         option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死  
  120.         option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集  
  121.         option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要  
  122.         mLocationClient.setLocOption(option);  
  123.     }  
  124.   
  125.     /**
  126.      * 实现定位监听 位置一旦有所改变就会调用这个方法
  127.      * 可以在这个方法里面获取到定位之后获取到的一系列数据
  128.      */  
  129.     public class MyLocationListener implements BDLocationListener {  
  130.   
  131.         @Override  
  132.         public void onReceiveLocation(BDLocation location) {  
  133.             //Receive Location  
  134.             StringBuffer sb = new StringBuffer(256);  
  135.             sb.append("time : ");  
  136.             sb.append(location.getTime());  
  137.             sb.append("\nerror code : ");  
  138.             sb.append(location.getLocType());  
  139.             sb.append("\nlatitude : ");  
  140.             sb.append(location.getLatitude());  
  141.             sb.append("\nlontitude : ");  
  142.             sb.append(location.getLongitude());  
  143.             sb.append("\nradius : ");  
  144.             sb.append(location.getRadius());  
  145.   
  146.             if (location.getLocType() == BDLocation.TypeGpsLocation) {// GPS定位结果  
  147.                 sb.append("\nspeed : ");  
  148.                 sb.append(location.getSpeed());// 单位:公里每小时  
  149.                 sb.append("\nsatellite : ");  
  150.                 sb.append(location.getSatelliteNumber());  
  151.                 sb.append("\nheight : ");  
  152.                 sb.append(location.getAltitude());// 单位:米  
  153.                 sb.append("\ndirection : ");  
  154.                 sb.append(location.getDirection());// 单位度  
  155.                 sb.append("\naddr : ");  
  156.                 sb.append(location.getAddrStr());  
  157.                 sb.append("\ndescribe : ");  
  158.                 sb.append("gps定位成功");  
  159.   
  160.             } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {// 网络定位结果  
  161.                 sb.append("\naddr : ");  
  162.                 sb.append(location.getAddrStr());  
  163.                 //运营商信息  
  164.                 sb.append("\noperationers : ");  
  165.                 sb.append(location.getOperators());  
  166.                 sb.append("\ndescribe : ");  
  167.                 sb.append("网络定位成功");  
  168.             } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {// 离线定位结果  
  169.                 sb.append("\ndescribe : ");  
  170.                 sb.append("离线定位成功,离线定位结果也是有效的");  
  171.             } else if (location.getLocType() == BDLocation.TypeServerError) {  
  172.                 sb.append("\ndescribe : ");  
  173.                 sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");  
  174.             } else if (location.getLocType() == BDLocation.TypeNetWorkException) {  
  175.                 sb.append("\ndescribe : ");  
  176.                 sb.append("网络不同导致定位失败,请检查网络是否通畅");  
  177.             } else if (location.getLocType() == BDLocation.TypeCriteriaException) {  
  178.                 sb.append("\ndescribe : ");  
  179.                 sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");  
  180.             }  
  181.             sb.append("\nlocationdescribe : ");  
  182.             sb.append(location.getLocationDescribe());// 位置语义化信息  
  183.             List<Poi> list = location.getPoiList();// POI数据  
  184.             if (list != null) {  
  185.                 sb.append("\npoilist size = : ");  
  186.                 sb.append(list.size());  
  187.                 for (Poi p : list) {  
  188.                     sb.append("\npoi= : ");  
  189.                     sb.append(p.getId() + " " + p.getName() + " " + p.getRank());  
  190.                 }  
  191.             }  
  192.             lat = location.getLatitude();  
  193.             lon = location.getLongitude();  
  194.               
  195.             //这个判断是为了防止每次定位都重新设置中心点和marker  
  196.             if(isFirstLocation){  
  197.                 isFirstLocation = false;  
  198.                 setMarker();  
  199.                 setUserMapCenter();  
  200.             }  
  201.             Log.v("pcw","lat : " + lat+" lon : " + lon);  
  202.             Log.i("BaiduLocationApiDem", sb.toString());  
  203.         }  
  204.     }  
  205.   
  206.     /**
  207.      * 必须要实现
  208.      */  
  209.     @Override  
  210.     protected void onDestroy() {  
  211.         super.onDestroy();  
  212.         //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理  
  213.         mMapView.onDestroy();  
  214.     }  
  215.   
  216.     /**
  217.      * 必须要实现
  218.      */  
  219.     @Override  
  220.     protected void onResume() {  
  221.         super.onResume();  
  222.         //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理  
  223.         mMapView.onResume();  
  224.     }  
  225.   
  226.     /**
  227.      * 必须要实现
  228.      */  
  229.     @Override  
  230.     protected void onPause() {  
  231.         super.onPause();  
  232.         //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理  
  233.         mMapView.onPause();  
  234.     }  
  235. }  
复制代码

2.设置中心点的代码:

  1. /**
  2.     * 设置中心点
  3.     */  
  4.    private void setUserMapCenter() {  
  5.        Log.v("pcw","setUserMapCenter : lat : "+ lat+" lon : " + lon);  
  6.        LatLng cenpt = new LatLng(lat,lon);  
  7.        //定义地图状态  
  8.        MapStatus mMapStatus = new MapStatus.Builder()  
  9.                .target(cenpt)  
  10.                .zoom(18)  
  11.                .build();  
  12.        //定义MapStatusUpdate对象,以便描述地图状态将要发生的变化  
  13.        MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mMapStatus);  
  14.        //改变地图状态  
  15.        mBaiduMap.setMapStatus(mMapStatusUpdate);  
  16.   
  17.    }  
复制代码

3.添加marker:

  1. /**
  2.      * 添加marker
  3.      */  
  4.     private void setMarker() {  
  5.         Log.v("pcw","setMarker : lat : "+ lat+" lon : " + lon);  
  6.         //定义Maker坐标点  
  7.         LatLng point = new LatLng(lat, lon);  
  8.         //构建Marker图标  
  9.         BitmapDescriptor bitmap = BitmapDescriptorFactory  
  10.                 .fromResource(R.drawable.location_marker);  
  11.         //构建MarkerOption,用于在地图上添加Marker  
  12.         OverlayOptions option = new MarkerOptions()  
  13.                 .position(point)  
  14.                 .icon(bitmap);  
  15.         //在地图上添加Marker,并显示  
  16.         mBaiduMap.addOverlay(option);  
  17.     }  
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精华推荐
  • 一个人开始废掉的3种迹象

    一个人开始废掉的3种迹象

  • 从零到60秒的惬意冰镇啤酒

    从零到60秒的惬意冰镇啤酒

  • 马云、马化腾、王石都弃之不用的人,有一个共同点

    马云、马化腾、王石都弃之不用的人,有一个

  • 哥特式高迪凳子

    哥特式高迪凳子

  • 千亿小米,雷军逆袭

    千亿小米,雷军逆袭

  • 她一战赚了几十亿,她说:世界上最好的生意有三种

    她一战赚了几十亿,她说:世界上最好的生意有

  • 雷军:合伙人比制度更重要!

    雷军:合伙人比制度更重要!

  • 一个美美的令人喜欢的自行车铃

    一个美美的令人喜欢的自行车铃

QQ客服热线
QQ:1090281100 周一至周日:09:00 - 21:00
WeChat:dianlingkeji
Email:kaixin1069@vip.qq.com

优定义logo

勿要吝啬你无形资产,请为创新续源,知识、点子、灵感、经验、需求等均是创新源泉,你不经意的一句话将是另一个人的灵感。明天的明天,还有明天,我们应该把握今天,每一个今天,都有一个新的事物在出现,今天的漠视明天的落后,不浪费每一个学习的时刻,学习助力非凡。

技术支持 Discuz! X3.4 - 3.5 beta © 2001-2018 Comsenz Inc.

小黑屋|手机版|优定义 ( 粤ICP备16085288号-2 )|申请友链|网站地图

粤公网安备 44011102001144 号 GMT+8, 2018-10-17 12:07 , Processed in 0.114734 second(s), 29 queries .

快速回复 返回顶部 返回列表