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



實現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不能添加事件監聽,所以不能像按鈕一樣,添加一個點擊事件彈出該要素的相關信息,我們可以通過GraphicsLayergetGraphicIDs(float x, float y,int tolerance)方法來獲取要素及其要素的相關屬性,可悲是Graphic中沒提供修改屬性的接口,只能新建一個Graphic對象並在他的構造方法中來添加更新後的屬性或者是通過GraphicsLayerupdateGraphic(int id,Map<String,Object> attributes)的方法來更新Graphic的屬性,並且將修改的要素屬性更新到本地sqlite數據庫中及其修改表中mark字段的狀態

2)        空間編輯

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

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

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

5.  數據提交

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





[原文地址]http://blog.csdn.net/wozaifeiyang0/article/details/7472518



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章