手记

ArcGIS Runtime For Android 开发(2)

第二课 空间参考、地图控件、图层
  1. 空间参考
    GIS的空间参考,包含坐标系和其他相关空间属性 。空间参考是用于存储各要素类和栅格数据集,以及其他坐标属性(例如,x,y 坐标的坐标分辨率及可选的 z 坐标和测量 (m) 坐标)的坐标系。如果需要,可使用表示表面高程的 z 坐标为数据集定义一个垂直坐标系。

空间参考是GIS系统的一个数学基础,在中国,最常用的坐标系有北京54、西安80以及现在推荐使用的国家2000坐标系。相关定义可以百度。

目前GPS定位系统采用的是WGS1984坐标系统;但是为了方便发布地图需要,google及国外的大部分web地图提供商,采用的是web墨卡托投影坐标系(参考:http://bbs.rscloudmart.com/forum.php?mod=viewthread&tid=268&extra=page%3D1), 而我国的百度、腾讯、高得等地图提供商使用的是国家经过加密的坐标系,然后地图厂商自己在加一道密的坐标系统;其中有几个常用的坐标系统WKID需要知道:
WGS1984:4326;
web墨卡托:102100;
国家2000经纬度:4490;
西安80经纬度:4610;
如果还需要了解更多的相关知识,请自己查阅相关资料。
这里讲的比较详细:http://blog.csdn.net/mytudousi/article/details/30487409
2.地图控件

MapView 是 ArcGIS Runtime SDK for Android 的核心组件,通过 MapView 可以呈现地图服务的数据,并且在 MapView 中定义了丰富的属性、方法和事件,用户通过 MapView 可以操作地图,默认 MapView 提供了缩放、ping'yi操作。MapView是Android中ViewGroup的子类,也是 ArcGIS Runtime SDK for Android 中的地图容器 。

MapView 可以添加一个或多个图层,图层又分很多种, 并且图层只有添加到 MapView 容器中才会显示。通过 MapView 可以设置地图的显示范围、是否允许被旋转、地图背景、地图的最大/最小分辨率及其指定当前显示的分辨率/比例尺。MapView还 提供了丰富的手势监听接口,通过这些监听器,可以监听各种手势动作,如点击、双击、移动或长按等操作。
在需要使用Map View的地方,请插入如下代码:

<com.esri.android.map.MapView
        android:id="@+id/mapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"  />

3.图层

图层是 GIS 中很重要的概念,图层是空间数据的载体,通过它可将各种类型的地图数据进行加载显示,是几何图形和其对应属性信息的集合。各种图层尤其自己的作用,下图是图层的继承关系图:

ArcGISTiledMapServiceLayer :ArcGISTiledMapServiceLayer 图层用于显示 ArcGIS for Server 服务中的切片数据, 不能对图层中的数据进行更改,除非更新服务缓存。因为是使用服务切出来的PNG格式的图片数据,在 arcgis for android中,无法对此类型的数据查询,常用做底图使用。 因为是缓存数据,这个类型的图层是请求最快的图层之一。
ArcGISDynamicMapServiceLayer :ArcGISDynamicMapServiceLayer 图层用于显示动态地图服务的数据,服务端根据移动设备的屏幕显示范围、地图比例尺返回请求数据,用法与 ArcGISTiledMapServiceLayer 图层相同。

ArcGISDynamicMapServiceLayer图层通常包含多个图层,这些图层由 server 根据请求来渲染并以图片形式返回。其功能特点是更新非常方便,并能及时呈现给用户,同时,图层的可视性和空间参考可以改变,可以给图层添加单独的 layer definition,ArcGIS Server 为每个 image 动态投影。而地图的空间参考是由第一个加载的图层决定

性能特点:它的渲染时间取决于请求数据的数量和复杂度,因此一般都比 tiled map server 要慢,它适合数据经常发生改变、或者需要针对不同的用户呈现不同的数据,且要素信息不需要的情况。
ArcGISImageServiceLayer:ArcGISImageServiceLayer 图层用于显示影像服务数据,示例代码如下:
ArcGISImageServiceLayer iss=new ArcGISImageServiceLayer( "http://myserver/arcgis/rest/services/MyImage/ImageServer",null);
ArcGISFeatureLayer:ArcGISFeatureLayer 显示Feature Service提供的数据,与其它图层类型相比具有最丰富的功能,其中的每个要素都能被查询,和SQL 语句过滤,继承自 GraphicsLayer。

该图层可以是空间图层,也可以是非空间的表,它包含了很多要素的信息,每个要素单独渲染,从 ArcGIS Server Feature Service 或者 map service(此种 feature layer 不能编辑)中请求要素,并返回 JSON 格式的数据并绘制。加载速度就相对较慢。

只有 Feature Service 才可以具备在线数据编辑功能,如果想要对某个数据进行在线编辑或同步,需要将其发布成 Feature Service,并在移动端新建一个 ArcGISFeatureLayer 图层以加载该服务。该图层有一些设定,这些设定能影响图层的性能,包括请求时间,返回大小、处理和响应时间等(设置需要在图层initialized 完成之后进行)。
ArcGISFeatureLayer 在可以设置 3 种模式(mode),不同模式返回数据的方式和执行的效率不同:
Snapshot mode : 快照模式能从 server 上快速取回要素,能减少响应时间,但如果图层包含大量、复杂的要素时,可能会导致设备停止响应,因为有大量的要素需要绘制,也会导致 arcgis server 达到它返回要素数量的上线。 Arcgis server 9.3.1的默认限制是500,10.0是1000,当然,这个数据可以在server端进行配置。建议小数据量的dataset才使用 snapshot mode。
On demand mode : On demand mode 需要在客户端和服务器之间传递更多的请求,适合展示变化的数据,该 mode 适 合包含复杂要素的大数据量的 dataset,因为它只请求和返回需要的要素,不过,为图层设置比例尺限制仍然是有必要的。
Selection mode : 该模式下,一开始并不向服务器请求任何要素,只有当选择集出现时,要素才被加载,这种 mode适合于不需要将所有要素展示在客户端,而只是强调一些特殊的要素,如,有一个 road 图层,使用了 feature layer 不支持的自定义的符号,但是又需要对该图层进行 web edit,此时,你可以使用一个 dynamic map service layer 和一个 feature layer in selection mode,将需要编辑的 road 选择出来,以简单的符号绘制并存储在 feature layer 以实现编辑,当编辑完成后,清除选择并刷新 dynamic map service 来查看更新。

String url = 
"https://servicesbeta.esri.com/ArcGIS/rest/services/SanJuan/TrailConditions/FeatureS
erver/0"; 
MapView mv = new MapView(this); mv.addLayer(new ArcGISFeatureLayer(url,MODE.SNAPSHOT));//按照快照方式 setContentView(mv); 

ArcGISLocalTiledLayer:ArcGISLocalTiledLayer 是用来添加离线数据包的图层,该图层目前支持两种格式的离线数据:一个是紧凑型的缓存切片,另一个是打包的 tpk 格式的数据。

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

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

MapView mv = new MapView(this); 
 mv.addLayer(new GraphicsLayer());//可以看到,创建GraphicsLayer无需任何参数  setContentView(mv); 

除了可以呈现 Graphic 对象外,它还具备了一些其他有用的功能,如要素更新与要素获取等等,由类
GraphicsLayer 处理,GraphicsLayer 是由应用程序来定义的图层,专门用来绘制有空间参考的要素,并不适合绘制 non-geographical 要素,如指北针或 copyright text。可以用屏幕坐标来查询图层中的要素并且使getGraphics()方法返回要素,并且支持设置图层比例尺。

不推荐在 graphics layer 中存放太多的要素,但是,它有着不错的性能,并且是 feature layer class的基类,如果必须要处理大量的要素,建议使用 feature collection 来存储在 feature layer 中。

BingMapsLayer:ArcGIS Runtime for Android中也可以添加Bing地图服务,首先必须注册账户并获取Bing map的App ID,有了这个 ID 就有了使用 Bing 地图的权限,具体的账户申请和操作步骤可以参照以下地址:
地址:https://www.bingmapsportal.com/
详细说明:http://msdn.microsoft.com/en-us/library/ff428642.aspx
<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>
将申请的 ID 填入上面代码 appId 属性即可正常访问 Bing 地图服务。
参考资料:ArcGIS for Android 2.0开发教程基础版 崔福东、汤怀玉 、刘升容

0人推荐
随时随地看视频
慕课网APP