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

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

离线业务图层

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

离线业务图层 - Geodatabase文件(FeatureLayer)

这里写图片描述

离线FeatureLayer(Geodatabase文件)通过GeodatabaseFeatureTable来解析Geodatabase文件。添加FeatureLayer,理论上或者说代码层面是可以不需要基础底图(Basemap),展示的结果就只是业务图层。但是ArcGISMap对象是需要新建出来的。

这里写图片描述

package hymn.esrichina.displayamapusinggeodatabase;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.esri.arcgisruntime.data.Geodatabase;
import com.esri.arcgisruntime.data.GeodatabaseFeatureTable;
import com.esri.arcgisruntime.data.TileCache;
import com.esri.arcgisruntime.layers.ArcGISTiledLayer;
import com.esri.arcgisruntime.layers.FeatureLayer;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.Basemap;
import com.esri.arcgisruntime.mapping.LayerList;
import com.esri.arcgisruntime.mapping.view.MapView;

import java.util.List;

public class MainActivity extends AppCompatActivity {
    private MapView mainMapView;
    private ArcGISMap mainArcGISMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            String mainGeodatabaseFilePath =
                    "/sdcard/Hymn/operation_read/ZhuanTi.geodatabase";
            mainMapView = (MapView) findViewById(R.id.mainMapView);
            TileCache vTileCache = new TileCache("/sdcard/Hymn/basemap/ImageBasemap.tpk");
            ArcGISTiledLayer mainArcGISTiledLayer = new ArcGISTiledLayer(vTileCache);
            Basemap mainBasemap = new Basemap(mainArcGISTiledLayer);
            mainArcGISMap = new ArcGISMap(mainBasemap);
            mainMapView.setMap(mainArcGISMap);
            final Geodatabase mainGeodatabase = new Geodatabase(mainGeodatabaseFilePath);
            mainGeodatabase.loadAsync();
            mainGeodatabase.addDoneLoadingListener(new Runnable() {
                @Override
                public void run() {
                    List<GeodatabaseFeatureTable> resultsGFT = mainGeodatabase.getGeodatabaseFeatureTables();
                    int valueCount = resultsGFT.size();
                    for (int i = valueCount - 1; i > -1; i--) {
                        FeatureLayer valueFL = new FeatureLayer(resultsGFT.get(i));
                        valueFL.setVisible(true);
                        LayerList mainLayerList = mainArcGISMap.getOperationalLayers();
                        mainLayerList.add(valueFL);
                    }
                }
            });
        } catch (Exception e) {

        }
    }
}

Geodatabase 文件有两种生产方式,针对移动端查询浏览类的这里先只描述通过ArcGIS
Desktop生产。准备好需要作为基础底图的Mxd文档,与基础底图不同的是,图层不能包含子图层。当然只有一个图层也是可以的。

Geodatabase 文件生产

1、在ArcMap中,开启ArcGIS Runtime工具

这里写图片描述

2、分享Mxd文档中的图层为.geodatabase文件
(为了能够查询,可使用默认参数)

这里写图片描述

4、修改“ArcGIS Runtime Content”存储的位置。
5、点击“分析(Analyze)”,无错误后,点击“分享(Share)”。
6、等待完成,到相应的文件夹找到.geodatabase文件。

这里写图片描述

7、文件名称可以随意修改,建议用英文字母。
8、放入安卓手机中。

这里写图片描述

注:也可以调用工具(Create Runtime Content)生产。

这里写图片描述

创建运行时内容工具使用参考:

http://desktop.arcgis.com/zh-cn/arcmap/latest/tools/data-management-toolbox/create-runtime-content.htm

离线业务图层 - MMPK文件(FeatureLayer)

这里写图片描述

MMPK不仅可是生产基础底图(Basemap)还可以生产业务图层(OperationalLayers),当然两者不能同时包含在一个MMPK文件中。

与Geodatabase文件相比,MobileMapPackage(MMPK)文件的优势在于对要素量较大的数据来说加载效果和效率好。从各自内部包含的图层来看,MMPK明显做过了调优,考虑了图层索引顺序问题,也就是说MMPK中的业务图层的图层索引编号是倒置过的。而Geodatabase文件中获取的图层,往ArcGISMap中添加时,为了保证和生产该文件的图层顺序相同,需要从末位倒序加入。

这里写图片描述

小图片展示的是2015年7月西安周边的大气气溶胶分布情况,越红越污染大,明显可以看出靠近秦岭环境好,而且从红色蔓延的趋势来看,污染是从东北方向来的。

package hymn.esrichina.displayamapusinggeodatabasemmpk;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;

import com.esri.arcgisruntime.layers.ArcGISTiledLayer;
import com.esri.arcgisruntime.layers.FeatureLayer;
import com.esri.arcgisruntime.loadable.LoadStatus;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.Basemap;
import com.esri.arcgisruntime.mapping.LayerList;
import com.esri.arcgisruntime.mapping.MobileMapPackage;
import com.esri.arcgisruntime.mapping.view.MapView;

import java.util.List;

public class MainActivity extends AppCompatActivity {
    private MapView mainMapView;
    private Basemap mainBasemap;
    private ArcGISMap mainArcGISMap;
    private LayerList mainLayerList;
    private MobileMapPackage mainMobileMapPackage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            mainMapView = (MapView) findViewById(R.id.mainMapView);
            mainBasemap = new Basemap(new ArcGISTiledLayer(
                    "http://map.geoq.cn/arcgis/rest/services/ChinaOnlineCommunity/MapServer"));
            mainArcGISMap = new ArcGISMap(mainBasemap);
            mainMapView.setMap(mainArcGISMap);
            String mainMMPKPath = "/sdcard/Hymn/operation_read/气溶胶.mmpk";
            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);
                        Basemap mainBasemapMMPK = mainArcGISMapMMPK.getBasemap();
                        LayerList mainMMPKLL = mainArcGISMapMMPK.getOperationalLayers();
                        mainLayerList = mainArcGISMap.getOperationalLayers();
                        FeatureLayer mainFeatureLayer = (FeatureLayer) mainMMPKLL.get(0);
                        mainFeatureLayer.setOpacity(0.8f);
                        mainArcGISMapMMPK.getOperationalLayers().remove(0);
                        mainLayerList.add(mainFeatureLayer);
                    }
                }
            });
        } catch (Exception e) {
            String eStr = e.toString();
        }
    }
}

MMPK文件加载(loadAsync)完成后,得到的是ArcGISMap对象,要将其中的业务图层(FeatureLayer)加载到其他ArcGISMap 当中,需要从原ArcGISMap对象中移除:
mainArcGISMapMMPK.getOperationalLayers().remove(0);

如何生产MMPK,可以参考:

http://pro.arcgis.com/zh-cn/pro-app/tool-reference/data-management/create-mobile-map-package.htm

结尾

源程序包含:

DisplayAMapUsingGeodatabase
DisplayAMapUsinggeodatabaseMMPK
请自行下载:
链接:http://pan.baidu.com/s/1c2emBjM 密码:dtm9
若失效,可发邮件给韩源萌(polyline@126.com)索要。

展开阅读全文

没有更多推荐了,返回首页