1. 程式人生 > >ArcGIS for Android Runtime100 基本操作(一)——圖層載入和切換

ArcGIS for Android Runtime100 基本操作(一)——圖層載入和切換

      之前我打算通過程式碼移植的方式來學習ArcGIS for Android Runtime100,博文地址是:http://blog.csdn.net/bit_kaki/article/details/7719648。但是覺得效果不太理想,因為這個版本的變化實在太多,即使修改後程式碼不報錯,但是因為很多方法的改變,也會給自己留下很多坑,因為方法改變,自己實際上還是錯了。

      所以我打算重新開貼來從頭學習下ArcGIS for Android Runtime100,看來學習這個事還是得踏踏實實才行啊。

      對於ArcGIS 10.5的一些特性和ArcGIS for Android Runtime100的優勢我已經在上一篇文章做過闡述,這裡不再累述。

一、環境配置

和之前ArcGIS所需環境差不多,在project的build.gradle裡新增url:

allprojects {
    repositories {
        jcenter()
        maven {
            url 'http://esri.bintray.com/arcgis'
}
    }
}

      然後在module的build.gradle裡新增compile:
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:25.3.1' // compile 'com.esri.arcgis.android:arcgis-android:10.2.8' compile 'com.esri.arcgisruntime:arcgis-android:100.1.0'}

      注意下面個是Runtime100,被我註釋掉的是之前用的10.2.8

二、地圖和圖層(MapView和Layer)

      在ArcGIS Runtime的產品裡,地圖都是通過MapView展示出來的。作為地圖展示的容器,我們可以通過MapView實現縮放、旋轉、平移、獲取範圍、比例尺、解析度等資訊,以及進行常用的手勢操作等。
      在10.2裡MapView直接繼承於ViewGroup類,本身就是地圖內容的展示容器,使用時候直接在MapView可以載入各種基礎底圖、業務圖層和繪製圖層。



      但是在Runtime100裡,增加了3D地圖顯示的功能。為了滿足大多數人的使用習慣,Esri依然採用MapView類作為2D地圖的展示容器,新增了SceneView類作為3D地圖的展示容器,然後這兩個類共同繼承於一個叫GeoView的基類。


      然後整個MapView的結構也進行了更改。不再是作為一個容器直接新增圖層,而是分成了地圖內容和繪製圖層兩部分進行新增:


      所以在Runtime100裡,多出來一個額外的類——ArcGISMap。MapView類不再直接和Layer類關聯,而是通過了ArcGISMap類關聯,將圖層資料的載入、刪除、管理等操作全交給ArcGISMap類來完成。

      ArcGISMap類裡可以包含一個底圖圖層和多個業務圖層,底圖永遠位於地圖最下層,而業務圖層的順序則是通過ArcGISMap.getOperationalLayers的方法獲取到一個包含當前載入圖層的集合類LayerList,再通過這個類進行控制。另外整個地圖的空間參考將由ArcGISMap類載入的第一個圖層來定,也就是說這個空間參考不一定是根據底圖來確定。

      MapView通過MapView.setMap(ArcGISMap)來和ArcGISMap進行關聯。


      MapView是展示地圖的容器,而地圖的內容則是通過Layer來表達,每個Layer包含了一個圖層的資料。Layer按資料型別可以分大約二十類,這裡不再進行一一闡述,就常用的幾種Layer說明下。

  • 切片資料圖層(ArcGISTiledLayer

      切片資料主要用來做為底圖的展示,包含渲染後的地圖和地圖的空間參考資訊,其離線資料的格式為TPK。

      Runtime100新增了一個ArcGISTiledLayer類來展示切片資料,說是新增,其實是將之前的ArcGISLocalTiledLayer類和ArcGISTiledMapServiceLayer類合併成一個,也就是說這個類既可以載入離線TPK資料,也可以載入線上切片資料。使用方法如下所示:

      離線資料:

String url = StorageUtil.getSDCardRootPath(getApplicationContext()) + "/ydyzt/data/YGYX.tpk";
TileCache mainTileCache = new TileCache(url);
ArcGISTiledLayer layer = new ArcGISTiledLayer(mainTileCache);

      線上資料:

String theURLString ="http://map.geoq.cn/arcgis/rest/services/ChinaOnlineCommunity/MapServer";
ArcGISTiledLayer mainArcGISTiledLayer = new ArcGISTiledLayer(theURLString);

  • 向量切片資料圖層(ArcGISVectorTiledLayer

      向量切片資料是ArcGIS10.4裡推出的一種新資料,它在傳統的切片資料的基礎上同時打包了向量資料,因此除了展示外,也可以提供查詢的功能。其離線打包資料格式為VTPK。

      Runtime100裡採用ArcGISVectorTiledLayer類來展示向量切片資料,使用方法和ArcGISTiledLayer類相似:

      離線資料:

String url = StorageUtil.getSDCardRootPath(getApplicationContext()) + "/ydyzt/data/YGYX_YS.vtpk";ArcGISVectorTiledLayer layer = new ArcGISVectorTiledLayer(mainTileCache);

      線上資料:

String theOfflineTiledLayers ="https://www.arcgis.com/home/item.html?id=e19e9330bf08490ca8353d76b5e2e658";
ArcGISVectorTiledLayer mainArcGISVectorTiledLayer = new ArcGISVectorTiledLayer(theOfflineTiledLayers);

  • 要素圖層(FeatureLayer

     要素資訊是ArcGIS的最基本的資訊,包含了向量資訊以及與之對應的表資料,可以用來進行展示、查詢、分析、編輯等。其離線資料格式為geodatabase。

     Runtime100裡依然保留了ArcGIS的經典圖層——FeatureLayer,每個要素圖層裡都通過一個FeatureTable構造來。FeatureTable可以通過離線geodatabase獲取,也可以通過線上的要素服務得到:

      離線資料:

String path=StorageUtil.getSDCardRootPath(getApplicationContext())+"/ydyzt/data/GD_TDYT.geodatabase";
final Geodatabase localGdb=new Geodatabase(path);
localGdb.loadAsync();
localGdb.addDoneLoadingListener(new Runnable() {
    @Override
public void run() {
        LayerList mainLayerList = arcGISMap.getOperationalLayers();
        for (GeodatabaseFeatureTable gdbFeatureTable : localGdb.getGeodatabaseFeatureTables()) {
                 FeatureLayer dataFeatureLayer = new FeatureLayer(gdbFeatureTable);
                 mainLayerList.add(dataFeatureLayer);
} }});

      線上資料:

String mainFeatureLayerURL =
        "http://sampleserver6.arcgisonline.com/arcgis/rest/services/PoolPermits/FeatureServer/0";
final ServiceFeatureTable mainServiceFeatureTable = new ServiceFeatureTable(mainFeatureLayerURL);
mainServiceFeatureTable.setFeatureRequestMode(ServiceFeatureTable.FeatureRequestMode.ON_INTERACTION_NO_CACHE);
mainServiceFeatureTable.addLoadStatusChangedListener(new LoadStatusChangedListener() {
    @Override
public void loadStatusChanged(LoadStatusChangedEvent loadStatusChangedEvent) {
        if (loadStatusChangedEvent.getNewLoadStatus() == LoadStatus.LOADED) {
            ServiceFeatureTable.FeatureRequestMode mainFeatureRequestMode =
                    mainServiceFeatureTable.getFeatureRequestMode();
String mainFeatureRequestModeName = mainFeatureRequestMode.name();
}
    }
});

  • 動態地圖圖層(ArcGISMapImageLayer和ArcGISMapImageSublayer
      動態地圖圖層ArcGISMapImageLayer是通過訪問動態地圖服務MapService獲取的,裡面包含的是一個子圖層集合SublayerList,通過這個子圖層集合可以構造得到每個動態地圖圖層ArcGISMapImageSublayer:
String mainArcGISMapImageLayerURL =
        "http://sampleserver6.arcgisonline.com/arcgis/rest/services/SampleWorldCities/MapServer";
final ArcGISMapImageLayer mainMapImageLayer = new ArcGISMapImageLayer(mainArcGISMapImageLayerURL);
mainMapImageLayer.addDoneLoadingListener(new Runnable() {
    @Override
public void run() {
        SublayerList mainSublayerList = mainMapImageLayer.getSublayers();
ArcGISMapImageSublayer mainMapImageSublayer = (ArcGISMapImageSublayer) mainSublayerList.get(0);
}
});

  • 移動地圖資料包含的圖層
      移動地圖資料是ArcGIS10.5新推出的一種資料格式,其特點是將所有地圖和資料資源打包,並且將資料儲存於壓縮的Mobile GDB中,因此可以進行展示、查詢、分析等所有操作。相比TPK資料來資料更小,而對於geodatabase資料而言,其載入圖層效率上有明顯的優勢。因為其獲取圖層的方式比較特殊,所以單獨拿出來說明下。

      MMPK因為是將所有地圖和資料資源打包,因此其直接獲取到的是ArcGISMap,我們要獲取要素圖層,需要先獲取到ArcGISMap以後,再從其中獲取FeatureLayer。

String mainMMPKPath = StorageUtil.getSDCardRootPath(getApplicationContext())+"/ydyzt/data/SanFrancisco.mmpk";
final MobileMapPackage mainMobileMapPackage = new MobileMapPackage(mainMMPKPath);
mainMobileMapPackage.loadAsync();
mainMobileMapPackage.addDoneLoadingListener(new Runnable() {
    @Override
public void run() {
        LoadStatus mainLoadStatus = mainMobileMapPackage.getLoadStatus();
        if (mainLoadStatus == LoadStatus.LOADED) {
            List<ArcGISMap> mainArcGISMapL = mainMobileMapPackage.getMaps();
ArcGISMap mainArcGISMapMMPK = mainArcGISMapL.get(0);
            mMapView.setMap(mainArcGISMapMMPK);
} }});

      除此以外,圖層還有三維地圖圖層(ArcGISSceneLayer),基於微軟必應地圖的圖層(BingMapsLayer),要素集合圖層(FeatureCollectionLayer)等等,就不一一介紹了。

三、圖層的載入和切換

      我們獲取到了圖層資訊以後,需要將這些資訊載入在地圖上。在ArcGIS 10.2裡,我們這需要執行MapView.addLayer(Layer)方法即可在地圖上載入圖層。

      而之前我們可以看到,在Runtime100裡,MapView是通過ArcGISMap類來完成圖層的管理,所以方法也就變了。

      首先是底圖的載入。之前我們也介紹了,ArcGISMap類是將底圖和業務圖層分開的,對於底圖,ArcGISMap裡用了Baemap類來進行管理。取一個完整的例子就是:

    mMapView = (MapView) findViewById(R.id.mapview);
arcGISMap = new ArcGISMap();
    String url = StorageUtil.getSDCardRootPath(getApplicationContext()) + "/ydyzt/data/YGYX.tpk";
TileCache mainTileCache = new TileCache(url);
ArcGISTiledLayer layer = new ArcGISTiledLayer(mainTileCache);
Basemap basemap = new Basemap(layer);
arcGISMap.setBasemap(basemap);
mMapView.setMap(arcGISMap);

      而如果我們要切換底圖時候,僅需要給ArcGISMap類重新賦值一個底圖即可。

button.setOnClickListener(new View.OnClickListener() {
    @Override
public void onClick(View v) {
        Basemap basemap = new Basemap(layer);
arcGISMap.setBasemap(basemap);
mMapView.setMap(arcGISMap);
}
});

      對於業務圖層的載入,上一章我們也說了,ArcGISMap類管理業務圖層是通過一個包含當前載入圖層的集合類LayerList來進行管理的,載入時候的方法如下所示:

String path=StorageUtil.getSDCardRootPath(getApplicationContext())+"/ydyzt/data/GD_TDYT.geodatabase";
final Geodatabase localGdb=new Geodatabase(path);
localGdb.loadAsync();
localGdb.addDoneLoadingListener(new Runnable() {
    @Override
public void run() {
        LayerList mainLayerList = arcGISMap.getOperationalLayers();
        for (GeodatabaseFeatureTable gdbFeatureTable : localGdb.getGeodatabaseFeatureTables()) {
            FeatureLayer dataFeatureLayer = new FeatureLayer(gdbFeatureTable);
mainLayerList.add(dataFeatureLayer);
}
    }
});

      而要進行業務圖層的管理,LayerList類在載入圖層時候可以有順序,第一位引數為序號,序號為0表示最底層,然後依次往上疊加。在移除圖層時候可以通過圖層進行移除,也可以通過圖層的序號進行移除。



相關推薦

ArcGIS for Android Runtime100 基本操作——載入切換

      之前我打算通過程式碼移植的方式來學習ArcGIS for Android Runtime100,博文地址是:http://blog.csdn.net/bit_kaki/article/details/7719648。但是覺得效果不太理想,因為這個版本的變化實在太

kubernets1.10.1--基本操作

k8s kubernets Kubectl管理工具 在node節點部署 # 設置集群項中名為kubernetes的apiserver地址與根證書 kubectl config set-cluster kubernetes --server=https://192.168.1.107:6443 --

oracle數據庫基本操作

ext pre dml arc 插入 esc update enc 相同 一、數據基本類型   1、oracle的偽列     Oracle 中偽列就像一個表列,但是它並沒有存儲在表中偽列可以從表中查詢,但不能插入、更新和刪除它們的值常用的偽列有ROWID和ROWNUM;

oracle 11g RAC 的基本操作------啟動與關閉

執行 同時 man sources monit vip nag 查看數據庫 resource 啟動RAC 手工啟動按照HAS, cluster, database的順序啟動,具體命令如下: 啟動HAS(High Availability Servi

python列表基本操作

一個 處理 move 長度 指定 排序 app 索引 處理方法 函數list 有些時候修改字符串不能像列表那樣,可以使用list來解決 list函數實際上是一個類,而不是函數。 somelist = list(‘hello‘) 字符串str1 = hello world,

JDBC資料庫基本操作

1.什麼是JDBC? 在看JDBC的概念之前先來看看什麼是資料庫驅動。 資料庫驅動中驅動的概念和平時聽到的那種驅動的概念是一樣的,比如平時購買的音效卡,網絡卡直接插到計算機上面是不能用的,必須要安裝相應的驅動程式之後才能夠使用音效卡和網絡卡,同樣道理,我們安裝好資料庫之後,我們的應用程式也是不能直接使用資

MongoDB基礎教程系列--第二篇 MongoDB基本操作

1、安裝環境 在官網上下載MongoDB的最新版本,根據自身Windows版本下載正確的MongoDB版本。下載後,雙擊32位或者64位.msi檔案,按操作提示安裝就可以了。 說明: 32 位版本的 MongoDB 只支援 2G 以下的資料庫,只適用於測試及評估。 在

Linux基本操作

文章同步更新在我的知乎專欄: 1. 使用Microstrong使用者,登入到Linux圖形介面。 2. 虛擬控制檯(允許多個使用者同時登入,或同一使用者在同一時間內多次登入,即每個控制檯就是一個登入通道) 圖形介面下:Ctrl+Alt+F1(F2~F6),其中F1是

SQL server2008基本操作

SQL server2008基本操作 目錄  1.註冊伺服器 (1)註冊一個本地伺服器S1,測試註冊是否成功,如果成功則儲存該伺服器註冊。步驟: 第1步:開啟SQL Server Management Studio視窗→“檢視” → “

C++基本操作:string

1,統計字串長度    int length();     2, 判斷是否為空    bool empty();     3, 字串的連線    string &

Linux系統常用基本操作

一、Linux命令列 [[email protected] ~]$ [[email protected] ~]# 1、user、root 當前操作的使用者; 2、@bigdata

棧的基本操作

1.棧的基本概念 棧是一種只能在一端進行插入或刪除操作的線性表。其中允許進行插入或刪除操作的一端稱為(Top),棧頂由一個稱為棧頂指標的位置指示器(其實就是一個變數,對於順序棧,就是記錄棧頂元素在陣列位置標號的一個整型變數;對於鏈式棧,就是記錄棧頂元素所在結點

檔案基本操作

一、1 什麼是檔案?    檔案是作業系統為使用者或應用程式提供的一個讀寫硬碟的虛擬單位    檔案的操作核心就是:讀、寫    即我們只需要對於進行讀寫操作,就是對作業系統發起請求,然後由作業系統將使用者或者應用程式    對檔案的讀寫操作轉換成具體的硬碟指令(比如控制碟片

ArcGIS for Android 100.3.016:RasterLayer(柵格)

柵格圖層(RasterLayer) 用以載入展示移動端本地檔案、移動鑲嵌資料集、影像服務。 api地址 1.影像服務 mMapView = (MapView) findViewById(R.id.mapView); A

SpringBoot基本操作——環境搭建及專案建立有demo

SpringBoot2.0筆記 本文使用idea工具構建Springboot2.0+SpringMvc+Thymeleaf+SpringDataJPA+MySql+Redis專案 此demo可直接下載執行,以下為具體建立專案過程步驟說明

Mysql基礎2:SQL語句基本操作

1. DDL:庫操作、表操作和列操作等(使用的關鍵字:create、alter和drop) 1.1  庫操作 基本語法:create database 資料庫名字 [資料庫選項] 資料庫選項:主要是用來約束資料庫,可分為兩項: 1)字符集的設定:charset或者

ArcGIS for Android 10.2.95:GraphicsLayer移除Graphic,GraphicsLayer常用API

**API提供三個移除Graphic的方法: 1.public void removeAll ()刪除所有Graphic。 2.public void removeGraphic (int id)使用唯一ID刪除Graphic。 3.public void

mongoose的基本操作

MongoDB是一個開源的NoSQL資料庫,相比MySQL那樣的關係型資料庫,它更顯得輕巧、靈活,非常適合在資料規模很大、事務性不強的場合下使用。同時它也是一個物件資料庫,沒有表、行等概念,也沒有固定的模式和結構,所有的資料以文件的形式儲存(文件,就是一個關聯陣

串的性質基本操作

串的概念 什麼是串呢? 串(String):由零個或多個字元組成的有限序列。記為:s=’a1a2…an’(n≥0) s為串名, ’a1a2…an’為串值,n為串的長度。

ArcGIS for Android 100.3.07:繪製(GraphicsOverlay) ,符號渲染器(Symbols and Renderers)

繪製圖層GraphicsOverlay 100版本單獨把繪製圖層拿出來的一個好處就是,它將永遠置於地圖內容之上。在以前我們如果要在MapView里加載一個新的圖層,必須先remove帶有圖形的FeatureLayer,載入這個圖層之後再載入一次帶有圖形的F