前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Arcgis API for Android之GPS定位

Arcgis API for Android之GPS定位

作者头像
lzugis
发布2018-10-23 15:55:09
8740
发布2018-10-23 15:55:09
举报
代码语言:javascript
复制
欢迎大家加入Arcgis API for Android的QQ交流群:337469080

先说说写这篇文章的原因吧,在群内讨论的过程中,有人提到了定位的问题,刚好,自己以前在做相关工作的时候做过相关的东西,所以就总结一下,给大家共享出来,由于本人水平有限,bug是在所难免,还望有更高的高人批评指正。废话不多说,直接进入主题。

要想在地图上定位并将定位结果实时显示出来,启示逻辑上很简单:首先,接收并解析GPS或者网络的位置信息,一般来说,接受的位置信息是WGS84的经纬度的,但是我们的地图的投影一般都不会是WGS84的,所以,位置信息接收来了得做一次坐标转换,目前,坐标转换的方式有七参数或者四参数的方式,但是这两种参数转换的算法和方式都不怎么方便,还好,Arcgis支持从WGS84到地图投影的转换,转换完成之后再在地图上将该点展示出来并间隔刷新即可实现。下面我来说说我的实现方式:

1、定义一个GraphicsLayer并将之添加到map

代码语言:javascript
复制
GraphicsLayer gLayerGps;
代码语言:javascript
复制
……
代码语言:javascript
复制
gLayerGps = new GraphicsLayer();
mapview.addLayer(gLayerGps);

2、定义一个PictureMarkerSymbol用来设置位置显示的样式

代码语言:javascript
复制
PictureMarkerSymbol locationSymbol;
代码语言:javascript
复制
locationSymbol =  new PictureMarkerSymbol(this.getResources().getDrawable(
				R.drawable.location));

3、定义LocationManager

代码语言:javascript
复制
LocationManager locMag;
//要定位在地图中的位置,需要知道当前位置,而当前位置有Location对象决定,
//但是,Location对象又需要LocationManager对象来创建。
//创建LocationManager的唯一方法
locMag = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
//获得Provider列表
final List<String> providers=locMag.getProviders(true);

4、循环Provider,根据Provider获取位置信息

代码语言:javascript
复制
		//循环Provider,根据Provider获取位置信息
	  	for(String provider:providers)
	  	{
		    loc = locMag.getLastKnownLocation(provider);
		  	
		    LocationListener locationListener = new LocationListener(){
		    	/**
		    	 * 位置改变时调用
		    	 */
		    	public void onLocationChanged(Location location) {
					lblPosition.setText("Lat:"+String.format("%.4f", location.getLatitude()) + ",Lon:" + String.format("%.4f", location.getLongitude()));
					//刷新图层
					markLocation(location);
				}
		    	//Provider失效时调用
				public void onProviderDisabled(String arg0) 
				{
				}
				//Provider生效时调用
				public void onProviderEnabled(String arg0) 
				{
				}
				//状态改变时调用
				public void onStatusChanged(String arg0, int arg1, Bundle arg2) 
				{
				}
			};		
			locMag.requestLocationUpdates(provider, 100, 0, locationListener);
			if(loc!=null)
			{
				double latitude = loc.getLatitude();
				double longitude = loc.getLongitude();
				lblPosition.setText("Lat:"+String.format("%.4f", latitude) + ",Lon:" + String.format("%.4f", longitude));
				//开始画图
				markLocation(loc);
			}
		}

5、当位置不为空时,就在地图上画点

代码语言:javascript
复制
	/**
	 * 在地图上显示当前位置
	 * @param location
	 */
	private void markLocation(Location location)
	{		
		gLayerPos.removeAll();
		double locx = location.getLongitude();
		double locy = location.getLatitude();
		wgspoint = new Point(locx, locy);  
		mapPoint = (Point) GeometryEngine.project(wgspoint,SpatialReference.create(4326),mapview.getSpatialReference());
	
		//图层的创建
		Graphic graphicPoint = new Graphic(mapPoint,locationSymbol);
		gLayerPos.addGraphic(graphicPoint);
		/*划线
		if (startPoint == null) {
			poly=new Polyline();
			startPoint = mapPoint;
			poly.startPath((float) startPoint.getX(),
					(float) startPoint.getY());
			Graphic graphicLine = new Graphic(startPoint,new SimpleLineSymbol(Color.RED,2));
			gLayerGps.addGraphic(graphicLine);
		}*/
		poly.lineTo((float) mapPoint.getX(), (float) mapPoint.getY());
		gLayerGps.addGraphic(new Graphic(poly,new SimpleLineSymbol(Color.BLACK,2)));
	}

6、将gLayerPos显示

代码语言:javascript
复制
代码语言:javascript
复制
gLayerPos.setVisible(false);

这样,GPS的点就能在地图上显示了,并且能够显示所走的路径……

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2014年04月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com