天天看点

地图加载和图层简介

一、地图加载

     1、在线地图加载

在线地图加载我们需要使用到ArcGISTiledMapServiceLayer和ArcGISFeatureLayer两个类,这两个类分别加载地图和feature信息。Feature主要是地图上的数据。简单介绍一下这两个类,以后我们会更详细的进行介绍。

ArcGISTiledMapServiceLayer不能对图层里面的数据进行修改,也不能进行查询一般情况下用来做底图使用。

ArcGISFeatureLayer包含了要素最丰富的信息,其中每个要素都可以被查询和修改,并可以返回json数据,请求需要一定响应时间,不过值得使用。

简单的说了一下之后我们就看看怎么使用吧,代码如下:

没错,就是这么简单,String[0]和String[1]这两个对应的地图路径和服务路径,大家可以自行更改,那个ArcGISFeatureLayer.MODE.ONDEMAND是一种模式,我们一般用快照模式SNAPSHOT,模式下面会有介绍。

这里strings参数可以当做数组来看即可。

public static void LoadMap(MapView mapview,String... strings){
		if(strings!=null&&strings.length<=1){
			return;
		}
		ArcGISTiledMapServiceLayer layer=new ArcGISTiledMapServiceLayer(strings[0]);
		ArcGISFeatureLayer feature=new ArcGISFeatureLayer(strings[1], ArcGISFeatureLayer.MODE.SNAPSHOT);
		mapview.addLayer(layer);
		mapview.addLayer(feature);
	}
           

     2、离线地图加载

离线的地图加载我们需要使用到ArcGISLocalTiledLayer和FeatureLayer。ArcGISLocalTiledLayer是用来添加离线地图的,目前支持两种格式的离线数据,一个是紧凑型的切片缓存,另一个是打包型的tpk文件。FeatureLayer是用来加载离线地图的图层。使用代码如下:

ArcGISLocalTiledLayer layer = new ArcGISLocalTiledLayer("");
		try {
			Geodatabase geodatabase = new Geodatabase("");
			List<GeodatabaseFeatureTable> tables = geodatabase
					.getGeodatabaseTables();
			GeodatabaseFeatureTable table = tables.get(0);
			FeatureLayer geolayer = new FeatureLayer(table);
			mapView.addLayer(layer);
			mapView.addLayer(geolayer);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
           

这里我们看到虽然最后加载的只有layer和geolayer,但是里面还有其他的一些东西,我们来做一下详细的讲解。

Geodatabase是服务或者你自己生成的.Geodatabase文件,这个是你需要加载上去的。但是很多情况下你的Geodatabase文件并不是只有一个table所以你可能需要一个集合去存储他所有的table,这里我只取出第一个图层去加载到地图上,当然你们可能需要加载多个图层,最后我们只要把取出的table赋给FeatureLayer即可,我们将这两个图层加载到mapView即可完成离线地图的加载。事实上我们这里还有很多的不足,比方说我们没有判断这两个文件到底是否存在,我们还没有去设置显示范围没有居中显示等等,这里我们可以简单的说一下。我们来看下面的代码:

mapView.setAnimationCacheEnabled(true);
		mapView.setRotationAngle(263.15d);
		Envelope extext = new Envelope(1.2970841112424135E7, 4873284.380809033,
				1.2982389744966306E7, 4875664.067862199);
		Point point = new Point(1.2980855344071748E7, 4874204.407223808);
		mapView.centerAt(point, true);
		mapView.setMaxExtent(extext);
           

    这里我们看到我们可以设置动画,设置了旋转角度,这个无可厚非,没有什么需要注意的,但是我们这里并没有直接设置setExtent,而是使用的setMaxExtent然后去找一个点居中,当然我们可以通过extent的getCenter方法得到中心点。我们为何多此一举呢。这里其实很多时候我们需要这么做,因为我们一旦使用了setExtent之后我们对这个地图的范围就无法改变了,即使你再怎么去设置extent也不会改变,setExtent是把你的范围固定死了,你如果要切换地图,并且这个地图和你的当前地图不在同一个范围,那你就无法看到你的地图。不明所以,反正arcgis就是这么规定的。这个问题我碰到过,花了很长时间才解决这个坑。所以我们最好使用setMaxExtent这个方法。

二、图层

1、ArcGISTiledMapServiceLayer

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

2、ArcGISDynamicMapServiceLayer

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

3、ArcGISImageServiceLayer

ArcGISImageServiceLayer 图层对应 ArcGIS for Server 服务中的影像服务, 调用影像服务也非常简单,同调用上述服务一样。

4、ArcGISFeatureLayer

        ArcGISFeatureLayer 图层对应 ArcGIS for Server 服务中的 Feature Service, 该图层包含了要素最丰富的信息,因此与其它图层类型相比具有最丰富的功能,其中的每个要素都能被查询,和通过空间查询或者SQL 语句过滤,它继承自 GraphicsLayer,因此也具有该图层的所有操作。该图层可以是空间图层,也可以是非空间的表,它包含了很多要素的信息,每个要素都单独渲染,从 ArcGISServer Feature Service 或者 map service(此种 feature layer 不能编辑)中请求要素,并返回 JSON 格式的数据并绘制。 虽然需要一定的响应时间,如 ArcGIS Server 处理请求的时间,请求返回的时间,渲染速度等,但仍然值得你使用它完成各种丰富的功能。只有 Feature Service 才可以具备在线数据编辑功能,因此,如果想要对某个数据进行在线编辑或同步,需要将其发布成 Feature Service,并在移动端新建一个 ArcGISFeatureLayer 图层以加载该服务。 该图层有一些设定,这些设定能影响图层的性能,包括请求时间,返回大小、处理和响应时间等(设置需要在图层initialized 完成之后进行) 。

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 和一个 featurelayer in selection mode,将需要编辑的 road 选择出来,以简单的符号绘制并存储在 feature layer 以实现编辑,当编辑完成后,清除选择并刷新 dynamic map service 来查看更新。

5、ArcGISLocalTiledLayer

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

6、GraphicsLayer

简介:

        GraphicsLayer 是 ArcGIS Runtime for Android 中比较重要的图层类型,也是使用最为频繁的一个。GraphicsLayer 可以包含一个或多个 Graphic 对象,查询的返回结果和动态标绘的 Graphic 数据都要通过它呈现。建议在 MapView 中添加图层时不要第一个添加该类型的图层, 因为 MapView 加载图层时先要初始化一些地图参数除了可以呈现 Graphic 对象外,它还具备了一些其他有用的功能,如要素更新与要素获取等等, 由类GraphicsLayer 处理, GraphicsLayer 是由应用程序来定义的图层,专门用来绘制有空间参考的要素,并不适合绘制 non-geographical 要素,如指北针或 copyright text。可以用屏幕坐标来查询图层中的要素并且使用getGraphics()方法返回要素,并且支持设置图层比例尺。不推荐在 graphics layer 中存放太多的要素,但是,它有着不错的性能,并且是 feature layer class。

要素更新和添加:

这里一般用作定位使用,因为定位的时候如果我们对GraphicLayer进行先清除再去画点这样是可以实现实时定位,但是那个定位点肯定会一闪一闪的,这里使用更新最好。GraphicLayer每次添加一个点的时候都会设置一个id,这个id是唯一标识的,我们可以通过这个id去更新这个点的位置,这样不会导致一闪一闪的情况。

private boolean isupdata = true;
	private static int uid;

	public void updataPoint(Point point) {
		if (isupdata) {
			uid = gralayer.addGraphic(new Graphic(point,
					new SimpleMarkerSymbol(Color.RED, 20, STYLE.CIRCLE)));
			isupdata = false;
		} else {
			gralayer.updateGraphic(uid, point);
		}
	}
           

好的,今天就先写到这里,写的有点赶工的样子,最近有些忙。先写上去,日后有空再去修改。

继续阅读