dutiyanwang 2012-04-18
实现ArcGIS for Android上的离线数据编辑,具体实现环境及其步骤如下:
一、 环境准备
1. 软件环境
1) ArcGIS Server10用于发布地图服务
2) ArcGIS Destop10用于切缓存图片
3) Eclipse3.6.2+ 集成开发环境
4) JDK1.6
5) Android SDK
6) Android Development Tools
7) ArcGIS API for Android1.1插件
8) ArcSDE for Oracle11g
9) Oracle11g
2. 地图服务准备
1) 在所有软件环境都已安装好后,首先我们要通过ArcGIS Server来发布两个可编辑的地图服务,也就是发布FeatureServer的地图服务,两个服务分别用于在线时的数据下载和数据上传。(上传数据时不能直接上传到实际下载的服务上去,数据编辑后需要有一个审核的过程,所以需求另一个服务进行数据临时存储,等审核通过后才可以上传的我们发布的下载服务上去)
2) 在离线状况下我们还需要一个缓存切片地图,使用ArcCatalog来切一幅缓存图片,用于后期设备端的离线地图显示(地图切片必须是紧凑型的)。
二、 实现步骤
1. 项目创建
使用eclipse创建一个ArcGIS for Android项目,并将上面通过ArcCatalog切的缓存图片的文件夹拷入到你的设备sd卡中。
2. 添加地图服务
在项目中的Activity中添加三个地图服务,一个是用于离线地图显示ArcGISLocalTiledLayer服务,另两个是用于数据下载和上传的ArcGISFeatureLayer服务;此外还添加一个GraphicsLayer用于查询出的数据显示的图层。
3. sqlite数据库
使用sqlite数据库来储存离线数据,通过扩展SQLiteOpenHelper来实现数据库和表的创建;创建表时,表结构应该与我们发布的FeatureServer服务中用到的表结构基本一致(多添加一个mark字段用于标记操作的状态)。在此,关键在于空间shape字段的存储,在sqlite中没有空间字段的概念,因此,使用地图服务查询出来的数据在入库到sqlite中时,应该定制插入数据的格式,在入本地库时我们可以按照空间数据的类型:点、线和面来进行定制拼装,如点类型我们入库时可以拼成Point(X ,Y)这样的形式,下此取出时按照这种格式进行解析拼装空间对象就可以了,在定制完各种空间数据类型的表示形式后,最好编写一个工具类专门负责数据格式的解析和拼装(由于我要做的Demo只涉及点数据所以在数据库的表中没有shape字段,而是添加了X和Y两个字段来存储坐标信息)。
4. 数据编辑
在对数据进行编辑的时候,我们基本分两方面进行编辑:一个是属性编辑,另一个是空间编辑。
当我们通过ArcGISFeatureLayer查询的数据,并通过我们定制的数据格式插入sqlite数据后,我们这时可以进行离线的数据操作了。
1) 属性编辑
对于属性修改无非就是对Graphic对象的中的属性进行修改,Graphic不能添加事件监听,所以不能像按钮一样,添加一个点击事件弹出该要素的相关信息,我们可以通过GraphicsLayer的getGraphicIDs(float x, float y,int tolerance)
方法来获取要素及其要素的相关属性,
可悲是Graphic中没提供修改属性的接口,只能新建一个Graphic对象并在他的构造方法中来添加更新后的属性或者是通过GraphicsLayer的<strong><font face="Courier New" color="#ff9900">updateGraphic</font></strong>
<font face="Courier New">(int id, </font>
Map<font face="Courier New"><</font><font face="Courier New" color="#ff9900">String</font><font face="Courier New">,</font>
Object> attributes)
的方法来更新Graphic的属性
,并且将修改的要素属性更新到本地sqlite数据库中及其修改表中mark字段的状态<font face="Courier New">。</font>
2) 空间编辑
对于Graphic对象我们不仅可以改变他的属性还可以修改它的空间位置信息,对于点、线、面的修改略有不同。
点修改时,直接更新Graphic的Geometry即可,不过Graphic没有提供修改Geometry的接口,我们只能通过GraphicsLayer的updateGraphic<font face="Courier New">(int id, </font>
Geometry geometry)
方法来实现更新它的空间位置。
线和面的空间位置改变主要指的是线或面的节点的位置修改,我们可以点击线或面上的一个节点进行拖动用GeometryEngine.getNearestVertex()可以得到我们点击的点,距离几何体的哪个节点最近,并返回一个Proximity2DResult对象,通过这个对象我们可以得到这个节点Index位置,再通过线或面对象的setPoint<font face="Courier New">(int index, </font>
Point point)
方法更新节点,这时我们的图形就可以改变了,将更新后的Graphic的空间对象重新解析成定义的格式入库
及其修改表中mark字段的状态<font face="Courier New">。</font>
<font face="Courier New">5. </font>
数据提交
<font face="Courier New">到上面的步骤,离线数据编辑功能基本完成,最后,当我们在线时,只需通过</font>
ArcGISFeatureLayer把数据提交到临时表中进行审核即可。