zoukankan      html  css  js  c++  java
  • Android百度地图定位

    在谈到百度地图。如今,每个人都知道这个时候应该可以了吧。而更多的字不拉。直接朝话题。

    访问百度地图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;//定位client
    	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));//设置地图状态
    		
    		//创建定位client
    		locationClient=new LocationClient(getApplicationContext());
    		//注冊监听器
    		locationClient.registerLocationListener(locationListener);
    		
    		
    		//实例化client定位參数
    		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));

    即使在这里定位的功能是多。



    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    Java实现 LeetCode 30 串联所有单词的子串
    Java实现 LeetCode 29 两数相除
    Java实现 LeetCode 29 两数相除
    Java实现 LeetCode 29 两数相除
    Java实现 LeetCode 28 实现strStr()
    Java实现 LeetCode 28 实现strStr()
    Java实现 LeetCode 28 实现strStr()
    Java实现 LeetCode 27 移除元素
    Java实现 LeetCode 27 移除元素
    字符编码终极笔记:ASCII、Unicode、UTF-8、UTF-16、UCS、BOM、Endian
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4777651.html
Copyright © 2011-2022 走看看