安卓智能地图开发与实施八:离线业务图层(浏览查询)

来源:互联网 发布:开源wiki系统 java 编辑:程序博客网 时间:2024/05/21 19:29

离线业务图层

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

离线业务图层 - 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)索要。

0 0
原创粉丝点击