离线业务图层
离线业务图层,在很大程度上减少了对网络的依附。无论是哪个行业的外业核查,都需要详细的原有信息进行支撑,而涉及地图、位置的信息核查,通过离线数据可以在本端形成对比核实能力。
离线业务图层 - Geodatabase文件(FeatureLayer)
离线FeatureLayer(Geodatabase文件)通过GeodatabaseFeatureTable来解析Geodatabase文件。添加FeatureLayer,理论上或者说代码层面是可以不需要基础底图(Basemap),展示的结果就只是业务图层。但是ArcGISMap对象是需要新建出来的。
package hymn.esrichina.displayamapusinggeodatabase;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.esri.arcgisruntime.data.Geodatabase;
import com.esri.arcgisruntime.data.GeodatabaseFeatureTable;
import com.esri.arcgisruntime.data.TileCache;
import com.esri.arcgisruntime.layers.ArcGISTiledLayer;
import com.esri.arcgisruntime.layers.FeatureLayer;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.Basemap;
import com.esri.arcgisruntime.mapping.LayerList;
import com.esri.arcgisruntime.mapping.view.MapView;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private MapView mainMapView;
private ArcGISMap mainArcGISMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
String mainGeodatabaseFilePath =
"/sdcard/Hymn/operation_read/ZhuanTi.geodatabase";
mainMapView = (MapView) findViewById(R.id.mainMapView);
TileCache vTileCache = new TileCache("/sdcard/Hymn/basemap/ImageBasemap.tpk");
ArcGISTiledLayer mainArcGISTiledLayer = new ArcGISTiledLayer(vTileCache);
Basemap mainBasemap = new Basemap(mainArcGISTiledLayer);
mainArcGISMap = new ArcGISMap(mainBasemap);
mainMapView.setMap(mainArcGISMap);
final Geodatabase mainGeodatabase = new Geodatabase(mainGeodatabaseFilePath);
mainGeodatabase.loadAsync();
mainGeodatabase.addDoneLoadingListener(new Runnable() {
@Override
public void run() {
List<GeodatabaseFeatureTable> resultsGFT = mainGeodatabase.getGeodatabaseFeatureTables();
int valueCount = resultsGFT.size();
for (int i = valueCount - 1; i > -1; i--) {
FeatureLayer valueFL = new FeatureLayer(resultsGFT.get(i));
valueFL.setVisible(true);
LayerList mainLayerList = mainArcGISMap.getOperationalLayers();
mainLayerList.add(valueFL);
}
}
});
} catch (Exception e) {
}
}
}
Geodatabase 文件有两种生产方式,针对移动端查询浏览类的这里先只描述通过ArcGIS
Desktop生产。准备好需要作为基础底图的Mxd文档,与基础底图不同的是,图层不能包含子图层。当然只有一个图层也是可以的。
Geodatabase 文件生产
1、在ArcMap中,开启ArcGIS Runtime工具
2、分享Mxd文档中的图层为.geodatabase文件
(为了能够查询,可使用默认参数)
4、修改“ArcGIS Runtime Content”存储的位置。
5、点击“分析(Analyze)”,无错误后,点击“分享(Share)”。
6、等待完成,到相应的文件夹找到.geodatabase文件。
7、文件名称可以随意修改,建议用英文字母。
8、放入安卓手机中。
注:也可以调用工具(Create Runtime Content)生产。
创建运行时内容工具使用参考:
离线业务图层 - MMPK文件(FeatureLayer)
MMPK不仅可是生产基础底图(Basemap)还可以生产业务图层(OperationalLayers),当然两者不能同时包含在一个MMPK文件中。
与Geodatabase文件相比,MobileMapPackage(MMPK)文件的优势在于对要素量较大的数据来说加载效果和效率好。从各自内部包含的图层来看,MMPK明显做过了调优,考虑了图层索引顺序问题,也就是说MMPK中的业务图层的图层索引编号是倒置过的。而Geodatabase文件中获取的图层,往ArcGISMap中添加时,为了保证和生产该文件的图层顺序相同,需要从末位倒序加入。
小图片展示的是2015年7月西安周边的大气气溶胶分布情况,越红越污染大,明显可以看出靠近秦岭环境好,而且从红色蔓延的趋势来看,污染是从东北方向来的。
package hymn.esrichina.displayamapusinggeodatabasemmpk;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import com.esri.arcgisruntime.layers.ArcGISTiledLayer;
import com.esri.arcgisruntime.layers.FeatureLayer;
import com.esri.arcgisruntime.loadable.LoadStatus;
import com.esri.arcgisruntime.mapping.ArcGISMap;
import com.esri.arcgisruntime.mapping.Basemap;
import com.esri.arcgisruntime.mapping.LayerList;
import com.esri.arcgisruntime.mapping.MobileMapPackage;
import com.esri.arcgisruntime.mapping.view.MapView;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private MapView mainMapView;
private Basemap mainBasemap;
private ArcGISMap mainArcGISMap;
private LayerList mainLayerList;
private MobileMapPackage mainMobileMapPackage;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
mainMapView = (MapView) findViewById(R.id.mainMapView);
mainBasemap = new Basemap(new ArcGISTiledLayer(
"http://map.geoq.cn/arcgis/rest/services/ChinaOnlineCommunity/MapServer"));
mainArcGISMap = new ArcGISMap(mainBasemap);
mainMapView.setMap(mainArcGISMap);
String mainMMPKPath = "/sdcard/Hymn/operation_read/气溶胶.mmpk";
mainMobileMapPackage =
new MobileMapPackage(mainMMPKPath);
mainMobileMapPackage.loadAsync();
mainMobileMapPackage.addDoneLoadingListener(new Runnable() {
@Override
public void run() {
LoadStatus mainLoadStatus = mainMobileMapPackage.getLoadStatus();
if (mainLoadStatus == LoadStatus.LOADED) {
List<ArcGISMap> mainArcGISMapL = mainMobileMapPackage.getMaps();
ArcGISMap mainArcGISMapMMPK = mainArcGISMapL.get(0);
Basemap mainBasemapMMPK = mainArcGISMapMMPK.getBasemap();
LayerList mainMMPKLL = mainArcGISMapMMPK.getOperationalLayers();
mainLayerList = mainArcGISMap.getOperationalLayers();
FeatureLayer mainFeatureLayer = (FeatureLayer) mainMMPKLL.get(0);
mainFeatureLayer.setOpacity(0.8f);
mainArcGISMapMMPK.getOperationalLayers().remove(0);
mainLayerList.add(mainFeatureLayer);
}
}
});
} catch (Exception e) {
String eStr = e.toString();
}
}
}
MMPK文件加载(loadAsync)完成后,得到的是ArcGISMap对象,要将其中的业务图层(FeatureLayer)加载到其他ArcGISMap 当中,需要从原ArcGISMap对象中移除:
mainArcGISMapMMPK.getOperationalLayers().remove(0);
如何生产MMPK,可以参考:
http://pro.arcgis.com/zh-cn/pro-app/tool-reference/data-management/create-mobile-map-package.htm
结尾
源程序包含:
DisplayAMapUsingGeodatabase
DisplayAMapUsinggeodatabaseMMPK
请自行下载:
链接:http://pan.baidu.com/s/1c2emBjM 密码:dtm9
若失效,可发邮件给韩源萌(polyline@126.com)索要。