ArcGIS for Android Runtime100 基本操作(四)——GPS定位
2017-09-20 19:15
459 查看
对于定位大家应该都不陌生,在Android设备里,主要存在GPS定位、网络基站定位、AGPS定位等。在这里我们不对各位定位方式做深入阐述,默认以AGPS来说明下如何在Runtime100实现定位。
其实ArcGIS Runtime系列一直自带有定位的接口,但据说是不好用,所以以往大家往往用的是Android原生自带的定位方法来实现定位。不过对于Runtime100,我进行了一些测试,发现新的接口也挺好用,所以打算将Android原生的定位和Runtime100里的方法分别进行下说明。
Android原生定位方法——LocationManager
在Android原生里,定位都是通过LocationManager来实现的。最基本的用法如下所示:
先实例化一个LocationManager,然后通过LocationManager.getLastKnownLocation()方法就可以获取当前位置信息,运行结果如下:
可以看出在LocationManager里一共有四种方式提供位置信息,分为是:
上述方法是主动请求获取位置信息,如果要开通一个自动监听,则需要采用LocationListener,其方法依然是先实例化一个LocationManger,然后请求监听,代码如下:
对于LocationListener,里面一共含有四个参数,分别是:
参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种,前者是GPS,后者是GPRS以及WIFI定位
参数2,位置信息更新周期.单位是毫秒
参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息
参数4,监听
备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新
ArcGIS Runtime 100定位方法——LocationDisplay
在ArcGIS Runtime 100里新增了一个类LocationDisplay,其官方解释为:管理当前位置在显示地图里的展示,包括当前位置的信息,符号,以及随地图的平移、旋转、缩放等进行自动变化。
也就是有了这个类,不仅可以获取当前位置信息进行定位,也可以将位置信息展示出来。
不多说,直接上代码。首先是LocationDisplay的构造方法,LocationDisplay基于现实地图进行展示,所以是通过MapView获取的:
mMapView = (MapView) findViewById(R.id.mapview);String theURLString = "http://map.geoq.cn/arcgis/rest/services/ChinaOnlineCommunity/MapServer";ArcGISTiledLayer mainArcGISTiledLayer = new ArcGISTiledLayer(theURLString);Basemap mainBasemap = new Basemap(mainArcGISTiledLayer);arcGISMap.setBasemap(mainBasemap);mMapView.setMap(arcGISMap);locationDisplay = mMapView.getLocationDisplay();locationDisplay.setAutoPanMode(LocationDisplay.AutoPanMode.RECENTER );locationDisplay.startAsync();
然后是获取当前位置信息了。对于位置信息,LocationDisplay里有两种方法,分别如下:
Point point=locationDisplay.getMapLocation();Log.i("sss=",point.toString());LocationDataSource.Location location=locationDisplay.getLocation();Point point2=location.getPosition();Log.i("sss=",point2.toString());
我们运行下看看呢,结果如下:
由此我们可以看出,getMapLocation获取的点是基于当前地图坐标系的点,而getPosition是获取基于GPS的位置信息,再获取的点是基于WGS84的经纬度坐标。
如果要在LocationDisplay里进行位置信息的自动监听,方法也很简单,只需要LocationDisplay.addLocationChangedListener即可,代码如下:
locationDisplay.addLocationChangedListener(new LocationDisplay.LocationChangedListener() { @Override public void onLocationChanged(LocationDisplay.LocationChangedEvent locationChangedEvent) { LocationDataSource.Location location=locationChangedEvent.getLocation(); Point point=location.getPosition(); Log.i("sss=",point.toString()); }});
如此便可进行位置信息的自动监听了。
不过如果和原生的方法一样,那也就失去了意义。所以在定位功能上ArcGIS
Runtime 100一共有了以下几个特点:
1.位置监听的自动扫描模式
位置监听的自动扫描模式可能有点拗口,算是对于这个功能的直译吧。这个功能的意思是当你的位置信息变化时候,如何在地图上展示出来。使用方法为:LocationDisplay.setAutoPanMode(LocationDisplay.AutoMode)。
模式一共有四种,其官方API如下所示:
简要翻译下就是:
COMPASS_NAVIGATION
和NAVIGATION 分别最适用于步行导航和车载导航,用户的位置符号会固定显示在屏幕的某个点上,并且指向设备的顶部(也就是地图会随着用户移动而平移,随用户转弯而旋转);
OFF
模式,用户位置符号会随位置变化而移动,但地图不会动;
RECENTER模式,当用户位置处于当前地图范围内时候,用户位置符号会随位置变化而移动,但地图不会动;当用户位置处于地图边缘时候,地图会自动平移是用户的当前位置重新居于显示地图中心。
2.LocationDisplay类里可以直接设置位置符号样式
当我们执行LocationDisplay.startAsync()方法时候,会在地图上显示出我们当前位置,默认的符号如下所示:
如果我们想要改变这个符号样式,只需要重新设置符号即可,代码如下所示:
符号样式变化如下:
对于位置符号的设置有以下几种:
locationDisplay.setAcquiringSymbol(campsiteSymbol);//设置当前位置的填充符号locationDisplay.setAccuracySymbol(campsiteSymbol);//设置最后一个已知位置的标记符号locationDisplay.setPingAnimationSymbol(campsiteSymbol);//设置当前位置更新时候的动画locationDisplay.setCourseSymbol(campsiteSymbol);//设置当前位置的路线符号locationDisplay.setHeadingSymbol(campsiteSymbol);//设置当前位置设备面对方向的符号locationDisplay.setDefaultSymbol(campsiteSymbol);//设置默认符号
3.位置符号隐藏
在ArcGIS Runtime 100里假如我们只是想获取位置信息,而不需要显示出来,我们只需要将位置监听的模式设置为OFF,然后执行以下代码即可。
locationDisplay.setShowLocation(false);//隐藏符号locationDisplay.setShowAccuracy(false);//隐藏符号的缓存区域locationDisplay.setShowPingAnimation(false);//隐藏位置更新的符号动画
其实ArcGIS Runtime系列一直自带有定位的接口,但据说是不好用,所以以往大家往往用的是Android原生自带的定位方法来实现定位。不过对于Runtime100,我进行了一些测试,发现新的接口也挺好用,所以打算将Android原生的定位和Runtime100里的方法分别进行下说明。
Android原生定位方法——LocationManager
在Android原生里,定位都是通过LocationManager来实现的。最基本的用法如下所示:
LocationManager locationManager=(LocationManager)this.getSystemService(Context.LOCATION_SERVICE); final List<String> providers=locationManager.getProviders(true); for(String provider:providers){ Location location=locationManager.getLastKnownLocation(provider); if(location!=null) { Log.i(provider+"==", String.valueOf(location.getLongitude()) + "," + String.valueOf(location.getLatitude())); }else{ Log.i(provider+"==",null); } }
先实例化一个LocationManager,然后通过LocationManager.getLastKnownLocation()方法就可以获取当前位置信息,运行结果如下:
可以看出在LocationManager里一共有四种方式提供位置信息,分为是:
passive | 被动方式,通过获取其他设备或者本设备之前获取的数据提供位置信息 |
gps | 通过GPS芯片获取到位置信息 |
network | 通过wifi或者基站信息获取位置信息 |
local_database | 通过本地数据库里获取位置信息 |
LocationManager locationManager=(LocationManager)this.getSystemService(Context.LOCATION_SERVICE); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new LocationListener() { @Override public void onLocationChanged(Location location) { //位置信息变化时触发 if(location!=null) { Log.i("GPS==", String.valueOf(location.getLongitude()) + "," + String.valueOf(location.getLatitude())); }else{ Log.i("GPS==","空的"); } } @Override public void onStatusChanged(String provider, int status, Bundle extras) { //GPS状态变化时触发 } @Override public void onProviderEnabled(String provider) { //GPS开启时触发 } @Override public void onProviderDisabled(String provider) { //GPS禁用时触发 } });
对于LocationListener,里面一共含有四个参数,分别是:
参数1,设备:有GPS_PROVIDER和NETWORK_PROVIDER两种,前者是GPS,后者是GPRS以及WIFI定位
参数2,位置信息更新周期.单位是毫秒
参数3,位置变化最小距离:当位置距离变化超过此值时,将更新位置信息
参数4,监听
备注:参数2和3,如果参数3不为0,则以参数3为准;参数3为0,则通过时间来定时更新;两者为0,则随时刷新
ArcGIS Runtime 100定位方法——LocationDisplay
在ArcGIS Runtime 100里新增了一个类LocationDisplay,其官方解释为:管理当前位置在显示地图里的展示,包括当前位置的信息,符号,以及随地图的平移、旋转、缩放等进行自动变化。
也就是有了这个类,不仅可以获取当前位置信息进行定位,也可以将位置信息展示出来。
不多说,直接上代码。首先是LocationDisplay的构造方法,LocationDisplay基于现实地图进行展示,所以是通过MapView获取的:
mMapView = (MapView) findViewById(R.id.mapview);String theURLString = "http://map.geoq.cn/arcgis/rest/services/ChinaOnlineCommunity/MapServer";ArcGISTiledLayer mainArcGISTiledLayer = new ArcGISTiledLayer(theURLString);Basemap mainBasemap = new Basemap(mainArcGISTiledLayer);arcGISMap.setBasemap(mainBasemap);mMapView.setMap(arcGISMap);locationDisplay = mMapView.getLocationDisplay();locationDisplay.setAutoPanMode(LocationDisplay.AutoPanMode.RECENTER );locationDisplay.startAsync();
然后是获取当前位置信息了。对于位置信息,LocationDisplay里有两种方法,分别如下:
Point point=locationDisplay.getMapLocation();Log.i("sss=",point.toString());LocationDataSource.Location location=locationDisplay.getLocation();Point point2=location.getPosition();Log.i("sss=",point2.toString());
我们运行下看看呢,结果如下:
由此我们可以看出,getMapLocation获取的点是基于当前地图坐标系的点,而getPosition是获取基于GPS的位置信息,再获取的点是基于WGS84的经纬度坐标。
如果要在LocationDisplay里进行位置信息的自动监听,方法也很简单,只需要LocationDisplay.addLocationChangedListener即可,代码如下:
locationDisplay.addLocationChangedListener(new LocationDisplay.LocationChangedListener() { @Override public void onLocationChanged(LocationDisplay.LocationChangedEvent locationChangedEvent) { LocationDataSource.Location location=locationChangedEvent.getLocation(); Point point=location.getPosition(); Log.i("sss=",point.toString()); }});
如此便可进行位置信息的自动监听了。
不过如果和原生的方法一样,那也就失去了意义。所以在定位功能上ArcGIS
Runtime 100一共有了以下几个特点:
1.位置监听的自动扫描模式
位置监听的自动扫描模式可能有点拗口,算是对于这个功能的直译吧。这个功能的意思是当你的位置信息变化时候,如何在地图上展示出来。使用方法为:LocationDisplay.setAutoPanMode(LocationDisplay.AutoMode)。
模式一共有四种,其官方API如下所示:
简要翻译下就是:
COMPASS_NAVIGATION
和NAVIGATION 分别最适用于步行导航和车载导航,用户的位置符号会固定显示在屏幕的某个点上,并且指向设备的顶部(也就是地图会随着用户移动而平移,随用户转弯而旋转);
OFF
模式,用户位置符号会随位置变化而移动,但地图不会动;
RECENTER模式,当用户位置处于当前地图范围内时候,用户位置符号会随位置变化而移动,但地图不会动;当用户位置处于地图边缘时候,地图会自动平移是用户的当前位置重新居于显示地图中心。
2.LocationDisplay类里可以直接设置位置符号样式
当我们执行LocationDisplay.startAsync()方法时候,会在地图上显示出我们当前位置,默认的符号如下所示:
如果我们想要改变这个符号样式,只需要重新设置符号即可,代码如下所示:
locationDisplay = mMapView.getLocationDisplay(); Resources resources=getResources(); BitmapDrawable bitmapDrawable= new BitmapDrawable(BitmapFactory.decodeResource(resources,R.drawable.location)); final PictureMarkerSymbol campsiteSymbol = new PictureMarkerSymbol(bitmapDrawable); campsiteSymbol.loadAsync(); campsiteSymbol.addDoneLoadingListener(new Runnable() { @Override public void run() { locationDisplay.setDefaultSymbol(campsiteSymbol);//设置默认符号 locationDisplay.setShowAccuracy(false);//隐藏符号的缓存区域 } });
符号样式变化如下:
对于位置符号的设置有以下几种:
locationDisplay.setAcquiringSymbol(campsiteSymbol);//设置当前位置的填充符号locationDisplay.setAccuracySymbol(campsiteSymbol);//设置最后一个已知位置的标记符号locationDisplay.setPingAnimationSymbol(campsiteSymbol);//设置当前位置更新时候的动画locationDisplay.setCourseSymbol(campsiteSymbol);//设置当前位置的路线符号locationDisplay.setHeadingSymbol(campsiteSymbol);//设置当前位置设备面对方向的符号locationDisplay.setDefaultSymbol(campsiteSymbol);//设置默认符号
3.位置符号隐藏
在ArcGIS Runtime 100里假如我们只是想获取位置信息,而不需要显示出来,我们只需要将位置监听的模式设置为OFF,然后执行以下代码即可。
locationDisplay.setShowLocation(false);//隐藏符号locationDisplay.setShowAccuracy(false);//隐藏符号的缓存区域locationDisplay.setShowPingAnimation(false);//隐藏位置更新的符号动画
相关文章推荐
- ArcGIS for Android Runtime100 基本操作(三)——离线数据空间查询
- ArcGIS for Android Runtime100 基本操作(二)——地图控件的常见操作
- ArcGIS for Android Runtime100 基本操作(六)——移动地图包MMPK的使用
- ArcGIS for Android Runtime100 基本操作(一)——点线面测距离长度和面积
- ArcGIS for Android Runtime100 基本操作(一)——图层加载和切换
- ArcGIS for Android Runtime100 基本操作(七)——三维地图初步使用
- ArcGIS for Android Runtime100 基本操作(五)——绘制图层和符号渲染
- arcgis for flex 基本操作
- MySQL for Mac 安装和基本操作
- Python推特开发库tweepy基本操作:Twitter for Python
- ArcGIS Runtime SDK for iOS(六) --- 空间几何分析与操作(中)
- Arcgis for Androd API开发系列教程(一)——地图显示与GPS定位
- ArcGIS.Server.9.3和ArcGIS API for JavaScript实现基本的地图功能
- ArcGIS基本操作收集汇总
- PHP MySQL 基本操作 & Navicat for MySQL
- ArcGIS for Android Runtime10.2.9(1):开发环境配置
- Arcgis for Androd API开发系列教程(一)——地图显示与GPS定位
- arcgis api for javascript (1) 基本的地图显示及spatialReference
- ArcGIS for Android地图控件的5大常见操作