《ArcGIS Runtime SDK for Android学习笔记》-7、地图图层Layer

Author Avatar
wshunli 4月 15, 2016
  • 在其它设备中阅读本文章

在GIS中图层是很重要的概念,图层是空间数据的载体,通过它可将各种类型的地图数据进行加载显示,但图层只有添加到MapView对象中才能使用。在ArcGIS Runtime for Android中有许多种图层,不同图层有不同的作用,下图是图层的继承关系图:

DynamicLayer

DynamicLayer 是动态图层的基类.

ArcGISDynamicMapServiceLayer

ArcGISDynamicMapServiceLayer 图层对应 ArcGIS for Server 服务中的动态服务,动态地图服务的地图数据是按照移动设备范围读取的,用法与ArcGISTiledMapServiceLayer 图层相同。
ArcGISDynamicMapServiceLayer 图层通常包含多个图层,这些图层由server根据请求来渲染并以raster image形式返回,并且返回的raster并不包含feature的额外信息。它的功能特点是更新非常方便,并能及时呈现给用户,同时,图层的可视性和空间参考可以改变,可以给图层添加单独的layer definition,ArcGIS Server为每个image动态投影。而地图的空间参考是由第一个加载的图层决定。
它的性能特点:它的渲染时间取决于请求数据的数量和复杂度,因此一般都比tiled map server要慢,因此,它适合数据经常发生改变、或者需要针对不同的用户呈现不同的数据,且要素信息(如attributes,geometry,symbol等)不需要的情况。

 //ArcGISDynamicMapServiceLayer class is used to define the Layer that is added to the
 //MapView object.
 MapView mv = new MapView(this);
 mv.addLayer(new ArcGISDynamicMapServiceLayer(
 "http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Demographics/ESRI_Population_World/MapServer"));
 setContentView(mv);

ArcGISImageServiceLayer

ArcGISImageServiceLayer图层对应ArcGIS for Server服务中的影像服务,调用影像服务也非常简单,同调用上述服务一样,示例代码如下:

 //ArcGISImageServiceLayer class is used to define the Layer that is added to the
 //MapView object.
 MapView mv = new MapView(this);
 mv.addLayer(new ArcGISImageServiceLayer(
 "http://myserver/arcgis/rest/services/MyImage/ImageServer",null));
 setContentView(mv);

WMSLayer

加载符合开放地理空间联盟(OGC)标准的WMS服务器数据。
服务地址类似:

http://[SERVER:PORT]/[INSTANCE]/services/[SERVICE]/MapServer/WMSServer

添加示例代码如下:

String wmsURL = "http://[SERVER:PORT]/[INSTANCE]/services/[SERVICE]/MapServer/WMSServer";
   WMSLayer wmsLayer = new WMSLayer(wmsURL);
   mMapView.addLayer(wmsLayer);

定义空间参考:

// use a spatial reference defined by sr
   WMSLayer wmsLayer = new WMSLayer(wmsURL, sr);
   mMapView.addLayer(wmsLayer);

利用图层名称组成的数列设置图层可见性:

String[] visibleLayers = {"ushigh", "counties"};
   wmsLayer.setVisibleLayer(visibleLayers);

获得所有图层信息:

WMSLayerInfo[] wmsLayerInfo = wmsLayer.getLayers();

GraphicsLayer

GraphicsLayer是ArcGIS Runtime for Android中比较重要的图层类型,也是使用最为频繁的一个。GraphicsLayer可以包含一个或多个Graphic对象,查询的返回结果和动态标绘的Graphic数据都要通过它呈现。建议在MapView中添加图层时不要第一个添加该类型的图层,因为MapView加载图层时先要初始化一些地图参数,而该图层不具备这些参数,其具体用法如下:

 //GraphicsLayer class is used to define the Layer that is added to the
 //MapView object.
 MapView mv = new MapView(this);
 mv.addLayer(new GraphicsLayer());
 setContentView(mv);

除了可以呈现Graphic对象外,它还具备了一些其他有用的功能,如要素更新与要素获取等等,由类GraphicsLayer处理,GraphicsLayer是由应用程序来定义的图层,专门用来绘制有空间参考的要素,并不适合绘制non-geographical要素,如指北针或copyright text。可以用屏幕坐标来查询图层中的要素并且使用getGraphics()方法返回要素,并且支持设置图层比例尺。
不推荐在graphics layer中存放太多的要素,但是,它有着不错的性能,并且是feature layer class的基类,如果必须要处理大量的要素,建议使用feature collection来存储在feature layer中。

TiledLayer

TiledLayer为加载切片的图层。包含两个直接子类。
ArcGISLocalTiledLayer, TiledServiceLayer

ArcGISLocalTiledLayer

ArcGISLocalTiledLayer是用来添加离线数据包的图层,该图层目前支持两种格式的离线数据:一个是紧凑型的缓存切片,另一个是打包的tpk格式的数据,对于这两种数据的制作方法可以参照我的文章,图层用法如下:

MapView mv = new MapView(this); 
ArcGISLocalTiledLayer local = new ArcGISLocalTiledLayer("file:///mnt/sdcard/<CacheName>/Layers");//离线图层,将缓存的地址作为参数传入 
mv.addLayer(local); 
setContentView(mv);

TiledServiceLayer

ArcGISTiledMapServiceLayer, BingMapsLayer, OpenStreetMapLayer, WMTSLayer
1、ArcGISTiledMapServiceLayer
在ArcGIS for Server中可以发布多种地图服务,移动端需要有不同的图层来对应这些服务。ArcGISTiledMapServiceLayer图层对应ArcGIS for Server服务中的切片服务,于切片都是事先做好的,ArcGISTiledMapServiceLayer不能对图层中的数据进行更改,除非更新服务缓存,在arcgis for android中,也不允许对此类型的数据查询,通常用做底图使用。同时,因为加载的是缓存切片,这个类型的图层是arcgis for android中相应请求最快的图层之一,它采用多个线程,通常是每个图片使用一个线程来处理请求和绘制图片,并且异步处理。用法如下:

MapView mv = new MapView(this); 
mv.addLayer(new ArcGISTiledMapServiceLayer( "http://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer")); 
setContentView(mv);

2、BingMapsLayer
BingMapsLayer用来加载必应地图。用法如下:

MapView mv = new MapView(this);
mv.addLayer(new BingMapsLayer(
"[your Bing Maps key]", MapStyle.Aerial));
setContentView(mv);

3、OpenStreetMapLayer
OpenStreetMapLayer用来加载OpenStreetMapLayer。实际用得比较少。

4、WMTSLayer
WMTSLayer加载WMTS服务,比如加载天地图什么的。

FeatureLayer

FeatureLayer是一种类型的层的特征组成; 在功能FeatureLayer包括几何图形和一组一致的属性。在一个特征FeatureLayer可以在地图,查询,编辑上显示,和选定(视觉突出显示)。每个要素都有一个唯一的ID。

一个FeatureLayer对应一个FeatureTable,这是在向传递FeatureLayer构造。在正确显示顺序,getSpatialReference()值必须以该地图的空间参考匹配FeatureLayer 添加。如果功能层的 FeatureTable是GeodatabaseFeatureServiceTable,通过调用设置空间参考 setSpatialReference(SpatialReference) 方法。当FeatureTable是GeodatabaseFeatureTable从获得的地理数据库,生成使用地理数据库时所设置的空间参考GeodatabaseSyncTask通过调用 setOutSpatialRef(的SpatialReference)方法。

KmlLayer

KmlLayer是用来加载KML(Keyhole Markup Language)文件(.KML、.kmz)的图层。KML 是一种文件格式,用于在地球浏览器(例如 Google 地球、Google 地图和谷歌手机地图)中显示地理数据。KML 是由开放地理空间联盟(Open Geospatial Consortium, Inc.,简称 OGC)维护的国际标准。

RasterLayer

RasterLayer是用来加载影像的图层。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, 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);

参考资料
1、Layer | ArcGIS Android 10.2.7 API
https://developers.arcgis.com/android/api-reference/reference/com/esri/android/map/Layer.html

如果本文对您有所帮助,且您手头还很宽裕,欢迎打赏赞助我,以支付网站服务器和域名费用。 https://paypal.me/wshunli 您的鼓励与支持是我更新的最大动力,我会铭记于心,倾于博客。
本文链接:https://www.wshunli.com/posts/ee026d20.html