GIS的空間參考,包含座標系和其餘相關空間屬性 。空間參考是用於存儲各要素類和柵格數據集,以及其餘座標屬性(例如,x,y 座標的座標分辨率及可選的 z 座標和測量 (m) 座標)的座標系。若是須要,可以使用表示表面高程的 z 座標爲數據集定義一個垂直座標系。html
地圖控件android
<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 中很重要的概念,圖層是空間數據的載體,經過它可將各類類型的地圖數據進行加載顯示,是幾何圖形和其對應屬性信息的集合。各類圖層尤爲本身的做用,下圖是圖層的繼承關係圖:bash
文章地址app
全部的圖層都繼承自Layer,地圖控件爲咱們提供了addLayer()方法,因此須要添加圖層的時候咱們使用addLayer方法將圖層添加到map中。性能
ArcGISLocalTiledLayer 是用來添加離線數據包的圖層,該圖層目前支持兩種格式的離線數據:一個是緊湊型的緩存切片,另外一個是打包的 tpk 格式的數據。this
ArcGISLocalTiledLayer tileLayer = new ArcGISLocalTiledLayer("file://" + mapPath + "/" + fileName);//實例化圖層
tileLayer.setVisible(false);//控制圖層顯示與否;
tileLayer.setName(fileName);//設置圖層的名稱
tileLayer.setOpacity();//設置圖層的不透明度
mapView.addLayer(tileLayer);//添加圖層到地圖窗口中
複製代碼
ArcGISTiledMapServiceLayer 圖層用於顯示 ArcGIS for Server 服務中的切片數據, 不能對圖層中的數據進行更改,除非更新服務緩存。由於是使用服務切出來的PNG格式的圖片數據,在 arcgis for android中,沒法對此類型的數據查詢,經常使用作底圖使用。 由於是緩存數據,這個類型的圖層是請求最快的圖層之一。url
String url ="https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer";
ArcGISTiledMapServiceLayer serviceLayer=new ArcGISTiledMapServiceLayer(url );
mapView.addLayer(serviceLayer);//添加圖層到地圖窗口中
複製代碼
ArcGISDynamicMapServiceLayer 圖層用於顯示動態地圖服務的數據,服務端根據移動設備的屏幕顯示範圍、地圖比例尺返回請求數據,用法與 ArcGISTiledMapServiceLayer 圖層相同。spa
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 圖層用於顯示影像服務數據
String url="http://myserver/arcgis/rest/services/MyImage/ImageServer"
ArcGISImageServiceLayer imgserviceLayer =new ArcGISImageServiceLayer(url,null);//option
mapView.addLayer(tiledLayerAddress);//添加圖層到地圖窗口中
複製代碼
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");
複製代碼
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 顯示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數據庫數據中包含了簡單的符號化。
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);
複製代碼
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);
}
}
複製代碼
繪製的邏輯:
地圖中應該包含繪製層---------->GraphicsLayer 在界面上,點擊按鈕向系統發送命令-------->須要一個枚舉類,存放命令 地圖須要監聽點擊事件 ---------->OnSingleTapListener 每一個圖形須要一個默認的符號------>Symbol 圖形是根據點來繪製的,因此須要保存圖形的點數據------->List