ArcGIS Runtime SDK For Android 10.2.x版本支持的空間數據類型

轉自:http://www.cnblogs.com/gis-luq/p/4941737.html

        http://www.cnblogs.com/gis-luq/p/5062715.html  

原作者相關信息如下
博客:http://www.cnblogs.com/gis-luq​ 作者:gis-luq 郵箱:[email protected]

ArcGIS Runtime SDK支持的空間數據類型

ArcGIS Runtime SDK for Android支持的空間數據源有多種,主要分爲3大類:ArcGIS在線數據源、ArcGIS離線數據源(自10.2版本起),以及第三方數據源,詳細的類別支持請見下表:

數據源類型

數據源名稱

ArcGIS在線數據源(ArcGIS Online/Portal for ArcGIS)

切片地圖服務(ArcGISTiledMapServiceLayer)

動態地圖服務(ArcGISDynamicMapServiceLayer)

影像服務(ArcGISImageServiceLayer)

要素服務(ArcGISFeatureLayer)

ArcGIS離線數據源

緊湊型切片(ArcGISLocalTiledLayer)

tpk切片包(ArcGISLocalTiledLayer)

.geodatabase數據文件(GeodatabaseFeature)

.shp文件(ShapefileFeatureTable)

地名地址庫(Locator)

網絡數據集(Network Dataset)

第三方數據源

Bing地圖(BingMapsLayer)

Open Street map(OpenStreetMapLayer)

OGC圖層(KMLLayer、WMSLayer)

第三方自定義擴展圖層

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


圖層Layer是空間數據的載體,其主要繼承關係及類型說明如下圖所示:


1、圖層分類解析

Layer是所有圖層的基類,聲明瞭空間參考、最大範圍、初始範圍、單位和圖層委託等基本屬性,還有圖層加載的相關方法。

同時對於MapView的空間參考,最大範圍,初始範圍若不特殊指定,即爲第一個加入MapView的圖層相關信息所決定。這也是初學ArcGIS Android開發特別需要注意的地方,其後加入的所有圖層也須與第一個一致,否則會導致加載不成功。

圖層大體可以分成三大類:在線圖層、離線圖層、交互圖層。

1.1、在線圖層

在線主要包括靜態圖層(TiledLayer)和動態圖層(DynamicLayer)兩大類。

此外繼承交互圖層GraphicLayer的ArcGISFeatureLayer也是在線圖層的一種,用於在線要素編輯。

靜態圖層泛指緩存過的地圖服務,除非服務端刪除或更新緩存,否則客戶端請求的數據永遠是固定不變的,而動態圖層正好相反,服務器根據每個請求動態的生成數據,一靜一動各有用途。這兩種圖層都是由ArcGIS for Server提供。

1.2、離線圖層

離線圖層主要包括:柵格圖層、離線矢量圖層兩大類。

柵格圖層主要包括:ArcGISLocalTiledLayer(用於加載緊湊型切片、TPK),RasterLayer(用於加載 ASRP/USRP、CIB1,5,10、DTED0, 1, 2、GeoPackage、GeoTIFF、HFA、HRE、IMG、JPEG、JPEG2000、NITF、PNG、RPF、SRTM1, 2格式的影像數據)

離線矢量圖層主要包括:FeatureLayer(用於加載shapeFile、Runtime Content<.geodatabase>格式的矢量數據)

特殊說明:這裏需要注意FeatureLayer和ArcGISFeatureLayer的區別,FeatureLayer繼承於Layer用於離線矢量數據的加載,ArcGISFeatureLayer繼承於GraphicLayer,用於加載ArcGIS for Server 發佈的FeatureService服務,做在線編輯使用。

1.3、交互圖層

交互圖層即負責和用戶打交道的圖層,比如繪製點、線、面;畫一個矩形,圓,這些都是需要先存儲在零時圖層。用於響應用戶的繪製操作。在ArcGIS Runtime SDK中交互圖層主要通過GraphicLayer實現。

2、常見空間數據的加載方法

常見空間數據類型主要有:在線底圖服務;離線底圖的tpk和緩存切片、影像數據;離線矢量的.geodatabase,shapFile文件。

2.1、加載ArcGIS在線數據源

ArcGIS在線的數據源有很多種,包括地圖服務、要素服務、影像服務等,同時,ArcGIS Runtime SDK for Android中也提供了各種相應的圖層來加載在線數據,具體如下:

2.1.1、ArcGISTiledMapServiceLayer

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);

 2.1.2、ArcGISDynamicMapServiceLayer

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);  

2.1.3、ArcGISImageServiceLayer

 ArcGISImageServiceLayer圖層對應ArcGIS for Server服務中的影像服務,它爲移動端使用影像數據提供了一種途徑,通過這種方式調用的影像數據通常可以用來作爲底圖。調用影像服務也非常簡單,同調用上述服務一樣,示例代碼如下:

map = (MapView)findViewById(R.id.map);
map.addLayer(new ArcGISImageServiceLayer("http://myserver/arcgis/rest/services/MyImage/ImageServer",null));

2.1.4、ArcGISFeatureLayer

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),不同模式返回數據的方式和執行的效率不同:

  1. Snapshot mode:快照模式能從Server上快速取回要素,能減少響應時間,但如果圖層包含大量、複雜的要素時,可能會導致設備停止響應,因爲有大量的要素需要繪製,也會導致ArcGIS for Server達到它返回要素數量的上線。ArcGIS Server 9.3.1的默認限制是500,10.0是1000,當然,這個數據可以在server端進行配置。建議小數據量的dataset才使用snapshot mode。

  2. On demand mode:On demand mode需要在客戶端和服務器之間傳遞更多的請求,適合展示變化的數據,該mode適合包含複雜要素的大數據量的dataset,因爲它只請求和返回需要的要素,不過,爲圖層設置比例尺限制仍然是有必要的。

  3. 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);

2.2、加載tpk和緊湊型切片

緊湊型切片是在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/8048549http://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);

2.3、加載影像數據

ArcGIS Runtime SDK for Android 從10.2.4開始支持直接讀取本地影像數據,數據類型包含:ASRP/USRP、CIB1,5,10、DTED0, 1, 2、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);

2.4、加載離線的.geodatabase本地文件

.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文件的步驟有如下幾步:

1、  實例化一個Geodatabase對象,這個類有兩個構造函數,都需要指定本地數據庫的存儲路徑;

2、  創建一個GeodatabaseFeatureTable對象實例,用來獲取需要的圖層;

3、  創建一個FeatureLayer來存儲獲取的圖層,並將獲取的圖層加載到地圖中;

4、  調用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();

 加載所有圖層示例代碼如下:
Geodatabase geodatabase = new Geodatabase("/*.geodatabase");
if (geodatabase != null) {
    List<GeodatabaseFeatureTable> featureTableList = geodatabase.getGeodatabaseTables();
    for (int i = featureTableList.size(); i > 0; --i) {
        mMapView.addLayer(new FeatureLayer(featureTableList.get(i - 1)));
    }
}

2.5、加載ShapeFile文件

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);



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