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。