ArcGIS for Android Runtime100 基本操作(四)——GPS定位

原创 2017年09月20日 19:15:55

      对于定位大家应该都不陌生,在Android设备里,主要存在GPS定位、网络基站定位、AGPS定位等。在这里我们不对各位定位方式做深入阐述,默认以AGPS来说明下如何在Runtime100实现定位。


      其实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 通过本地数据库里获取位置信息

      上述方法是主动请求获取位置信息,如果要开通一个自动监听,则需要采用LocationListener,其方法依然是先实例化一个LocationManger,然后请求监听,代码如下:


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);//隐藏位置更新的符号动画

      




版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/bit_kaki/article/details/78044398

Arcgis for Androd API开发系列教程(一)——地图显示与GPS定位

Arcgis Android API开发示例,实现了地图的显示与GPS定位等功能……
  • GISShiXiSheng
  • GISShiXiSheng
  • 2013-12-12 16:06:26
  • 5080

Arcgis For Android之GPS定位实现

Arcgis For Android之GPS定位实现
  • GISShiXiSheng
  • GISShiXiSheng
  • 2014-12-16 13:47:31
  • 5171

基于ArcGIS 的GPS数据地图匹配

GPS数据由于信号不良、通信异常、定位误差等原因,不能很好地落在道路上,所以需要对GPS数据进行地图匹配,与道路进行关联。而空间数据由于其特殊的数据格式,最佳的处理途径仍旧是ArcGIS Deskto...
  • destinyuan
  • destinyuan
  • 2016-05-08 15:37:02
  • 6150

Arcgis for Android解决定位结果与地图偏移的简单处理思维

Arcgis for Android解决定位结果与地图偏移的简单处理思维
  • GISShiXiSheng
  • GISShiXiSheng
  • 2014-12-25 10:26:18
  • 3037

使用GPS如何在软件和操作层面上实现快速高精度的定位?

使用GPS如何在软件和操作层面上实现快速高精度的定位?
  • wildboy2001
  • wildboy2001
  • 2013-09-19 15:42:08
  • 4251

安卓智能地图开发与实施十七:使用天地图 - ArcGIS Runtime SDK for Android(Version 100.1.0)

WebTiledLayer100.1的新版本最大的亮点是三维,同时新加入了图层类型和可扩展的切片图层WebTiledLayer。继承自ServiceImageTiledLayer。BingMapsLa...
  • allenlu2008
  • allenlu2008
  • 2017-07-03 23:14:07
  • 2969

安卓智能地图开发与实施十三:空间查询与展示 - ArcGIS Runtime SDK for Android(Version 100.0.0)

空间查询与展示空间查询需要入口(屏幕触摸、文字输入,甚至绘制个Geometry进行查询),也需要展示容器,如果查询仅仅返回一条记录,在地图中弹出窗口展示信息足矣。当返回多条记录,特别是多个图层的多条记...
  • allenlu2008
  • allenlu2008
  • 2017-05-31 11:06:44
  • 1607

安卓智能地图开发与实施六:离线基础底图 - ArcGIS Runtime SDK for Android(Version 100.0.0)

离线基础底图(Offline Tiled Layers)离线基础底图最传统的方式是直接拷贝ArcGIS Server服务的切片成果,存在的问题是无论使用松散型还是紧凑型都包含太多碎小文件,部署不便。T...
  • allenlu2008
  • allenlu2008
  • 2017-05-04 12:14:49
  • 3568

arcgis for android 100.00之前的版本授权码

// 设置 Client ID         ArcGISRuntime.setClientId("UnfRUDfbmWmxMKYF");         // 示例许可码;从客服或esri分销...
  • thor027
  • thor027
  • 2017-05-09 11:10:26
  • 926

安卓智能地图开发与实施十六:三维地图 - ArcGIS Runtime SDK for Android(Version 100.1.0)

三维地图三维地图多了一个维度来基于位置表达信息,100.1的版本中已经整合了完整的三维展示方案。新版本发布,我们先看效果...
  • allenlu2008
  • allenlu2008
  • 2017-07-01 12:05:54
  • 2081
收藏助手
不良信息举报
您举报文章:ArcGIS for Android Runtime100 基本操作(四)——GPS定位
举报原因:
原因补充:

(最多只允许输入30个字)