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));

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



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

  • 相关阅读:
    测试:安装测试用例
    测试:界面测试
    软件项目管理:什么是baseline
    测试:fiddler使用
    android adb常用指令
    sqlite语句主页
    几条常见的数据库分页 SQL 语句
    linux下tomcat无法访问问题(换一种说法:无法访问8080端口)
    eclipse中svn的各种状态图标详解
    Tomcat项目部署方式
  • 原文地址:https://www.cnblogs.com/hrhguanli/p/4777651.html
Copyright © 2011-2022 走看看