ArcGIS Runtime SDK for Android 支持多種類型空間數據源、每一種都提供了相應的圖層來直接加載,圖層Layer是空間數據的載體,其主要繼承關係及類型說明以下圖所示:html
轉載請註明出處:http://www.cnblogs.com/gis-luq/p/5062715.htmlweb
Layer是全部圖層的基類,聲明瞭空間參考、最大範圍、初始範圍、單位和圖層委託等基本屬性,還有圖層加載的相關方法。數據庫
同時對於MapView的空間參考,最大範圍,初始範圍若不特殊指定,即爲第一個加入MapView的圖層相關信息所決定。這也是初學ArcGIS Android開發特別須要注意的地方,其後加入的全部圖層也須與第一個一致,不然會致使加載不成功。緩存
圖層大致能夠分紅三大類:在線圖層、離線圖層、交互圖層。服務器
在線主要包括靜態圖層(TiledLayer)和動態圖層(DynamicLayer)兩大類。網絡
此外繼承交互圖層GraphicLayer的ArcGISFeatureLayer也是在線圖層的一種,用於在線要素編輯。異步
靜態圖層泛指緩存過的地圖服務,除非服務端刪除或更新緩存,不然客戶端請求的數據永遠是固定不變的,而動態圖層正好相反,服務器根據每一個請求動態的生成數據,一靜一動各有用途。這兩種圖層都是由ArcGIS for Server提供。函數
離線圖層主要包括:柵格圖層、離線矢量圖層兩大類。工具
柵格圖層主要包括:ArcGISLocalTiledLayer(用於加載緊湊型切片、TPK),RasterLayer(用於加載 ASRP/USRP、CIB1,5,十、DTED0, 1, 二、GeoPackage、GeoTIFF、HFA、HRE、IMG、JPEG、JPEG2000、NITF、PNG、RPF、SRTM1, 2格式的影像數據)post
離線矢量圖層主要包括:FeatureLayer(用於加載shapeFile、Runtime Content<.geodatabase>格式的矢量數據)
特殊說明:這裏須要注意FeatureLayer和ArcGISFeatureLayer的區別,FeatureLayer繼承於Layer用於離線矢量數據的加載,ArcGISFeatureLayer繼承於GraphicLayer,用於加載ArcGIS for Server 發佈的FeatureService服務,作在線編輯使用。
交互圖層即負責和用戶打交道的圖層,好比繪製點、線、面;畫一個矩形,圓,這些都是須要先存儲在零時圖層。用於響應用戶的繪製操做。在ArcGIS Runtime SDK中交互圖層主要經過GraphicLayer實現。
常見空間數據類型主要有:在線底圖服務;離線底圖的tpk和緩存切片、影像數據;離線矢量的.geodatabase,shapFile文件。
ArcGIS在線的數據源有不少種,包括地圖服務、要素服務、影像服務等,同時,ArcGIS Runtime SDK for Android中也提供了各類相應的圖層來加載在線數據,具體以下:
ArcGISTiledMapServiceLayer圖層對應ArcGIS for Server服務中的切片服務,因爲切片都是事先作好的,ArcGISTiledMapServiceLayer不能對圖層中的數據進行更改,除非更新服務緩存,在ArcGIS Runtime SDK for Android中,也不容許對此類型的數據進行查詢,一般用作底圖使用。同時,由於加載的是緩存切片,這個類型的圖層是ArcGIS Runtime SDK for Android中相應請求最快的圖層之一,它採用多個線程,一般是使用單獨線程來處理請求和繪製圖片,而且異步處理。用法以下:
map = (MapView)findViewById(R.id.map); // Add tiled layer to MapView ArcGISTiledMapServiceLayer tileLayer = new ArcGISTiledMapServiceLayer("http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer"); map.addLayer(tileLayer);
ArcGISDynamicMapServiceLayer圖層對應ArcGIS for Server服務中的動態服務,動態地圖服務的地圖數據是按照移動設備範圍讀取的。 ArcGISDynamicMapServiceLayer圖層一般包含多個圖層,這些圖層由server根據請求來渲染並以raster image形式返回,而且返回的raster並不包含feature的額外信息。它的功能特色是更新很是方便,並能及時呈現給用戶,同時,圖層的可視性和空間參考能夠改變,能夠給圖層添加單獨的layer definition,ArcGIS for Server爲每一個image動態投影,而地圖的空間參考是由第一個加載的圖層決定。
它的性能特色是,它的渲染時間取決於請求數據的數量和複雜度,所以通常都比tiled map server要慢,所以,它適合數據常常發生改變、或者須要針對不一樣的用戶呈現不一樣的數據,且要素信息(如attributes,geometry,symbol等)不須要的狀況。
它的用法與ArcGISTiledMapServiceLayer圖層相同,示例代碼以下:
map = (MapView)findViewById(R.id.map); // Add DynamicMapServiceLayer to MapView ArcGISDynamicMapServiceLayer agsDynlyr = new ArcGISDynamicMapServiceLayer("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Population_World/MapServer"); map.addLayer(agsDynlyr);
ArcGISImageServiceLayer圖層對應ArcGIS for Server服務中的影像服務,它爲移動端使用影像數據提供了一種途徑,經過這種方式調用的影像數據一般能夠用來做爲底圖。調用影像服務也很是簡單,同調用上述服務同樣,示例代碼以下:
map = (MapView)findViewById(R.id.map); map.addLayer(new ArcGISImageServiceLayer("http://myserver/arcgis/rest/services/MyImage/ImageServer",null));
ArcGISFeatureLayer圖層對應ArcGIS for Server服務中的Feature Service,該圖層能夠是空間圖層,也能夠是非空間的表,該圖層包含了要素最豐富的信息,其中的每一個要素都能被空間查詢和SQL查詢。從Feature Service中請求要素時以JSON格式返回,每一個要素都單獨渲染,所以與其它圖層類型相比,要素圖層具備最豐富的功能。
只有Feature Service(要素服務)才能夠具有在線數據編輯功能,所以,若是想要對某個數據進行在線編輯或同步,須要將其發佈成Feature Service,並在移動端新建一個ArcGISFeatureLayer圖層以加載該服務。該圖層有一些設定,這些設定能影響圖層的性能,包括請求時間,返回大小、處理和響應時間等(設置須要在圖層initialized完成以後進行)。
Out fields:能夠經過outFields()方法來限制返回的屬性字段的數量,能夠減小網絡傳輸和響應處理的時間;
Max Allowable offset:使用Max Allowable offset()方法能夠限制要素返回的頂點數量,以地圖單位設置的數值將用來在server返回要素以前簡化要素的頂點,當你正在編輯要素時不該該使用此方法,可能會致使頂點丟失和TOPO關係的破壞。
ArcGISFeatureLayer在調用時能夠設置3種模式(mode),不一樣模式返回數據的方式和執行的效率不一樣:
Snapshot mode:快照模式能從Server上快速取回要素,能減小響應時間,但若是圖層包含大量、複雜的要素時,可能會致使設備中止響應,由於有大量的要素須要繪製,也會致使ArcGIS for Server達到它返回要素數量的上線。ArcGIS Server 9.3.1的默認限制是500,10.0是1000,固然,這個數據能夠在server端進行配置。建議小數據量的dataset才使用snapshot mode。
On demand mode:On demand mode須要在客戶端和服務器之間傳遞更多的請求,適合展現變化的數據,該mode適合包含複雜要素的大數據量的dataset,由於它只請求和返回須要的要素,不過,爲圖層設置比例尺限制仍然是有必要的。
Selection mode:該模式下,一開始並不向服務器請求任何要素,只有當選擇集出現時,要素才被加載,這種mode適合於不須要將全部要素展現在客戶端,而只是強調一些特殊的要素,如,有一個road圖層,使用了feature layer不支持的自定義的符號,可是又須要對該圖層進行web edit,此時,你可使用一個dynamic map service layer和一個feature layer in selection mode,將須要編輯的road選擇出來,以簡單的符號繪製並存儲在feature layer以實現編輯,當編輯完成後,清除選擇並刷新dynamic map service來查看更新。
ArcGISFeatureLayer圖層繼承自GraphicsLayer,所以也具備該圖層的全部操做。調用該圖層的示例代碼以下:
String url = "https://servicesbeta.esri.com/ArcGIS/rest/services/SanJuan/TrailConditions/FeatureServer/0"; map = (MapView)findViewById(R.id.map); //按照快照方式加載該圖層 map.addLayer(new ArcGISFeatureLayer(url,MODE.ONDEMAND)); setContentView (map);
緊湊型切片是在ArcGIS 10中出現的一種新的切片緩存文件格式,與以前的鬆散型切片存儲相比,它具備遷移方便、建立更快、節省存儲空間等諸多優勢。緊湊型存儲主要有兩種文件:bundle和bundlx,前者用於存儲切片數據,後者是切片數據的索引文件,一個bundle文件中最多可存儲128*128個切片。
tpk是ArcGIS 10.1中推出的一種新的數據切片緩存文件類型,主要是用於將緊湊型切片文件打包造成離線地圖包,這樣作的好處是能夠進一步減小緩存切片文件的數目,節省存儲空間,並更加方便的遷移(遷移緊湊型切片時可能一個市就成千上萬個細小的文件,而一個市的tpk包可能只有一個文件)。
tpk和緊湊型切片均可以在ArcGIS Runtime SDK for Android中做爲離線底圖被加載。具體的tpk和緊湊型切片的製做請參見博文http://blog.csdn.net/arcgis_mobile/article/details/8048549, http://www.cnblogs.com/gis-luq/p/4950157.html
ArcGISLocalTiledLayer是ArcGIS Runtime SDK for Android中專門用來添加離線數據包(底圖)的圖層,該圖層目前支持兩種格式的離線數據:一個是緊湊型切片,另外一個就是tpk。使用起來也很簡單,實例化該類的一個對象,並在構造函數中輸入數據的路徑便可,代碼示例以下:
map = (MapView)findViewById(R.id.map); // Add Local tiled layer to MapView ArcGISLocalTiledLayer agsLocaltiledlyr = new ArcGISLocalTiledLayer("file:///mnt/sdcard/ArcGIS/sample/HelloWorld/Layers"); map.addLayer(agsLocaltiledlyr);
ArcGIS Runtime SDK for Android 從10.2.4開始支持直接讀取本地影像數據,數據類型包含:ASRP/USRP、CIB1,5,十、DTED0, 1, 二、GeoPackage、GeoTIFF、HFA、HRE、IMG、JPEG、JPEG2000、NITF、PNG、RPF、SRTM1, 2
FileRasterSource是加載本地影像數據文件類,地圖視圖中以RasterLayer做爲圖層對象展現出來。代碼以下:
String rasterPath = Environment.getExternalStorageDirectory().getPath() + "/raster/test.tif"; FileRasterSource rasterSource; try { rasterSource = new FileRasterSource(rasterPath); } catch (IllegalArgumentException ie) { Log.d(TAG, "null or empty path"); } catch (FileNotFoundException fe) { Log.d(TAG, "raster file doesn't exist"); } catch (RuntimeException re) { Log.d(TAG, "raster file can't be opened"); } RasterLayer rasterLayer = new RasterLayer(rasterSource); mMapView.addLayer(rasterLayer);
.geodatabase文件是ArcGIS 10.2中專爲業務數據的離線而推出的一種數據格式,本質上,它仍然是SQLite數據庫的封裝,在SQLite數據模型的基礎上,Esri計劃逐步實現桌面端Geodatabase數據模型的存儲,不只包括Feature Class,還包括鑲嵌數據集、網絡數據集等。目前,主要實現了Feature Class的存儲。
即,在ArcGIS 10.2.2中,要使用徹底的離線功能,可使用ArcGIS for Desktop提供的GP工具來將須要編輯和離線的業務數據導出到.geodatabase中,也能夠直接從ArcGIS for Server上的要素服務中下載數據,並在移動端存儲爲.geodatabase,從而實現徹底離線的移動應用。具體的.geodatabase文件的製做方法請參見http://blog.csdn.net/arcgis_all/article/details/19110351。
ArcGIS Runtime SDK for Android中也提供了具體的Geodatabase類和FeatureLayer圖層來加載.geodatabase文件,經常使用的類包括Geodatabase、GeodatabaseFeatureTable、GeodatabaseFeature、GeodatabaseFeatureServiceTable等,分別用來打開geodatabase數據文件、獲取要素圖層、獲取圖層中的具體要素,以及獲取在線的要素服務。具體來說,加載.geodatabase文件的步驟有以下幾步:
一、 實例化一個Geodatabase對象,這個類有兩個構造函數,都須要指定本地數據庫的存儲路徑;
二、 建立一個GeodatabaseFeatureTable對象實例,用來獲取須要的圖層;
三、 建立一個FeatureLayer來存儲獲取的圖層,並將獲取的圖層加載到地圖中;
四、 調用dispose()方式釋放資源。
示例代碼以下:
//實例化geodatabase對象,並指定文件目錄 gdb = new Geodatabase("{/path/to/geodatabase}"); //實例化gdbfeaturetable對象,並獲取第一個圖層 gdbfeaturetable = gdb.getGeodatabaseFeatureTableByLayerId(0); // 建立一個FeatureLayer來存儲獲取的圖層,並將獲取的圖層加載到地圖中 featurelayer = new FeatureLayer(gdbfeaturetable); mMapView.removeAll(); mMapView.addLayer(featurelayer); // 調用dispose()方式釋放資源 gdb.dispose();
ShapeFile文件:ArcGIS平臺中最多見的數據格式,包含屬性信息、投影信息等。新版本的SDK(10.2.4開始)能夠直接加載.shp文件進行數據的展現、查詢。代碼加載以下:
ShapefileFeatureTable shpTable = new ShapefileFeatureTable(shpUrl); FeatureLayer fl = new FeatureLayer(shpTable); fl.setRenderer(new SimpleRenderer(new SimpleMarkerSymbol( Color.BLACK, 2, STYLE.CIRCLE))); mapView.addLayer(fl);
文章若無特殊說明均爲原創,原創做品,容許轉載,轉載時請務必以超連接形式標明文章出處、做者信息和本聲明。 博客:http://www.cnblogs.com/gis-luq 做者:gis-luq 郵箱:luqiang.gis@foxmail.com