文档章节

基于百度地图API的轨迹重现

-水水-
 -水水-
发布于 2014/04/29 23:53
字数 1587
阅读 738
收藏 5
点赞 1
评论 6

前不久写android应用需要用到轨迹记录,网上找了好多,结合自己看的文档,把这些写出来,给更多人看到,虽然很简单,但还是挺有用的。

主要思路

    百度地图显示地图需要使用一个View来显示地图,地图上有一个图层用来显示轨迹,叫 com.baidu.mapapi.map.RouteOverlay在RouteOverlay上添加路径信息,然后绘制在图层上,再显示出来就好鸟~

  1. 使用百度api首先需要申请百度api的key

    这里申请下载百度的sdk  

  2.  然后就是代码啦

新建一个工程 就叫baduTraceDemo吧  工程配置

把下载的sdk文件里的jar和so库文件解压粗来,把百度定位需要的jar文件放在工程的libs文件夹下,然后在libs文件夹下新建一个文件夹叫 armeabi 把so文件放在这,就像这样


MainActivity里就放一个Button就好了,

MainActivity.java

public class MainActivity extends Activity {
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}	
	public void OnClick(View v){
		switch(v.getId()){
		case R.id.startBtn :
			Intent intent = new Intent(MainActivity.this,LocationOverlay.class);
			startActivity(intent);
			break;
		default :
			break;
		}
	}
}

把BaiduMapsApiDemo里面的DemoApplication直接复制过来,把里面的key 改成我们自己申请的

再定义地图显示图层,

public class LocationOverlay extends Activity {

	/**
	 * 定位间隔  单位毫秒
	 */
	private int seconds = 1000 * 20;
	/**
	 *  经纬度数组
	 */
	private geoPointArray gpArray ;
	
	/**
	 *  定位开始点
	 */
	private GeoPoint start;
	
	/**
	 *  定位结束点
	 */
	private GeoPoint end;
	
	/**
	 *  定位点的集合 即路径
	 */
	private MKRoute mkRoute;
	
	/**
	 *  定位图层
	 */
	private RouteOverlay routeOverlay;
	// 定位相关
	LocationClient mLocClient;
	LocationData locData = null;
	public MyLocationListenner myListener = new MyLocationListenner();
	
	MapView mMapView = null;	// 地图View
	
	/**
	 *  地图控制器
	 */
	private MapController mMapController = null; 
	boolean isFirstLoc = true;//是否首次定位
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        /**
         * 使用地图sdk前需先初始化BMapManager.
         * BMapManager是全局的,可为多个MapView共用,它需要地图模块创建前创建,
         * 并在地图地图模块销毁后销毁,只要还有地图模块在使用,BMapManager就不应该销毁
         */
        DemoApplication app = (DemoApplication)this.getApplication();
        if (app.mBMapManager == null) {
            app.mBMapManager = new BMapManager(getApplicationContext());
            /**
             * 如果BMapManager没有初始化则初始化BMapManager
             */
            app.mBMapManager.init(DemoApplication.strKey,new DemoApplication.MyGeneralListener());
        }
        setContentView(R.layout.activity_locationoverlay);
        CharSequence titleLable="记录轨迹";
        setTitle(titleLable);

        
		//地图初始化
        mMapView = (MapView)findViewById(R.id.bmapView);
        mMapController = mMapView.getController();
        mMapView.getController().setZoom(14);
        mMapView.getController().enableClick(true);
        mMapView.setBuiltInZoomControls(true);
        
        //定位初始化
        mLocClient = new LocationClient( this );
        locData = new LocationData();
        mLocClient.registerLocationListener( myListener );
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true);//打开gps
        option.setCoorType("bd09ll");     //设置坐标类型
        option.setScanSpan(seconds);	// 定位间隔时间  单位毫秒
        option.setIsNeedAddress(true); // 需要街道名称信息
        option.setNeedDeviceDirect(false); // 不需要方向信息
        mLocClient.setLocOption(option);
        mLocClient.start();
        
        mkRoute = new MKRoute();  
        routeOverlay = new RouteOverlay(LocationOverlay.this, mMapView);
       
        routeOverlay.setData(mkRoute);
	    //添加定位图层
		mMapView.getOverlays().add(routeOverlay);
	
		//修改定位数据后刷新图层生效
		mMapView.refresh();
		
    }
    /**
     * 修改位置图标
     * @param marker
     */
    public void modifyLocationOverlayIcon(Drawable marker){
    	//当传入marker为null时,使用默认图标绘制
    	routeOverlay.setEnMarker(marker);
    	//修改图层,需要刷新MapView生效
    	mMapView.refresh();
    }       
    /**
     * 定位SDK监听函数
     */
    public class MyLocationListenner implements BDLocationListener {    	
        @Override
        public void onReceiveLocation(BDLocation location) {
            if (location == null)
                return ;   
            locData.latitude = location.getLatitude();
            locData.longitude = location.getLongitude();            
            //如果不显示定位精度圈,将accuracy赋值为0即可
            locData.accuracy = 0;
            // 此处可以设置 locData的方向信息, 如果定位 SDK 未返回方向信息,用户可以自己实现罗盘功能添加方向信息。
            locData.direction = location.getDerect();            
            // 是手动触发请求或首次定位时
            if (isFirstLoc){
            	gpArray = new geoPointArray();
            	start = new GeoPoint((int)(locData.latitude* 1e6), (int)(locData.longitude *  1e6));
            	end = new GeoPoint((int)(locData.latitude* 1e6), (int)(locData.longitude *  1e6));
            	// 把开始点放在路径中
            	gpArray.addGeoPoint(start);
            	// 构造路径
            	mkRoute.customizeRoute(start, end, gpArray.getGeoPointArray());
            	// 定位图层设置路径
            	routeOverlay.setData(mkRoute);
            	// 更新图层数据执行刷新后生效
            	mMapView.refresh();
            	// 移动地图到定位点
                mMapController.animateTo(new GeoPoint((int)(locData.latitude* 1e6), (int)(locData.longitude *  1e6)));
                isFirstLoc = false;
            }else{
            	Log.i("test:LocationOverlay","loc:"+location.getLatitude()+","+location.getLongitude()+","+location.getAddrStr());
            	end = new GeoPoint((int)(locData.latitude* 1e6), (int)(locData.longitude *  1e6));
            	// 把当前点放在路径中
            	gpArray.addGeoPoint(end);
            	// 构造路径
            	mkRoute.customizeRoute(start, end, gpArray.getGeoPointArray());
            	// 定位图层设置路径
            	routeOverlay.setData(mkRoute); 
            	// 移动地图到定位点
            	mMapController.animateTo(new GeoPoint((int)(locData.latitude* 1e6), (int)(locData.longitude *  1e6)));
            	// 刷新图层
            	mMapView.refresh();

            }
        }
		@Override
		public void onReceivePoi(BDLocation arg0) {
			// TODO Auto-generated method stub
			
		}
    } 

    @Override
    protected void onPause() {
        mMapView.onPause();
        super.onPause();
    }
    
    @Override
    protected void onResume() {
        mMapView.onResume();
        super.onResume();
    }
    
    @Override
    protected void onDestroy() {
    	//退出时销毁定位
        if (mLocClient != null)
            mLocClient.stop();
        mMapView.destroy();
        super.onDestroy();
    }
    
    @Override
    protected void onSaveInstanceState(Bundle outState) {
    	super.onSaveInstanceState(outState);
    	mMapView.onSaveInstanceState(outState);    	
    }
    
    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
    	super.onRestoreInstanceState(savedInstanceState);
    	mMapView.onRestoreInstanceState(savedInstanceState);
    } 
}
/**
 *  经纬度数组类
 */
class geoPointArray{
	
	private ArrayList <GeoPoint> mlist;
	geoPointArray(){
		mlist = new ArrayList<GeoPoint>();
	}
	
	public void addGeoPoint(GeoPoint point){
		mlist.add(point);
	}
	
	/**
	 * @return 返回包含经纬度点的一纬数组
	 */
	public GeoPoint[] getGeoPointArray(){
		GeoPoint []gp = new GeoPoint[mlist.size()];
		for(int i=0; i<mlist.size(); i++){
			gp[i] = mlist.get(i);
		}
		return  gp;
	}
}

地图图层的路径信息参数是 com.baidu.mapapi.search.MKRoute,而MKRoute里面还要构造一系列的点来组成路径customizeRoute(GeoPoint st, GeoPoint en, GeoPoint[] passby)   我们就自己写一个类来构造GeoPoint[] passby ,就是上面的geoPointArray,卧槽我研究这个研究了好久的说,当然还要重写监听器 MyLocationListenner,在这个监听器里面没定一次位就把得到的经纬度点添加我geoPointArray里面,

gpArray.addGeoPoint(currentPoint);

重新构造一次路径,再把路径添加到图层上

mkRoute.customizeRoute(start, end, gpArray.getGeoPointArray());

routeOverlay.setData(mkRoute);

最后是ManiFest.xml的填写,把百度需要的权限啊,服务啊,还有key添加上 

添加百度的各种权限 ,百度真流氓,给的demo里面还要打电话的权限,这里用不到,就去掉了

   <!--使用网络功能所需权限  -->  
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE">  
	</uses-permission>  
	<uses-permission android:name="android.permission.INTERNET">  
	</uses-permission>  
	<uses-permission android:name="android.permission.ACCESS_WIFI_STATE">  
	</uses-permission>  
	<uses-permission android:name="android.permission.CHANGE_WIFI_STATE">  
	</uses-permission>  
	<!-- SDK离线地图和cache功能需要读写外部存储器 -->  
	<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">  
	</uses-permission>  
	<uses-permission android:name="android.permission.WRITE_SETTINGS">  
	</uses-permission>  
	<!-- 使用定位功能所需权限,demo已集成百度定位SDK,不使用定位功能可去掉以下6项 -->  
	<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">  
	</uses-permission>  
	<permission android:name="android.permission.BAIDU_LOCATION_SERVICE">  
	</permission>  
	<uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE">  
	</uses-permission>  
	<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION">  
	</uses-permission>  
	<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION">  
	</uses-permission>

在<application>里面添加这两行,服务权限,和key,自己用的话,记得把里面的key值换掉哦

<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="yRLtRhhaGdHuuLXeulWCtjSu"/>
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" />

3. 差不多完成了,可以编译试试了

当然这里写的太简略了,一会把工程放下面,完成之后出去转一圈试试

4.终于写完鸟

  卧槽,终于写完鸟,第一次写博客,感觉写博客好难,比写代码麻烦,不知道从哪里开始写,有东西讲不粗来的感觉,看来要好好练练了(OSC肿么没有预览),以后多写博客^_^

代码,还没用osc的git,就先用网盘吧 baiduTraceDemo.zip

© 著作权归作者所有

共有 人打赏支持
-水水-

-水水-

粉丝 18
博文 6
码字总数 3783
作品 0
朝阳
高级程序员
加载中

评论(6)

-水水-
-水水-

引用来自“ToSun”的评论

赞一个

谢谢~
ToSun
ToSun
赞一个
-水水-
-水水-

引用来自“铂金小狼”的评论

顶一下小天
铂金小狼
铂金小狼
顶一下小天
开源中国董事会主席
开源中国董事会主席

引用来自“水云天”的评论

尼玛 。格式惨不忍睹。。。1,第一次写博客儿,大家见谅
第一次 都不会那么顺畅的
-水水-
-水水-
尼玛 。格式惨不忍睹。。。1,第一次写博客儿,大家见谅
BMap:WEB 服务API

ylbtech-Map-Baidu: WEB 服务API 百度地图Web服务API为开发者提供http/https接口,即开发者通过http/https形式发起检索请求,获取返回json或xml格式的检索数据。用户可以基于此开发JavaScrip...

吞吞吐吐的 ⋅ 2017/11/07 ⋅ 0

nmgwap/百度地图轨迹,多个标注点,坐标拾取

百度地图api实现运动轨迹、坐标拾取、多点标注并显示信息窗体 平台页面功能说明 获取多个坐标点标注在地图上 根据不同状态显示不同的信息窗口样式 根据地址检索坐标点(可显示多个) 鼠标点击...

nmgwap ⋅ 03/30 ⋅ 0

新手如何开发一个基于桌面客户端的漂亮地图应用

对于经常做信息化的开发人员来说,如果第一次开发地图应用可能要走很多的弯路: 1.购买地图, 因为现在的谷歌和百度地图API,都是基于Javascript的,如果要开发C/S架构的桌面地图应用非常不方...

长平狐 ⋅ 2013/03/12 ⋅ 0

利用百度地图JavaScript API绘制运动轨迹

写在前面 欢迎访问我的博客 如果需要使用百度地图javasript api,需先进行开发者认证,balalalala写上一堆理由之后认证就行,然后创建浏览器端的应用,得到可用的Ak,详情见百度地图开放平台。...

Zliang_8917 ⋅ 2017/12/25 ⋅ 0

根据一连串的经纬度在地图上画出轨迹

根据一连串的经纬度画出行走的轨迹,显示在地图上,并保存图片,除了高德,百度,前台 提供的api,有后台纯java的吗

心境111 ⋅ 2016/09/06 ⋅ 2

IE使用GOOGLE Map的折线Polyline出现不能清除的问题

自己用google map v2的api开发了一个基于地图的定位服务网站,一般都很好,但是如果查看历史轨迹时(即在地图上画多个标注图,然后用折线将标志图连接达到轨迹的目的)。放大、缩小地图多次后...

口米巴 ⋅ 2013/01/17 ⋅ 0

轨迹系列——WebGIS中使用ZRender实现轨迹前端动态播放特效

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中需要在地图上以时间轴方式播放人员、车辆在地图上的历史行进轨迹。在之前的...

李晓晖 ⋅ 2017/04/16 ⋅ 0

百度离线地图资源

离线地图资源,完全可脱离互联网访问,正在发愁局域网或内网使用地图定位的小伙伴们福音来了。。。。。。哈哈哈哈哈!!! 支持各大主流浏览器 IE7、8、9、10,火狐、360浏览器、谷歌浏览器 ...

迷猫 ⋅ 2016/11/12 ⋅ 0

iOS开发之在地图上绘制出你运行的轨迹

iOS中的MapKit集成了google地图api的很多功能加上iOS的定位的功能,我们就可以实现将你运行的轨迹绘制到地图上面。这个功能非常有用,比如汽车的gprs追踪、人员追踪、快递追踪等等。这篇文章...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

百度地图离线数据包V2,0

离线地图资源,完全可脱离互联网访问,正在发愁局域网或内网使用地图定位的小伙伴们福音来了。。。。。。哈哈哈哈哈!!! 支持各大主流浏览器 IE7、8、9、10、11,火狐、360浏览器、谷歌浏览...

ysw349686 ⋅ 2016/10/21 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

如何将S/4HANA系统存储的图片文件用Java程序保存到本地

我在S/4HANA的事务码MM02里为Material维护图片文件作为附件: 通过如下简单的ABAP代码即可将图片文件的二进制内容读取出来: REPORT zgos_api.DATA ls_appl_object TYPE gos_s_obj.DA...

JerryWang_SAP ⋅ 32分钟前 ⋅ 0

Cube的构建过程

Cube 的构建方式有两种:全量构建和增量构建。两者的构建过程完全一样,区别在于构建时读取的数据源是全集还是子集。 Cube的构建步骤: 1.创建临时的 Hive 平表(从 Hive 读取数据)。 2.计算...

无精疯 ⋅ 36分钟前 ⋅ 0

云计算的选择悖论如何对待?

导读 人们都希望在工作和生活中有所选择。但心理学家的调查研究表明,在多种选项中进行选择并不一定会使人们更快乐,甚至不会产生更好的决策。心理学家Barry Schwartz称之为“选择悖论”。云...

问题终结者 ⋅ 39分钟前 ⋅ 0

637. Average of Levels in Binary Tree - LeetCode

Question 637. Average of Levels in Binary Tree Solution 思路:定义一个map,层数作为key,value保存每层的元素个数和所有元素的和,遍历这个树,把map里面填值,遍历结束后,再遍历这个map,把每...

yysue ⋅ 54分钟前 ⋅ 0

IDEA配置和使用

版本控制 svn IDEA版本控制工具不能使用 VCS-->Enable Version Control Integration File-->Settings-->Plugins 搜索Subversion,勾选SVN和Git插件 删除.idea文件夹重新生成项目 安装SVN客户......

bithup ⋅ 今天 ⋅ 0

Hive函数

1.函数explode (一转多) create table hive_wc(sentence string); load data local inpath '/home/hadoop/data/hive-wc.txt' into table hive_wc; 结果: hive > select * from hive_wc; ......

GordonNemo ⋅ 今天 ⋅ 0

PE格式第三讲扩展,VA,RVA,FA的概念

作者:IBinary 出处:http://www.cnblogs.com/iBinary/ 版权所有,欢迎保留原文链接进行转载:) 一丶VA概念 VA (virtual Address) 虚拟地址的意思 ,比如随便打开一个PE,找下它的虚拟地址 这边...

simpower ⋅ 今天 ⋅ 0

180623-SpringBoot之logback配置文件

SpringBoot配置logback 项目的日志配置属于比较常见的case了,之前接触和使用的都是Spring结合xml的方式,引入几个依赖,然后写个 logback.xml 配置文件即可,那么在SpringBoot中可以怎么做?...

小灰灰Blog ⋅ 今天 ⋅ 0

冒泡排序

原理:比较两个相邻的元素,将值大的元素交换至右端。 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第...

人觉非常君 ⋅ 今天 ⋅ 0

Vagrant setup

安装软件 brew cask install virtualboxbrew cask install vagrant 创建project mkdir -p mst/vmcd mst/vmvagrant init hashicorp/precise64vagrant up hashicorp/precise64是一个box......

遥借东风 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部