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

      移动地图包是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。如果有问题可以直接给我留言。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值