arcgis for android: Shapefile 文件 / ArcGIS for Android Runtime100 基本操作(一)——图层加载和切换

  Shapefile是一种比较原始的矢量数据存储方式,它仅仅能够存储几何体的位置数据,而无法在一个文件之中同时存储这些几何体的属性数据。因此,Shapefile还必须附带一个二维表用于存储Shapefile中每个几何体的属性信息。Shapefile中许多几何体能够代表复杂的地理事物,并为他们提供强大而精确的计算能力。

  Shapefile文件指的是一种文件存储的方法,实际上该种文件格式是由多个文件组成的。其中,要组成一个Shapefile,有三个文件是必不可少的,它们分别是".shp", ".shx"与 ".dbf"文件。表示同一数据的一组文件其文件名前缀应该相同。例如,存储一个关于湖的几何与属性数据,就必须有lake.shp,lake.shx与lake.dbf三个文件。而其中“真正”的Shapefile的后缀为shp,然而仅有这个文件数据是不完整的,必须要把其他两个附带上才能构成一组完整的地理数据。除了这三个必须的文件以外,还有八个可选的文件,使用它们可以增强空间数据的表达能力。所有的文件名都必须遵循MS DOS的8.3文件名标准(文件前缀名8个字符,后缀名3个字符,如shapefil.shp),以方便与一些老的应用程序保持兼容性,尽管现在许多新的程序都能够支持长文件名。此外,所有的文件都必须位于同一个目录之中。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
   然后整个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);
        }    }});

  • 三、图层的加载和切换
       我们获取到了图层信息以后,需要将这些信息加载在地图上。在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表示最底层,然后依次往上叠加。在移除图层时候可以通过图层进行移除,也可以通过图层的序号进行移除。
在这里插入图片描述

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值