歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> ArcGIS for Android離線數據編輯實現原理

ArcGIS for Android離線數據編輯實現原理

日期:2017/3/1 10:24:28   编辑:Linux編程

實現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的updateGraphic(int id, Map<String,Object> attributes)的方法來更新Graphic的屬性,並且將修改的要素屬性更新到本地sqlite數據庫中及其修改表中mark字段的狀態

2) 空間編輯

對於Graphic對象我們不僅可以改變他的屬性還可以修改它的空間位置信息,對於點、線、面的修改略有不同。

點修改時,直接更新Graphic的Geometry即可,不過Graphic沒有提供修改Geometry的接口,我們只能通過GraphicsLayer的updateGraphic(int id, Geometry geometry)方法來實現更新它的空間位置。

線和面的空間位置改變主要指的是線或面的節點的位置修改,我們可以點擊線或面上的一個節點進行拖動用GeometryEngine.getNearestVertex()可以得到我們點擊的點,距離幾何體的哪個節點最近,並返回一個Proximity2DResult對象,通過這個對象我們可以得到這個節點Index位置,再通過線或面對象的setPoint(int index, Point point)方法更新節點,這時我們的圖形就可以改變了,將更新後的Graphic的空間對象重新解析成定義的格式入庫及其修改表中mark字段的狀態

5. 數據提交

到上面的步驟,離線數據編輯功能基本完成,最後,當我們在線時,只需通過ArcGISFeatureLayer把數據提交到臨時表中進行審核即可。

Copyright © Linux教程網 All Rights Reserved