ArcGIS Runtime For Android

Vincent_9920發表於2019-04-23

基本概念

  • 空間參考

GIS的空間參考,包含座標系和其他相關空間屬性 。空間參考是用於儲存各要素類和柵格資料集,以及其他座標屬性(例如,x,y 座標的座標解析度及可選的 z 座標和測量 (m) 座標)的座標系。如果需要,可使用表示表面高程的 z 座標為資料集定義一個垂直座標系。

  • 地圖控制元件

    <com.esri.android.map.MapView
         android:id="@+id/mapView"
         android:layout_width="match_parent"
         android:layout_height="match_parent"  />
    複製程式碼

MapView 是 ArcGIS Runtime SDK for Android 的核心元件,通過 MapView 可以呈現地圖服務的資料,並且在 MapView 中定義了豐富的屬性、方法和事件,使用者通過 MapView 可以操作地圖,預設 MapView 提供了縮放、ping'yi操作。MapView是Android中ViewGroup的子類,也是 ArcGIS Runtime SDK for Android 中的地圖容器 。

MapView 可以新增一個或多個圖層,圖層又分很多種, 並且圖層只有新增到 MapView 容器中才會顯示。通過 MapView 可以設定地圖的顯示範圍、是否允許被旋轉、地圖背景、地圖的最大/最小解析度及其指定當前顯示的解析度/比例尺。MapView還 提供了豐富的手勢監聽介面,通過這些監聽器,可以監聽各種手勢動作,如點選、雙擊、移動或長按等操作。

  • 圖層

圖層是 GIS 中很重要的概念,圖層是空間資料的載體,通過它可將各種型別的地圖資料進行載入顯示,是幾何圖形和其對應屬性資訊的集合。各種圖層尤其自己的作用,下圖是圖層的繼承關係圖:

enter image description here

文章地址

地圖圖層載入

所有的圖層都繼承自Layer,地圖控制元件為我們提供了addLayer()方法,所以需要新增圖層的時候我們使用addLayer方法將圖層新增到map中。

  • ArcGISLocalTiledLayer

    ArcGISLocalTiledLayer 是用來新增離線資料包的圖層,該圖層目前支援兩種格式的離線資料:一個是緊湊型的快取切片,另一個是打包的 tpk 格式的資料。

ArcGISLocalTiledLayer tileLayer = new ArcGISLocalTiledLayer("file://" + mapPath + "/" + fileName);//例項化圖層
tileLayer.setVisible(false);//控制圖層顯示與否;
tileLayer.setName(fileName);//設定圖層的名稱
tileLayer.setOpacity();//設定圖層的不透明度
mapView.addLayer(tileLayer);//新增圖層到地圖視窗中
複製程式碼
  • ArcGISTiledMapServiceLayer

ArcGISTiledMapServiceLayer 圖層用於顯示 ArcGIS for Server 服務中的切片資料, 不能對圖層中的資料進行更改,除非更新服務快取。因為是使用服務切出來的PNG格式的圖片資料,在 arcgis for android中,無法對此型別的資料查詢,常用做底圖使用。 因為是快取資料,這個型別的圖層是請求最快的圖層之一。

 String url ="https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer";
ArcGISTiledMapServiceLayer serviceLayer=new  ArcGISTiledMapServiceLayer(url );
mapView.addLayer(serviceLayer);//新增圖層到地圖視窗中
複製程式碼
  • ArcGISDynamicMapServiceLayer

ArcGISDynamicMapServiceLayer 圖層用於顯示動態地圖服務的資料,服務端根據移動裝置的螢幕顯示範圍、地圖比例尺返回請求資料,用法與 ArcGISTiledMapServiceLayer 圖層相同。

ArcGISDynamicMapServiceLayer圖層通常包含多個圖層,這些圖層由 server 根據請求來渲染並以圖片形式返回。其功能特點是更新非常方便,並能及時呈現給使用者,同時,圖層的可視性和空間參考可以改變,可以給圖層新增單獨的 layer definition,ArcGIS Server 為每個 image 動態投影。而地圖的空間參考是由第一個載入的圖層決定。

效能特點:它的渲染時間取決於請求資料的數量和複雜度,因此一般都比 tiled map server 要慢,它適合資料經常發生改變、或者需要針對不同的使用者呈現不同的資料,且要素資訊不需要的情況。

String  tiledLayerAddress="http://10.200.3.210:6001/arcgis/rest/services/ranqimap/gw2016_3/MapServer";
ArcGISDynamicMapServiceLayer agsDMS =new ArcGISDynamicMapServiceLayer(tiledLayerAddress);
mapView.addLayer(tiledLayerAddress);//新增圖層到地圖視窗中
複製程式碼
  • ArcGISImageServiceLayer

ArcGISImageServiceLayer 圖層用於顯示影像服務資料

String url="http://myserver/arcgis/rest/services/MyImage/ImageServer" 
ArcGISImageServiceLayer imgserviceLayer =new ArcGISImageServiceLayer(url,null);//option
mapView.addLayer(tiledLayerAddress);//新增圖層到地圖視窗中

複製程式碼
  • BingMapLayer

ArcGIS Runtime for Android中也可以新增Bing地圖服務,首先必須註冊賬戶並獲取Bing map的App ID,有了這個 ID 就有了使用 Bing 地圖的許可權,具體的賬戶申請和操作步驟可以參照以下地址: 地址:www.bingmapsportal.com/ 詳細說明:msdn.microsoft.com/en-us/libra…

<com.esri.android.map.MapView
android:id="@+id/map"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
url="http://www.arcgis.com/home/item.html?id=2b571d8c079d46b4a14a67df42b1da6f"
appId=""> </com.esri.android.map.MapView>
複製程式碼

也可以通過程式碼的方式動態新增圖層:

BingMapsLayer blyr=new BingMapsLayer("你的Bingmap ID",地圖風格); 
mapView.addLayer(blyr);//新增圖層到地圖視窗中
複製程式碼

地圖風格有如下幾種:

AERIAL("Aerial"),
AERIAL_WITH_LABELS("AerialWithLabels"),
ROAD("Road");
複製程式碼
  • GraphicsLayer

Graphic 是 ArcGIS Runtime for Android 中比較重要的圖層型別,也是使用最為頻繁的一個。GraphicsLayer 可以包含一個或多個 Graphic 物件,查詢的返回結果和動態標繪的 Graphic 資料都要通過它呈現。建議在 MapView 中新增圖層時不要第一個新增該型別的圖層,因為 MapView 載入圖層時先要初始化一些地圖引數,而該圖層不具備這些引數。

除了可以呈現 Graphic 物件外,它還具備了一些其他有用的功能,如要素更新與要素獲取等等,由類 GraphicsLayer 處理,GraphicsLayer 是由應用程式來定義的圖層,專門用來繪製有空間參考的要素,並不適合繪製 non-geographical 要素,如指北針或 copyright text。可以用螢幕座標來查詢圖層中的要素並且使getGraphics()方法返回要素,並且支援設定圖層比例尺。

不推薦在 graphics layer 中存放太多的要素,但是,它有著不錯的效能,並且是 feature layer class的基類,如果必須要處理大量的要素,建議使用 feature collection 來儲存在 feature layer 中。

 GraphicsLayer graphicsLayer=new GraphicsLayer();
mapView.addLayers(graphicsLayer);
複製程式碼
  • ArcGISFeatureLayer

ArcGISFeatureLayer 顯示Feature Service提供的資料,與其它圖層型別相比具有最豐富的功能,其中的每個要素都能被查詢,和SQL 語句過濾,繼承自 GraphicsLayer。

該圖層可以是空間圖層,也可以是非空間的表,它包含了很多要素的資訊,每個要素單獨渲染,從 ArcGIS Server Feature Service 或者 map service(此種 feature layer 不能編輯)中請求要素,並返回 JSON 格式的資料並繪製。載入速度就相對較慢。

只有 Feature Service 才可以具備線上資料編輯功能,如果想要對某個資料進行線上編輯或同步,需要將其釋出成 Feature Service,並在移動端新建一個 ArcGISFeatureLayer 圖層以載入該服務。該圖層有一些設定,這些設定能影響圖層的效能,包括請求時間,返回大小、處理和響應時間等(設定需要在圖層initialized 完成之後進行)。 ArcGISFeatureLayer 在可以設定 3 種模式(mode),不同模式返回資料的方式和執行的效率不同

String url = "https://servicesbeta.esri.com/ArcGIS/rest/services/SanJuan/TrailConditions/FeatureServer/0"; 
MapView mv = new MapView(this); 
mv.addLayer(new ArcGISFeatureLayer(url,MODE.SNAPSHOT));//按照快照方式 
複製程式碼
  • 本地向量資料

FeatureLayer支援兩種格式的向量圖層資料(Shp,geodatabase),通用的SHP檔案直接可以在裡邊載入,另外使用ArcMap釋出的geodabase資料庫檔案資料也可以直接開啟。我們推薦使用geodatabase資料庫檔案的資料進行地圖的瀏覽,因為geodatabase資料庫資料中包含了簡單的符號化。

  • 載入SHP檔案資料
ShapefileFeatureTable fTab = new ShapefileFeatureTable(dataFile.getAbsolutePath()); 
FeatureLayer fLayer = new FeatureLayer(fTab); // 
SimpleFillSymbol fillSymbolRender = new SimpleFillSymbol(Color.parseColor("#"));
Renderer renderer = new SimpleRenderer(fillSymbolRender);
fLayer.setRenderer(renderer);//圖層符號化;
mapView.addLayer(fLayer);
複製程式碼
  • 載入geodataabase資料檔案
Geodatabase dataBase = new Geodatabase(dataFile.getAbsolutePath());
List<GeodatabaseFeatureTable> gfts = dataBase.getGeodatabaseTables();
if (gfts.size() > 0) {
 int lyrCnt = gfts.size();
 for (int j = lyrCnt - 1; j > -1; j--) {
     GeodatabaseFeatureTable gft = gfts.get(j);
     // String layerName = gft.getFeatureServiceLayerName();
     FeatureTable tab = (FeatureTable) gft;
     //featurecount += tab.getNumberOfFeatures();
     FeatureLayer featureLayer = new FeatureLayer(tab);
     featureLayer.setName(tab.getTableName());
     featureLayer.setVisible(false);
     featureLayer.setEnableLabels(true);
     //Log.i("TabeName",tab.getTableName());
    Geometry.Type geoType = featureLayer.getGeometryType();
    //Log.i("GeoType", geoType.toString());
    //mMapView.addLayer(featureLayer);
    mapView.addLayer(featureLayer);
}
}
複製程式碼

文章地址

圖形繪製

繪製的邏輯:

enter image description here
地圖中應該包含繪製層---------->GraphicsLayer 在介面上,點選按鈕向系統傳送命令-------->需要一個列舉類,存放命令 地圖需要監聽點選事件 ---------->OnSingleTapListener 每個圖形需要一個預設的符號------>Symbol 圖形是根據點來繪製的,所以需要儲存圖形的點資料------->List

相關文章