【原文链接:https://www.cnblogs.com/gis-luq/p/5858055.html】
1、前言
在上一篇我们已经实现了离线地理数据库的下载,这一篇我们着重介绍离线数据库的加载与编辑。
由于ArcGIS Runtime SDK for Android 10.2.X版本并没提供要素绘制功能,所以本篇中的要素绘制部分基于之前开源的Drawtools3.0工具实现。
本DEMO主要实现了:离线地理数据库加载、要素样式模板加载,要素新建、要素选择并开启编辑状态、要素删除等操作。由于内容较多涉及编辑部分仅详细介绍对Geodatabase的要素添加、要素删除、要素更新部分,其余请自行查阅源代码。
转载请注明出处:http://www.cnblogs.com/gis-luq/p/5858055.html
2、离线要素编辑实现过程
2.1、加载本地离线要素
ArcGIS Runtime SDK for Android中提供了具体的Geodatabase类和FeatureLayer图层来加载.geodatabase文件,常用的类包括Geodatabase、GeodatabaseFeatureTable、GeodatabaseFeature、GeodatabaseFeatureServiceTable等,分别用来打开geodatabase数据文件、获取要素图层、获取图层中的具体要素,以及获取在线的要素服务。具体来讲,加载.geodatabase文件的步骤有如下几步:
- 实例化一个Geodatabase对象,这个类有两个构造函数,都需要指定本地数据库的存储路径;
- 创建一个GeodatabaseFeatureTable对象实例,用来获取需要的图层;
- 创建一个FeatureLayer来存储获取的图层,并将获取的图层加载到地图中;
- 调用dispose()方式释放资源。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19/** * 读取Geodatabase中离线地图信息
* @param geodatabsePath 离线Geodatabase文件路径 */
private void addFeatureLayer(String geodatabsePath) {
Geodatabase localGdb = null;
try {
localGdb = new Geodatabase(geodatabsePath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
layerList = new ArrayList<>(); // 添加FeatureLayer到MapView中
if (localGdb != null) {
for (GeodatabaseFeatureTable gdbFeatureTable : localGdb.getGeodatabaseTables()) {
if (gdbFeatureTable.hasGeometry()){
FeatureLayer layer = new FeatureLayer(gdbFeatureTable);
mMapView.addLayer(layer);
}
}
}
}
2.2、加载本地要素样式模板
绘制要素时往往会需要知道待绘制要素的图层名称以及要素的符号化样式,这里我们以geodatabse中的FeatureLayer为例演示要素样式模板获取流程。
1 | /** * 添加要素绘制样式模板 |
2.2 编辑本地离线要素
要素编辑最核心的是FeatureTable中的增删改方法,通过这些方法可以实现本地数据库中要素编辑操作。
FeatureTable中的常用方法如下:
- addFeature):增加本地要素
- addFeatures):一次添加多个要素到离线数据库中
- deleteFeature):删除本地要素
- deleteFeatures):删除多个本地要素
- queryFeatures):查询本地要素
- updateFeature):更新要素到本地
- updateFeatures):更新多个要素到本地
2.2.1 要素添加
1 | private FeatureLayer selectFeatureLayer;//当前选中图层 |
2.2.2 要素删除
1 | private FeatureLayer selectFeatureLayer;//当前选中图层 |
2.2.3 要素矢量信息更新
1 | private FeatureLayer selectFeatureLayer;//当前选中图层 private Feature selectFeature = null;//当前选中要素 |
扩展说明:如何选中要素,以及如何处理具有压盖关系的要素选择问题?
针对这两个问题我们一并处理,首先扩展MapOnTouchListener类,实现长按出现放大镜,并选中要素。选中要素时我们采用遍历当前所有图层的方式,找出每个图层中第一个被选中的要素,然后弹窗提示供用户选择。
1 | //全局定义信息 |
要素选中扩展事件。
1 | /** * 地图窗口默认Touch事件 |
3、完整代码
完整代码不定期更新,具体请查阅DEMOt源代码,托管地址:http://git.oschina.net/gis-luq/RuntimeOfflineEdit
4、运行后编辑结果(以备同步测试使用)
转载请注明出处:http://www.cnblogs.com/gis-luq/p/5858055.html
文章若无特殊说明均为原创,原创作品,允许转载,转载时请务必以超链接形式标明文章出处、作者信息和本声明。
博客:http://www.cnblogs.com/gis-luq 作者:gis-luq 邮箱:luqiang.gis@foxmail.com