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

Posted bit_kaki

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArcGIS for Android Runtime100 基本操作——GPS定位相关的知识,希望对你有一定的参考价值。

      对于定位大家应该都不陌生,在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
   )
   ;
   //隐藏位置更新的符号动画
  

      




以上是关于ArcGIS for Android Runtime100 基本操作——GPS定位的主要内容,如果未能解决你的问题,请参考以下文章

arcgis for android 怎么加载wms服务

ArcGIS API For Android Errors汇总

Arcgis for android 100.4天地图无法显示

arcgis for android 添加图层并渲染有几种方式

ArcGIS for android访问天地图

Arcgis runtime for Android 100.5 (九) 空间查询