高德地图的使用(二)定位
定位
显示地图过后,就是进行定位,这里我将介绍如何实现定位功能,以及如何改变定位的小图标
实现定位功能
定位功能基本有两种展现形式,一种是在地图上展示定位图标,另一种是自动定位并显示地点名称
参考文档
在地图上展示定位图标
private MyLocationStyle myLocationStyle = new MyLocationStyle(); //初始化定位蓝点样式类//声明AMapLocationClient类对象public AMapLocationClient mLocationClient = null;//声明AMapLocationClientOption对象public AMapLocationClientOption mLocationOption = null;//初始化AMapLocationClientOption对象mLocationOption = new AMapLocationClientOption();//初始化定位mLocationClient = new AMapLocationClient(getApplicationContext());//设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。//myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE);//定位一次,且将视角移动到地图中心点。// myLocationStyle.interval(2000); //设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的StyleaMap.getUiSettings().setMyLocationButtonEnabled(true);//设置默认定位按钮是否显示,非必需设置。aMap.setMyLocationEnabled(true);// 设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。//获取一次定位结果:该方法默认为false。mLocationOption.setOnceLocation(true);//获取最近3s内精度最高的一次定位结果://设置setOnceLocationLatest(boolean b)接口为true,启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为true,setOnceLocation(boolean b)接口也会被设置为true,反之不会,默认为false。mLocationOption.setOnceLocationLatest(true);//给定位客户端对象设置定位参数mLocationClient.setLocationOption(mLocationOption);//启动定位mLocationClient.startLocation();
实现接口AMapLocationListener,设置定位回调监听
mLocationClient.setLocationListener(this);
高德定位回调
@Overridepublic void onLocationChanged(AMapLocation aMapLocation) {if (aMapLocation != null) {if (aMapLocation.getErrorCode() == 0) {Double latitude = aMapLocation.getLatitude();Double longitude = aMapLocation.getLongitude();Log.d("888", "纬度=" + latitude + "精度=" + longitude);LatLng location = new LatLng(latitude, longitude);aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(location, 18));} else {//定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。Log.e("AmapError", "location Error, ErrCode:"+ aMapLocation.getErrorCode() + ", errInfo:"+ aMapLocation.getErrorInfo());}}}
到这里在地图上就会出现一个有着默认图标的定位点
需要注意的是:
Battery_Saving
低功耗模式,将只使用高德网络定位Device_Sensors
仅设备(Gps)模式,不支持室内环境的定位Hight_Accuracy
高精度模式,将同时使用高德网络定位和GPS定位,优先返回精度高的定位
一般使用的都是高精度模式,还是看个人需求吧。
另一个需要注意的就是
myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);
这个是连续定位,不好的地方就是如果你在地图上想滑到定位之外的地方,位置会立刻回到定位的地方。
屏幕缩放比
LatLng location = new LatLng(latitude, longitude);
aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(location, 18));
最后一点要注意的是:
//获取一次定位结果:该方法默认为false。
mLocationOption.setOnceLocation(true);
如果想多次定位,要将这个设为false
更改默认图标
设置圆圈的颜色
private static final int STROKE_COLOR = Color.argb(180, 3, 145, 255);private static final int FILL_COLOR = Color.argb(10, 0, 0, 180);
更改图标
myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(this.getResources(),R.mipmap.navi_map_gps_locked)));//可以根据自己的需要更改图标图片myLocationStyle.anchor(0.5f, 0.5f);//精度圈颜色自定义myLocationStyle.strokeColor(STROKE_COLOR);//设置定位蓝点精度圆圈的边框颜色的方法。myLocationStyle.radiusFillColor(FILL_COLOR); //设置定位蓝点精度圆圈的填充颜色的方法。
最后在onDestroy中设置
if (null != mLocationClient) {mLocationClient.onDestroy();//销毁定位客户端,同时销毁本地定位服务。
}
navi_map_gps_locked样子
总体代码:
public class ShowMapActivity extends Activity implements AMapLocationListener {private static final int STROKE_COLOR = Color.argb(180, 3, 145, 255);private static final int FILL_COLOR = Color.argb(10, 0, 0, 180);private AMap aMap; //初始化地图控制器对象private MapView mMapView;private MyLocationStyle myLocationStyle = new MyLocationStyle(); //初始化定位蓝点样式类//声明AMapLocationClient类对象public AMapLocationClient mLocationClient = null;//声明AMapLocationClientOption对象public AMapLocationClientOption mLocationOption = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_showmap);initView();mMapView.onCreate(savedInstanceState);initMap();setListener();}private void initView() {mMapView = (MapView) findViewById(R.id.map);}private void initMap() {if (aMap == null) {aMap = mMapView.getMap();}//初始化AMapLocationClientOption对象mLocationOption = new AMapLocationClientOption();//初始化定位mLocationClient = new AMapLocationClient(getApplicationContext());//设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//连续定位、且将视角移动到地图中心点,定位点依照设备方向旋转,并且会跟随设备移动。(1秒1次定位)如果不设置myLocationType,默认也会执行此种模式。
// myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATION_ROTATE);myLocationStyle.myLocationType(MyLocationStyle.LOCATION_TYPE_LOCATE);//定位一次,且将视角移动到地图中心点。
// myLocationStyle.interval(2000); //设置连续定位模式下的定位间隔,只在连续定位模式下生效,单次定位模式下不会生效。单位为毫秒。showIcon();aMap.setMyLocationStyle(myLocationStyle);//设置定位蓝点的Style
// aMap.getUiSettings().setMyLocationButtonEnabled(true);//设置默认定位按钮是否显示,非必需设置。aMap.setMyLocationEnabled(true);// 设置为true表示启动显示定位蓝点,false表示隐藏定位蓝点并不进行定位,默认是false。//获取一次定位结果:该方法默认为false。mLocationOption.setOnceLocation(true);//获取最近3s内精度最高的一次定位结果://设置setOnceLocationLatest(boolean b)接口为true,启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为true,setOnceLocation(boolean b)接口也会被设置为true,反之不会,默认为false。mLocationOption.setOnceLocationLatest(true);//给定位客户端对象设置定位参数mLocationClient.setLocationOption(mLocationOption);//启动定位mLocationClient.startLocation();}private void setListener() {mLocationClient.setLocationListener(this);}/*** 绘制小蓝点图标*/private void showIcon() {myLocationStyle.myLocationIcon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(this.getResources(),R.mipmap.navi_map_gps_locked)));myLocationStyle.anchor(0.5f, 0.5f);myLocationStyle.strokeColor(STROKE_COLOR);//设置定位蓝点精度圆圈的边框颜色的方法。myLocationStyle.radiusFillColor(FILL_COLOR); //设置定位蓝点精度圆圈的填充颜色的方法。}/*** 高德定位回调*/@Overridepublic void onLocationChanged(AMapLocation aMapLocation) {if (aMapLocation != null) {if (aMapLocation.getErrorCode() == 0) {Double latitude = aMapLocation.getLatitude();Double longitude = aMapLocation.getLongitude();Log.d("888", "纬度=" + latitude + "精度=" + longitude);LatLng location = new LatLng(latitude, longitude);aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(location, 18));} else {//定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。Log.e("AmapError", "location Error, ErrCode:"+ aMapLocation.getErrorCode() + ", errInfo:"+ aMapLocation.getErrorInfo());}}}@Overrideprotected void onDestroy() {super.onDestroy();//在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图mMapView.onDestroy();if (null != mLocationClient) {mLocationClient.onDestroy();//销毁定位客户端,同时销毁本地定位服务。}}@Overrideprotected void onResume() {super.onResume();//在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图mMapView.onResume();}@Overrideprotected void onPause() {super.onPause();//在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制mMapView.onPause();mLocationClient.stopLocation();//停止定位后,本地定位服务并不会被销毁}@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);//在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态mMapView.onSaveInstanceState(outState);}}
自动定位并显示地点名称
需要设置的跟上面差不多
总体代码
public class ShowLocationActivity extends Activity implements AMapLocationListener{//声明AMapLocationClient类对象public AMapLocationClient mLocationClient = null;//声明AMapLocationClientOption对象public AMapLocationClientOption mLocationOption = null;private TextView mTvLocation;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_location);initView();initLocation();}private void initLocation() {//初始化AMapLocationClientOption对象mLocationOption = new AMapLocationClientOption();//初始化定位mLocationClient = new AMapLocationClient(getApplicationContext());//设置定位监听mLocationClient.setLocationListener(this);//设置定位模式为AMapLocationMode.Hight_Accuracy,高精度模式。mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//获取一次定位结果:该方法默认为false。mLocationOption.setOnceLocation(true);//获取最近3s内精度最高的一次定位结果://设置setOnceLocationLatest(boolean b)接口为true,启动定位时SDK会返回最近3s内精度最高的一次定位结果。如果设置其为true,setOnceLocation(boolean b)接口也会被设置为true,反之不会,默认为false。mLocationOption.setOnceLocationLatest(true);//给定位客户端对象设置定位参数mLocationClient.setLocationOption(mLocationOption);//启动定位mLocationClient.startLocation();}private void initView() {mTvLocation = (TextView) findViewById(R.id.tv_showLocation);}@Overrideprotected void onDestroy() {super.onDestroy();if (null != mLocationClient) {mLocationClient.onDestroy();//销毁定位客户端,同时销毁本地定位服务。}}@Overrideprotected void onPause() {super.onPause();mLocationClient.stopLocation();//停止定位后,本地定位服务并不会被销毁}@Overridepublic void onLocationChanged(AMapLocation aMapLocation) {if (aMapLocation != null) {if (aMapLocation.getErrorCode() == 0) {//显示你想显示的mTvLocation.setText(aMapLocation.getAddress());} else {//定位失败时,可通过ErrCode(错误码)信息来确定失败的原因,errInfo是错误信息,详见错误码表。Log.e("AmapError", "location Error, ErrCode:"+ aMapLocation.getErrorCode() + ", errInfo:"+ aMapLocation.getErrorInfo());}}}
}
可以获得的内容
//定位成功回调信息,设置相关消息amapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表amapLocation.getLatitude();//获取纬度amapLocation.getLongitude();//获取经度amapLocation.getAccuracy();//获取精度信息SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date date = new Date(amapLocation.getTime());df.format(date);//定位时间amapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。amapLocation.getCountry();//国家信息amapLocation.getProvince();//省信息amapLocation.getCity();//城市信息amapLocation.getDistrict();//城区信息amapLocation.getStreet();//街道信息amapLocation.getStreetNum();//街道门牌号信息amapLocation.getCityCode();//城市编码amapLocation.getAdCode();//地区编码amapLocation.getAOIName();//获取当前定位点的AOI信息
到此定位功能就完成了















