1. 程式人生 > >Arcgis For Android之離線地圖實現的幾種方式

Arcgis For Android之離線地圖實現的幾種方式

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來實現資料庫和表的建立;建立表時,表結構應該與我們釋出的Feature Server服務中用到的表結構基本一致(多新增一個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的update  Graphic(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把資料提交到臨時表中進行稽核即可。