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。