ArcGIS for Android 100.3.0(14):移动地图包MMPK的使用

MobileMapPackage

移动地图包是ArcGIS Pro里新推出的一种离线地图数据,配合ArcGIS Runtime 100使用。

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

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

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

移动地图包的加载

   mMapView = (MapView) findViewById(R.id.mapview);

        final String mmpkPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/SanFrancisco.mmpk";
        final MobileMapPackage mobileMapPackage = new MobileMapPackage(mmpkPath);
        mobileMapPackage.loadAsync();
        mobileMapPackage.addDoneLoadingListener(new Runnable() {
            @Override
            public void run() {
                if (mobileMapPackage.getLoadStatus() == LoadStatus.LOADED) {
                    List<ArcGISMap> maps = mobileMapPackage.getMaps();
                    ArcGISMap arcGISMap = maps.get(0); //地图里包含了的一个底图层和两个业务图层
                    mMapView.setMap(arcGISMap);

                    Basemap basemap = arcGISMap.getBasemap();
                    LayerList operationalLayers = arcGISMap.getOperationalLayers();
                }
            }
        });

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

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

移动地图包的空间查询

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

  //查询
        mMapView.setOnTouchListener(new DefaultMapViewOnTouchListener(this, mMapView) {
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {

                final Point mapPoint = mMapView.screenToLocation(new android.graphics.Point(Math.round(e.getX()), Math.round(e.getY())));
                QueryParameters parameters = new QueryParameters();
                parameters.setGeometry(mapPoint);
                FeatureLayer featureLayer = (FeatureLayer) mMapView.getMap().getOperationalLayers().get(0);
                FeatureTable featureTable = featureLayer.getFeatureTable();
                final ListenableFuture<FeatureQueryResult> future = featureTable.queryFeaturesAsync(parameters);
                future.addDoneListener(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            FeatureQueryResult featureQueryResult = future.get();
                            for (Feature feature : featureQueryResult) {
                                if (feature instanceof Feature) {
                                    Feature mFeatureGrafic = (Feature) feature;

                                    Geometry geometry = mFeatureGrafic.getGeometry();
                                    GraphicsOverlay graphicsOverlay = 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(mapPoint, pointSymbol);
                                    Graphic fillGraphic = new Graphic(geometry, lineSymbol);
                                    graphicsOverlay.getGraphics().add(pointGraphic);
                                    graphicsOverlay.getGraphics().add(fillGraphic);
                                    mMapView.getGraphicsOverlays().add(graphicsOverlay);

                                    Map<String, Object> mQuerryString = mFeatureGrafic.getAttributes();
                                    for (String key : mQuerryString.keySet()) {
                                        Log.e("xyh" + key, String.valueOf(mQuerryString.get(key)));
                                    }
                                }
                            }
                        } catch (InterruptedException e1) {
                            e1.printStackTrace();
                        } catch (ExecutionException e1) {
                            e1.printStackTrace();
                        }
                    }
                });
                return true;
            }
        });
    }

由这两个例子,我们看出为啥说MMPK是当前手机设备最佳数据格式了。

首先加载非常方便,其渲染效果和桌面端完全一致,无需在移动端里再多次调整;

其次它支持切片,所以加载渲染速度快,又保留了fearture信息,支持空间属性查询,可谓是集成了TPK和geodatabase两种数据的有点;

最后采用了新的压缩方式,所以数据量很小,我刚举例的两个数据也才分别不过30M和6M。

猜你喜欢

转载自blog.csdn.net/qq_36699930/article/details/82584901