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

更多相关文章

  1. 一句话锁定MySQL数据占用元凶
  2. Android(安卓)解析后台返回为Json数据的简单例子!!!
  3. 四、android百度地图之导航(环境的配置)
  4. Android中各种Adapter的介绍及使用
  5. 2020互联网寒冬下,一个 Android(安卓)程序员的面试心得,未来路在何
  6. 基于线程池和NIO技术构建高效的多协议Android通讯框架
  7. [011] 百度地图API之POI搜索-发现你身边的兴趣点,如超市、餐厅、A
  8. Android无线调试——抛开USB数据线
  9. Android(安卓)百度地图开发源码示例 ——1

随机推荐

  1. Android软件中嵌入地图之二:百度地图
  2. android 中自动更新时间机制
  3. Android利用activity启动模式退出整个应
  4. Android开发,addlistener和setlistener的
  5. Android之ExpandableListView的属性(Group
  6. 2011.07.12(3)——— android ui的一些概念
  7. Android(安卓)内存泄漏LeakCanary使用详
  8. Android进度条——ProgressDialog
  9. Android笔记2——开发前奏2工程目录介绍
  10. 关于android设备唯一区分device id的取得