ArcGIS for Android Runtime100 基本操作(六)——移动地图包MMPK的使用

原创 2017年09月25日 16:05:38

      移动地图包是ArcGIS Pro里新推出的一种离线地图数据,配合ArcGIS Runtime 100使用。其特点官方给的解释如下:


      移动地图包是一个以“.mmpk”结尾的单独文件扩展,它可以将你的组织的maps、资源、道路网、或者坐标集成到一个文件。根据这些数据你的用户就可以清楚自己的方向,知道什么是他们所需要的,探索它们的附近的区域、有效的利用他们的资源去工作。地图数据包格式是面向当前手机设备的最佳格式,它小而快速,因为它是被压缩的且容易分享。相比于传统的地图包(tpk、vtpk等),它保存所有的feature要素。

       mmpk可以将各种地图和数据资源打包,其中也包括矢量切片数据,同时这种格式地图包可轻松部署到终端使用,由于数据是存储于压缩的mobile GDB中,底图上展示的内容都是要素,可供查询和分析,同时支持路径规划、地址编码等高级分析应用。移动地图包支持离线应用。移动地图包既解决了移动端符号渲染问题,又结合矢量切片底图解决了地图包过大的问题,支持离线的查询、分析等各种应用场景。


      简单总结下,特点就是桌面端渲染好的地图拿来即用无需二次渲染;支持打包矢量切片;结合适量切片解决地图包过大的问题;支持路径分析和地理编码。


      下面我就对移动地图包,也就是.mmpk格式数据进行简单的介绍如何使用。


移动地图包的打包


      对于如何创建移动地图包,可以参考官网,这里不再累述:

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


移动地图包的加载


      在Runtime 100里,对于移动地图包专门有个类MobileMapPackage进行管理,其官方解释为:




      其基本使用方法如下:


String mainMMPKPath = StorageUtil.getROMRootPath(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);
        }
    }
});

      从代码我们也可以看出从MMPK文件里,我们可以直接读取的是ArcGISMap,也就是整个地图内容。就比如在桌面端渲染好的地图,无论是多少层,都可以直接打包在MMPK文件里,而我们在移动端可以直接读取出整个地图内容,直接加载就可以。


      比如运行下我们这个代码,可以得到的效果是:




      如图所示,这个地图里包含了的一个底图层和两个业务图层,通过我们的移动地图包数据,直接一步就加载好,因为移动数据包不仅包含地图展示所需的所有图层,也包含他们图层的顺序,因此使用起来非常方便。


      如果要获取这里面的每个图层也很方便,只需要用ArcGISMap.getBaseMap()或者ArcGISMap.getOperationalLayers()即可。


移动地图包的空间查询


      对于移动地图包,它的另一个特点就是保存了所有的feature要素,因此也可以进行空间查询。以空间查询举个例子:


mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mMapView) {
    @Override
    public boolean  onSingleTapConfirmed(MotionEvent v) {
        android.graphics.Point screenPoint=new android.graphics.Point(Math.round(v.getX()), Math.round(v.getY()));
        final Point clickPoint = mMapView.screenToLocation(screenPoint);
        QueryParameters query = new QueryParameters();
        query.setGeometry(clickPoint);// 设置空间几何对象
        FeatureLayer featureLayer=(FeatureLayer) mMapView.getMap().getOperationalLayers().get(0);
        FeatureTable mTable = featureLayer.getFeatureTable();//得到查询属性表
        final ListenableFuture<FeatureQueryResult> featureQueryResult
                = mTable.queryFeaturesAsync(query);
        featureQueryResult.addDoneListener(new Runnable() {
            @Override
            public void run() {
                try {
                    FeatureQueryResult featureResul = featureQueryResult.get();
                    for (Object element : featureResul) {
                        if (element instanceof Feature) {
                            Feature mFeatureGrafic = (Feature) element;
                            Geometry geometry=mFeatureGrafic.getGeometry();
                            GraphicsOverlay graphicsOverlay_1=new GraphicsOverlay();
                            SimpleMarkerSymbol pointSymbol = new SimpleMarkerSymbol(SimpleMarkerSymbol.Style.DIAMOND, Color.RED, 10);
                            SimpleLineSymbol lineSymbol = new SimpleLineSymbol(SimpleLineSymbol.Style.DASH,Color.GREEN,10);
                            Graphic pointGraphic = new Graphic(clickPoint,pointSymbol);
                            Graphic fillGraphic = new Graphic(geometry,lineSymbol);
                            graphicsOverlay_1.getGraphics().add(pointGraphic);
                            graphicsOverlay_1.getGraphics().add(fillGraphic);
                            mMapView.getGraphicsOverlays().add(graphicsOverlay_1);
                            Map<String, Object> mQuerryString = mFeatureGrafic.getAttributes();
                            for(String key : mQuerryString.keySet()){
                                Log.i("==============="+key,String.valueOf(mQuerryString.get(key)));
                            }
                        }
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        });
        return true;
    }
});

      可以看出这个例子是点击高亮显示对应的feature的图层并日志输出它的属性信息,我们运行下看看效果:



      

      日志的截图为:




      恩,就是这么简单。


      由这两个例子,我们看出为啥说MMPK是当前手机设备最佳数据格式了。首先加载非常方便,其渲染效果和桌面端完全一致,无需在移动端里再多次调整;其次它支持切片,所以加载渲染速度快,又保留了fearture信息,支持空间属性查询,可谓是集成了TPK和geodatabase两种数据的有点;最后采用了新的压缩方式,所以数据量很小,我刚举例的两个数据也才分别不过30M和6M。


另外我将测试数据已经上传,地址是:http://download.csdn.net/download/bit_kaki/9994132。如果有问题可以直接给我留言。

版权声明:本文为博主原创文章,未经博主允许不得转载。

【技术贴】ArcGIS Runtime Esri新的离线地图数据格式——移动地图包

移动地图包优势: 桌面端渲染好的地图拿来即用无需二次渲染; 支持打包矢量切片; 结合适量切片解决地图包过大的问题; 支持路径分析和地理编码。...

移动地图包(.mmpk)测试数据

  • 2017年09月25日 13:58
  • 30.08MB
  • 下载

《ArcGIS Runtime SDK for Android开发笔记》——(2)、Android Studio基本配置与使用

1、前言  在上一篇文章《Android Studio下载与安装》里我们已经介绍了Android Studio的下载与安装步骤,这一篇我们将针对Android Studio的基本常见使用做一个简单介绍...
  • esricd
  • esricd
  • 2015年09月17日 16:19
  • 1463

《ArcGIS Runtime SDK for Android开发笔记》——(9)、空间数据的容器-地图MapView

1、前言 在上一篇内容里介绍了 关于ArcGIS Android开发的未来(“Quartz”版Beta)相关内容,期间也提到了关于API接口的重构,开发思路的调整,根据2015UC资料也可以知道新版...
  • esricd
  • esricd
  • 2015年11月30日 12:28
  • 2469

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

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

ArcGIS10地图包的使用

ArcGIS10中新增了地图包功能(Packages),可以轻松地将图层、数据、工具、模型等多种资源进行打包、分发,为用户提供了一个非常好的数据共享途径。     地图包的创建提供了多种工具,可以...
  • SYDBC
  • SYDBC
  • 2013年12月16日 14:02
  • 1506

矢量地图包——让移动端地图飞起来

众所周知,由于移动设备自身的限制,对移动端地图数据的要求一般比桌面端更高,而矢量地图包性能高、显示好、体积小、更新快、易传输等特点,恰恰满足了移动端的需求。正因如此,二者成为完美搭档,擦出了美妙的火花...

安卓智能地图开发与实施十七:使用天地图 - ArcGIS Runtime SDK for Android(Version 100.1.0)

WebTiledLayer100.1的新版本最大的亮点是三维,同时新加入了图层类型和可扩展的切片图层WebTiledLayer。继承自ServiceImageTiledLayer。BingMapsLa...

《ArcGIS Runtime SDK for Android开发笔记》——问题集:使用TextSymbol做标注显示乱码

1、前言 在14年的时候写过一篇博客关于ArcGIS for Android 10.1.1API 中文标注导致程序异常崩溃问题,但是当时并没有很好的解决这样一个问题,也并没有深入研究分析这样的一个异...
  • esricd
  • esricd
  • 2015年09月24日 20:54
  • 1974
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ArcGIS for Android Runtime100 基本操作(六)——移动地图包MMPK的使用
举报原因:
原因补充:

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