1. 程式人生 > >ArcGIS for Android 100.3.0(14):移動地圖包MMPK的使用

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。