ArcGIS for Android Runtime100 基本操作(一)——图层加载和切换

2017年08月30日 19:03:09

      之前我打算通过代码移植的方式来学习ArcGIS for Android Runtime100,博文地址是:http://blog.csdn.net/bit_kaki/article/details/7719648。但是觉得效果不太理想,因为这个版本的变化实在太多,即使修改后代码不报错,但是因为很多方法的改变,也会给自己留下很多坑,因为方法改变,自己实际上还是错了。

      所以我打算重新开贴来从头学习下ArcGIS for Android Runtime100,看来学习这个事还是得踏踏实实才行啊。

      对于ArcGIS 10.5的一些特性和ArcGIS for Android Runtime100的优势我已经在上一篇文章做过阐述,这里不再累述。


一、环境配置


      和之前ArcGIS所需环境差不多,在project的build.gradle里添加url:

allprojects {
    repositories {
        jcenter()
        maven {
            url 'http://esri.bintray.com/arcgis'
        }
    }
}

      然后在module的build.gradle里添加compile:
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:25.3.1'
 //   compile 'com.esri.arcgis.android:arcgis-android:10.2.8'
    compile 'com.esri.arcgisruntime:arcgis-android:100.1.0'
}

      注意下面个是Runtime100,被我注释掉的是之前用的10.2.8

二、地图和图层(MapView和Layer)


      在ArcGIS Runtime的产品里,地图都是通过MapView展示出来的。作为地图展示的容器,我们可以通过MapView实现缩放、旋转、平移、获取范围、比例尺、分辨率等信息,以及进行常用的手势操作等。
      在10.2里MapView直接继承于ViewGroup类,本身就是地图内容的展示容器,使用时候直接在MapView可以加载各种基础底图、业务图层和绘制图层。




      但是在Runtime100里,增加了3D地图显示的功能。为了满足大多数人的使用习惯,Esri依然采用MapView类作为2D地图的展示容器,新增了SceneView类作为3D地图的展示容器,然后这两个类共同继承于一个叫GeoView的基类。



      然后整个MapView的结构也进行了更改。不再是作为一个容器直接添加图层,而是分成了地图内容和绘制图层两部分进行添加:



      所以在Runtime100里,多出来一个额外的类——ArcGISMap。MapView类不再直接和Layer类关联,而是通过了ArcGISMap类关联,将图层数据的加载、删除、管理等操作全交给ArcGISMap类来完成。

      ArcGISMap类里可以包含一个底图图层和多个业务图层,底图永远位于地图最下层,而业务图层的顺序则是通过ArcGISMap.getOperationalLayers的方法获取到一个包含当前加载图层的集合类LayerList,再通过这个类进行控制。另外整个地图的空间参考将由ArcGISMap类加载的第一个图层来定,也就是说这个空间参考不一定是根据底图来确定。

      MapView通过MapView.setMap(ArcGISMap)来和ArcGISMap进行关联。



      MapView是展示地图的容器,而地图的内容则是通过Layer来表达,每个Layer包含了一个图层的数据。Layer按数据类型可以分大约二十类,这里不再进行一一阐述,就常用的几种Layer说明下。

  • 切片数据图层(ArcGISTiledLayer

      切片数据主要用来做为底图的展示,包含渲染后的地图和地图的空间参考信息,其离线数据的格式为TPK。

      Runtime100新增了一个ArcGISTiledLayer类来展示切片数据,说是新增,其实是将之前的ArcGISLocalTiledLayer类和ArcGISTiledMapServiceLayer类合并成一个,也就是说这个类既可以加载离线TPK数据,也可以加载在线切片数据。使用方法如下所示:

      离线数据:

String url = StorageUtil.getSDCardRootPath(getApplicationContext()) + "/ydyzt/data/YGYX.tpk";
TileCache mainTileCache = new TileCache(url);
ArcGISTiledLayer layer = new ArcGISTiledLayer(mainTileCache);

      在线数据:

String theURLString ="http://map.geoq.cn/arcgis/rest/services/ChinaOnlineCommunity/MapServer";
ArcGISTiledLayer mainArcGISTiledLayer = new ArcGISTiledLayer(theURLString);

  • 矢量切片数据图层(ArcGISVectorTiledLayer

      矢量切片数据是ArcGIS10.4里推出的一种新数据,它在传统的切片数据的基础上同时打包了矢量数据,因此除了展示外,也可以提供查询的功能。其离线打包数据格式为VTPK。

      Runtime100里采用ArcGISVectorTiledLayer类来展示矢量切片数据,使用方法和ArcGISTiledLayer类相似:

      离线数据:

String url = StorageUtil.getSDCardRootPath(getApplicationContext()) + "/ydyzt/data/YGYX_YS.vtpk";
ArcGISVectorTiledLayer layer = new ArcGISVectorTiledLayer(mainTileCache);

      在线数据:

String theOfflineTiledLayers ="https://www.arcgis.com/home/item.html?id=e19e9330bf08490ca8353d76b5e2e658";
ArcGISVectorTiledLayer mainArcGISVectorTiledLayer = new ArcGISVectorTiledLayer(theOfflineTiledLayers);


  • 要素图层(FeatureLayer

     要素信息是ArcGIS的最基本的信息,包含了矢量信息以及与之对应的表数据,可以用来进行展示、查询、分析、编辑等。其离线数据格式为geodatabase。

     Runtime100里依然保留了ArcGIS的经典图层——FeatureLayer,每个要素图层里都通过一个FeatureTable构造来。FeatureTable可以通过离线geodatabase获取,也可以通过在线的要素服务得到:

      离线数据:

String path=StorageUtil.getSDCardRootPath(getApplicationContext())+"/ydyzt/data/GD_TDYT.geodatabase";
final Geodatabase localGdb=new Geodatabase(path);
localGdb.loadAsync();
localGdb.addDoneLoadingListener(new Runnable() {
    @Override
    public void run() {
        LayerList mainLayerList = arcGISMap.getOperationalLayers();
        for (GeodatabaseFeatureTable gdbFeatureTable : localGdb.getGeodatabaseFeatureTables()) {
                 FeatureLayer dataFeatureLayer = new FeatureLayer(gdbFeatureTable);
                 mainLayerList.add(dataFeatureLayer);
} }});

      在线数据:

String mainFeatureLayerURL =
        "http://sampleserver6.arcgisonline.com/arcgis/rest/services/PoolPermits/FeatureServer/0";
final ServiceFeatureTable mainServiceFeatureTable = new ServiceFeatureTable(mainFeatureLayerURL);
mainServiceFeatureTable.setFeatureRequestMode(ServiceFeatureTable.FeatureRequestMode.ON_INTERACTION_NO_CACHE);
mainServiceFeatureTable.addLoadStatusChangedListener(new LoadStatusChangedListener() {
    @Override
    public void loadStatusChanged(LoadStatusChangedEvent loadStatusChangedEvent) {
        if (loadStatusChangedEvent.getNewLoadStatus() == LoadStatus.LOADED) {
            ServiceFeatureTable.FeatureRequestMode mainFeatureRequestMode =
                    mainServiceFeatureTable.getFeatureRequestMode();
            String mainFeatureRequestModeName = mainFeatureRequestMode.name();
        }
    }
});

  • 动态地图图层(ArcGISMapImageLayer和ArcGISMapImageSublayer
      动态地图图层ArcGISMapImageLayer是通过访问动态地图服务MapService获取的,里面包含的是一个子图层集合SublayerList,通过这个子图层集合可以构造得到每个动态地图图层ArcGISMapImageSublayer:

String mainArcGISMapImageLayerURL =
        "http://sampleserver6.arcgisonline.com/arcgis/rest/services/SampleWorldCities/MapServer";
final ArcGISMapImageLayer mainMapImageLayer = new ArcGISMapImageLayer(mainArcGISMapImageLayerURL);
mainMapImageLayer.addDoneLoadingListener(new Runnable() {
    @Override
    public void run() {
        SublayerList mainSublayerList = mainMapImageLayer.getSublayers();
        ArcGISMapImageSublayer mainMapImageSublayer = (ArcGISMapImageSublayer) mainSublayerList.get(0);
    }
});

  • 移动地图数据包含的图层
      移动地图数据是ArcGIS10.5新推出的一种数据格式,其特点是将所有地图和数据资源打包,并且将数据存储于压缩的Mobile GDB中,因此可以进行展示、查询、分析等所有操作。相比TPK数据来数据更小,而对于geodatabase数据而言,其加载图层效率上有明显的优势。因为其获取图层的方式比较特殊,所以单独拿出来说明下。

      MMPK因为是将所有地图和数据资源打包,因此其直接获取到的是ArcGISMap,我们要获取要素图层,需要先获取到ArcGISMap以后,再从其中获取FeatureLayer。

String mainMMPKPath = StorageUtil.getSDCardRootPath(getApplicationContext())+"/ydyzt/data/SanFrancisco.mmpk";
final MobileMapPackage mainMobileMapPackage = new MobileMapPackage(mainMMPKPath);
mainMobileMapPackage.loadAsync();
mainMobileMapPackage.addDoneLoadingListener(new Runnable() {
    @Override
    public void run() {
        LoadStatus mainLoadStatus = mainMobileMapPackage.getLoadStatus();
        if (mainLoadStatus == LoadStatus.LOADED) {
            List<ArcGISMap> mainArcGISMapL = mainMobileMapPackage.getMaps();
            ArcGISMap mainArcGISMapMMPK = mainArcGISMapL.get(0);            
            mMapView.setMap(mainArcGISMapMMPK);
} }});

      除此以外,图层还有三维地图图层(ArcGISSceneLayer),基于微软必应地图的图层(BingMapsLayer),要素集合图层(FeatureCollectionLayer)等等,就不一一介绍了。


三、图层的加载和切换


      我们获取到了图层信息以后,需要将这些信息加载在地图上。在ArcGIS 10.2里,我们这需要执行MapView.addLayer(Layer)方法即可在地图上加载图层。

      而之前我们可以看到,在Runtime100里,MapView是通过ArcGISMap类来完成图层的管理,所以方法也就变了。

      首先是底图的加载。之前我们也介绍了,ArcGISMap类是将底图和业务图层分开的,对于底图,ArcGISMap里用了Baemap类来进行管理。取一个完整的例子就是:

    mMapView = (MapView) findViewById(R.id.mapview);
    arcGISMap = new ArcGISMap();
    String url = StorageUtil.getSDCardRootPath(getApplicationContext()) + "/ydyzt/data/YGYX.tpk";
    TileCache mainTileCache = new TileCache(url);
    ArcGISTiledLayer layer = new ArcGISTiledLayer(mainTileCache);
    Basemap basemap = new Basemap(layer);
    arcGISMap.setBasemap(basemap);
    mMapView.setMap(arcGISMap);

      而如果我们要切换底图时候,仅需要给ArcGISMap类重新赋值一个底图即可。

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Basemap basemap = new Basemap(layer);
        arcGISMap.setBasemap(basemap);
        mMapView.setMap(arcGISMap);
    }
});

      对于业务图层的加载,上一章我们也说了,ArcGISMap类管理业务图层是通过一个包含当前加载图层的集合类LayerList来进行管理的,加载时候的方法如下所示:

String path=StorageUtil.getSDCardRootPath(getApplicationContext())+"/ydyzt/data/GD_TDYT.geodatabase";
final Geodatabase localGdb=new Geodatabase(path);
localGdb.loadAsync();
localGdb.addDoneLoadingListener(new Runnable() {
    @Override
    public void run() {
        LayerList mainLayerList = arcGISMap.getOperationalLayers();
        for (GeodatabaseFeatureTable gdbFeatureTable : localGdb.getGeodatabaseFeatureTables()) {
            FeatureLayer dataFeatureLayer = new FeatureLayer(gdbFeatureTable);
            mainLayerList.add(dataFeatureLayer);
        }
    }
});

      而要进行业务图层的管理,LayerList类在加载图层时候可以有顺序,第一位参数为序号,序号为0表示最底层,然后依次往上叠加。在移除图层时候可以通过图层进行移除,也可以通过图层的序号进行移除。







Android Arcgis入门(二)、MapView与图层介绍

一、MapView              MapView是Arcgis中的最基本的类,与高德地图SDK的MapView的重要性一样。MapView的创建有两种方法,一种是在Layout文件中直接写...
  • Gary__123456
  • Gary__123456
  • 2017年03月22日 20:57
  • 1711

(三)ArcGIS API For Javascript之调用动态地图服务

引言 调用动态地图服务 需求 1根据需求隐藏服务中的某一个图层 11代码解释 2通过属性查询地图服务中的信息 21代码实现 22代码解释 3通过空间查询地图服务中的信息 31代码实现 32代码解释 4...
  • LoveCarpenter
  • LoveCarpenter
  • 2016年09月06日 21:23
  • 15902

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

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

安卓智能地图开发与实施二十:栅格图层展示 - ArcGIS Runtime SDK for Android(Version 100.1.0)

栅格图层(RasterLayer)用以加载展示移动端本地文件、移动镶嵌数据集、影像服务。...
  • allenlu2008
  • allenlu2008
  • 2017年10月25日 22:16
  • 580

ArcGIS Runtime for Android开发教程V2.0(5)基础篇---图层

原址:http://blog.csdn.net/ArcGIS_Mobile/article/details/8151626 [html] view plaincopy ...
  • luckypeng
  • luckypeng
  • 2015年07月27日 09:42
  • 1516

安卓智能地图开发与实施十:图层管理 - ArcGIS Runtime SDK for Android(Version 100.0.0)

图层管理图层管理分为了基础底图切换和业务数据管理。基础底图主要是进行切换,而业务数据管理的功能因项目而已,基本有控制显示、图层查询、统计等。...
  • allenlu2008
  • allenlu2008
  • 2017年05月16日 15:22
  • 1908

安卓智能地图开发与实施八:离线业务图层(浏览查询) - ArcGIS Runtime SDK for Android(Version 100.0.0)

离线业务图层离线业务图层,在很大程度上减少了对网络的依附。无论是哪个行业的外业核查,都需要详细的原有信息进行支撑,而涉及地图、位置的信息核查,通过离线数据可以在本端形成对比核实能力。...
  • allenlu2008
  • allenlu2008
  • 2017年05月09日 14:01
  • 1947

SuperMap iClient3D 8C for Plugin KML图层基本操作

  • 2017年12月15日 09:05
  • 367KB
  • 下载

转 ArcGIS Runtime 加载SHAPE数据的另一种方式-动态图层 .

ArcGIS 10.1中有一个新的功能就是动态图层(NOT DynamicLayer,动态地图服务),该动态图层简单的说,就是向一个动态服务注册一个工作空间,该工作空间中含有shape,栅格等数据,这...
  • hcy_2012
  • hcy_2012
  • 2017年01月06日 18:18
  • 314

ArcGIS API for Silverlight 调用GP服务加载等值线图层

第二篇、Silverlight客户端调用GP服务          利用ArcGIS API for Silverlight实现GP服务调用,这里的雨量数据是通过一个WebService获取而来,主...
  • yangyisen0713
  • yangyisen0713
  • 2014年01月16日 15:45
  • 1382
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ArcGIS for Android Runtime100 基本操作(一)——图层加载和切换
举报原因:
原因补充:

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